自学Python3.1-函数基础
自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django
一、函数概述
1. 简介
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。
2. 组成
- 函数代码块以 def 关键词开头,后接函数名和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数主体部分:函数内容以冒号起始,并且缩进。
- 函数结束部分:return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
def functioname函数名(parameters参数)
" 文档字符串 "
函数体
return()返回值
3. 简单调用
以上边的示例为例,调用方法很简单执行如下代码。
functionname(参数)
注意,函数定义好之后,并不会运行。只有在调用的时候会运行。
def cal():
n=123
n+=1
print(n)
cal() #执行函数
c=cal # 变量C指向函数cal
c() # 同cal()一样
输出
124
124
二、函数组成部分
2.1 函数的命名
函数名应该为小写,可以用下划线风格单词以增加可读性。如:myfunction,my_example_function。
Python之父Guido推荐的命名规范包括如下几点:
①模块名和包名采用小写字母并且以下划线分隔单词的形式;
②类名采用以大写字母开头,并且以大写字母分隔单词的形式命名;
③全局或者类常量,全部使用大写字母,并且以下划线分隔单词;其余变量命名则是采用全部小写字母,并且以下划线分隔单词的形式命名。
④以上的内容如果是内部的,则使用下划线开头命名。
2.2 函数参数
形参:def函数后面的变量,()内的变量
实参:调用函数时候用的值,也叫参数
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def mail(user):
ret=True
try:
msg = MIMEText('邮件内容', 'plain', 'utf-8')
msg['From'] = formataddr(["carlos", 'carlos@126.com'])
msg['To'] = formataddr(["carlos_chiang", user])
msg['Subject'] = "主题"
server = smtplib.SMTP("smtp.126.com", 25)
server.login("carlos@126.com", "邮箱密码")
server.sendmail('carlos@126.com', [user, ], msg.as_string())
server.quit()
except Exception:
ret=False
return ret
ret=mail('422417945@qq.com')
ret=mail('422417946@qq.com')
ret=mail('422417947@qq.com')
if ret:
print('发送成功')
else:
print('发送失败')
通过定义参数,可以给3个人发送邮件,简化了代码。
参数如何使用?
①无参数def show():
show()
②一个参数def show(arg)
show('aaaa')
③二个参数def show(arg,chr)
show('aaaa','bbbbb') (若只赋值一个参数,会报错)
.......
函数的参数分为三类:默认参数、指定参数、可变参数
2.2.1 默认参数 必须放置在最后
1. 在函数中默认参数赋值a, 在函数外若该参数无赋值,将直接采用赋值a ;
2. 在函数中默认参数赋值a,在函数外若该参数赋值b,将采用赋值b
def show(a,b=100): # 默认参数b=100 这种写法错误def show(a=111,b):
print(a,b)
show(200) # 只有一个赋值,默认是给第一个赋值
输出200 100
def show(a,b=100):
print(a,b)
show(200,300)
输出200 300
2.2.2 指定参数
def functionname(name,age=18):
print("I'm %s, age %s" % (name, age))
functionname(age=26,name="carlos") #上述默认age参数为18,如果这里不指定age的话,默认会使用18,但是如果我们指定参数的话,优先会执行我们指定的参数值。
输出 I'm carlos, age 26
2.2.3 可变参数
2.2.3.1 可变参数 * 把所有赋值的参数变成元素
举例1
def function_name(*args):
print(args, type(args))
function_name(1)
function_name(1,2,3)
输出
(1,) <class 'tuple'>
(1, 2, 3) <class 'tuple'>
由此可以看出,默认将传入的参数,全部放在元组中,即args = (...),在执行()的时候,会进行tuple.__init__方法。
举例2
def function_name(*args):
print(args, type(args))
function_name(1,2,3)
function_name(*'wzg')
function_name(*['jack','tony'])
从此可以看出,可以看出带*的参数,会循环变量中的每个元素加入至tuple中。字符串的话循环每个字母。如果传入的是个列表或者元组,返回的是列表,元组中的每个元素。class类型都是作为'tuple'返回。
举例3
def function_name(*args):
for name in args:
print(name,type(name))
function_name('liupeng','jack',11,22,['a','b','c'])
输出
liupeng <class 'str'>
jack <class 'str'>
11 <class 'int'>
22 <class 'int'>
['a', 'b', 'c'] <class 'list'>
基于*args案例的基础上添加了for循环语句,循环的是args中的每个元素并显示元素的类型。从上例可以看出*接收的不光可以是一个字符串,还可以是数字或者列表。
2.2.3.2 可变参数 ** 把所有赋值的参数变成字典, 参数的格式必须是有key value
举例1
def function_name(**args):
print(args,type(args))
function_name(name = 'wzg',job = "IT") #key1=name value=wzg key2=job value=IT
输出
{'name': 'wzg', 'job': 'IT'} <class 'dict'>
举例2
dic = {'k1':'v1','k2':'v2'}
def function_name(**dic):
print(dic)
function_name(**dic)
输出
{'k1': 'v1', 'k2': 'v2'}
举例3
dic = {'k1':'v1','k2':'v2'}
def function_name(**dic):
print(dic)
function_name(di=dic)
输出
{'di': {'k1': 'v1', 'k2': 'v2'}}
分析以上3个例子的结果:
①函数本身不用多说,当我们在第一次调用函数时因为参数我们指定了(name跟job的)参数因此打印时候直接输出了字典keys为name跟job,values为wzg,IT即 {'name': 'wzg', 'job': 'IT'} <class 'dict'>。
②在第二次调用函数时,会发现我们这次调用函数()中传的参数也是**的方式。这里提前创建了一个dic的字典并把它作为函数的参数使用。结合**的用法,使得字典中每个元素作为参数传到函数中被调用。
即{'k2': 'v2', 'k1': 'v1'} <class 'dict'>。
③最后一次调用函数时,我们参数是这么指定的(di = dic),这里可以看出跟1的使用方法相同。对了,没错。这次只不过是我们把整个dic作为了字典中的values来传入函数了而di做为了字典中的key。即
{'di': {'k2': 'v2', 'k1': 'v1'}} <class 'dict'>
总结:上面1-3不管那一种的类型最终都是<class 'dict'>也就是说**args,或者**其他什么变量最终生成的结果都是以字典的方式呈现。而*args最终都是以元组的方式呈现。
2.2.3.3 可变参数 * ** (两个一起使用)
①必须* 在前 ,**在后
②赋值的时候必须元组在前,字典在后
def show(*args,**kwargs):
print(args,type(args))
print(kwargs,type(kwargs))
show(11,22,33,44,n1=88,carlos='boy')
def show(*args,**kwargs):
print(args,type(args))
print(kwargs,type(kwargs))
i=[11,22,33,44]
j={'n1':88,'carlos':'boy'}
show(*i,**j)
以上均输出
(11, 22, 33, 44) <class 'tuple'>
{'n1': 88, 'carlos': 'boy'} <class 'dict'>
def show(*args,**kwargs):
print(args,type(args))
print(kwargs,type(kwargs))
i=[11,22,33,44]
j={'n1':88,'carlos':'boy'} #如果这样定义,相当于将i,j都放到args中,结果导致kwargs 字典为空
show(i,j)
输出
([11, 22, 33, 44], {'n1': 88, 'carlos': 'boy'}) <class 'tuple'>
{} <class 'dict'>
2.3 函数注释
Python有一种独一无二的的注释方式: 使用文档字符串. 文档字符串是包, 模块, 类或函数里的第一个语句.。这些字符串可以通过对象的__doc__成员被自动提取, 并且被pydoc所用。
函数注释包含以下几个部分:
1.整体功能说明 2.输入参数说明 3.输出/返回值说明 4.异常说明 5.其他
2.4 函数主体
函数主体部分就是代码逻辑的实现/处理过程。
2.5 函数返回值
①函数返回值是一个可选的选项,可以返回一个表达式、某种数据结构等
②默认返回None输出
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def mail():
ret=True
try:
msg = MIMEText('邮件内容', 'plain', 'utf-8')
msg['From'] = formataddr(["carlos", 'carlos@126.com'])
msg['To'] = formataddr(["carlos_chiang", '422417945@qq.com'])
msg['Subject'] = "主题"
server = smtplib.SMTP("smtp.126.com", 25)
server.login("carlos@126.com", "邮箱密码")
server.sendmail('carlos@126.com', ['422417945@qq.com', ], msg.as_string())
server.quit()
except Exception:
ret=False
return ret
ret=mail()
print(ret)
输出
False (原因为‘邮箱密码’,若输入正确密码,则输出为True)
在函数或者类中,若出现return,后续代码不执行。
def show():
print('a')
return([11,22])
print('b')
s=show()
输出a
三、断点调试,查看代码执行顺序
1. 在左侧设置断点
2. 如果使用断点,采用debug模式运行
3. 一步一步执行代码,,单击console查看输出结果
自学Python3.1-函数基础的更多相关文章
- 自学Python3.3-函数分类(内置函数补充)
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python3.4-函数分类(匿名函数)
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python3.2-函数分类(内置函数)
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python3.2-函数分类
函数的分类 内置函数,自定义函数,匿名函数 一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html ...
- 自学python3随笔--连接数据库和写EXCEL文件实现
近日在自学python3,选择python,是由于它命令比较简单,语法也不算复杂,对我来说,要实现的功能用100行语句就能够实现.另外,一个原因,它是脚本形式的,调试比较方便,对我这些有很长时间没有写 ...
- Python3学习(1)-基础篇
Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 安装(MAC) 直接运行: brew install python3 输入:python3 --v ...
- 自学Python3.6-算法 二分查找算法
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- Python3 与 C# 基础语法对比(Function专栏)
Code:https://github.com/lotapp/BaseCode 多图旧版:https://www.cnblogs.com/dunitian/p/9186561.html 在线编程: ...
- Python3.x:基础学习
Python3.x:基础学习 1,Python有五种标准数据类型 1.数字 2.字符串 3.列表 4.元组 5.字典 (1).数字 数字数据类型存储数字值.当为其分配值时,将创建数字对象. var1 ...
随机推荐
- JS中有关正则表达式的一些常见应用
总所周知,正则表达式主要用于字符串处理.表单验证等,简单的代码量实现复杂的功能 1.身份证号码的一个校验 先做一个简单的位数校验来判断身份证的合法性:(15位数字或18位数字或17位数字加X|x) v ...
- 基于Visual Studio 2010 阐述C#4个特性
Csharp4.0与以往版本基础体现了强大的性能优势,主要体现在以下四个方面: 1. 通过委托成员来实现接口 在C# 4.0中可以通过委托来实现某个成员的接口,例如下面的代码: public clas ...
- C#中获取当前系统中安装的所有字体及预定义颜色
需要引用命名空间using System.Drawing.Text;.... //获取系统字体:InstalledFontCollection fc = new InstalledFontCollec ...
- 雅虎公司C#笔试题及参考答案
Question 1. (单选) 在计算机网络中,表征数据传输可靠性的指标是——21. 传输率2. 误码率3. 信息容量4. 频带利用率Question 2. (单选) 以下关于链式存储结构的叙述中哪 ...
- Python mysqldb模块
#!/usr/bin/env python2.7 #-*- coding:utf8 -*- import os import sys import logging import MySQLdb fro ...
- 《Linux命令行与shell脚本编程大全》第十二章 使用结构化命令
许多程序要就对shell脚本中的命令施加一些逻辑控制流程. 结构化命令允许你改变程序执行的顺序.不一定是依次进行的 12.1 使用if-then语句 如下格式: if command then ...
- Java 浏览器兼容模式
现在设计的东西,很多浏览器不兼容.下面贴出代码.测试在360和IE浏览器下,可以兼容的 <!doctype html><html><head> <met ...
- eclipse搭建maven ssm项目
file --> new --> maven project -->创建个简单的maven项目 会报错,没事 右键 properties 先去掉,然后再勾上 接下来配置maven的相 ...
- jq获取被选中的option的值。jq获取被选中的单选按钮radio的值。
温故而知新,一起复习下jq的知识点. (1) jq获取被选中的option的值 <select id="select_id"> <option value=&qu ...
- 在动态链接库dll中弹出对话框
在动态链接库dll中弹出对话框步骤: 1.添加Dialog资源,然后在资源视图的对话框界面右击添加类,输入类名MyDlg,使得其继承与CDialogEx.(继承CDialog应该也可以)2.在新生成的 ...