( 源自:https://www.cnblogs.com/zhaoyang1997/p/10427650.html)
函数的用法
1. 什么是函数
函数是一段被预定义,并可以被反复执行的 语句块
预定义:提前被声明好
反复执行:可以被反复使用
语句块:多条语句被封装到一起
2. 作用
1.用于封装语句块,提高代码的重用性
2.定义用户级别的功能
3. 语法
def 函数名(形参列表):
语句块
说明:
1.函数的名字中,往往包含了它的功能
2.函数名的命名规则与变量名相同(标识符)
3.函数名是一个变量(不要轻易对其赋值)
4.函数有自己的名字空间,在函数外部是不可以访问函数内部的变量的,在函数的内部是可以访问函数外部的变量,可以修改此变量
5.函数如果不需要传参的话,形参列表处什么也不写(只剩下空括号)
6.语句块如果为空,需要写 pass
4. 函数的调用
函数名(实参列表)
实参:实际参数
5. 带参的方法
1. 声明
def show_name(name):
# name : 函数要用到的外部的数据
print("您的姓名是:",name)
2. 调用
show_name("张三丰")
6. 函数的返回值 return 语句
1. 什么是返回值
函数结束调用后,要返回给函数调用者的的结果
2. 语法
return [表达式]
注:[表达式] 可以省略不写
3. 说明
1. return 语句 或 后面的表达式都可以省略,省略后相当于是return None
2. 任何函数调用后,都有返回值
如果函数有返回值:则得到对应的返回值
如果函数没有返回值:则得到的就是None
4. 返回值如果返回一个序列的话,可以在函数调用处用多个值接收,也可以用一个元组变量接收
7. 函数的参数传递
1. 传递方式
1. 位置传参
序列传参
2. 关键字传参
字典传参
2. 位置传参
实际参数(实参)的对应关系与形式参数(形参)的对应关系是按照位置来依次对应的
def sum(a,b,c):
pass
sum(1,2,3)
说明:
1. 形参和实参是通过位置进行传递和匹配的
2. 实参的个数必须与形参的个数相同
3. 序列传参 位置传参
序列传参是指在函数调用过程中,用 * 将序列拆解后,按位置进行传递的传参方式
语法:
1. 以序列作为实参的值传递给函数
序列:列表,元组,字符串
2. 在序列前,用 * 表示是序列传参
def show(a,b,c):
pass
show( * ["AAA","BBB","CCC"] )
4. 关键字传参
关键字传参是指传参时,按照形参的名称给形参赋值
形参和实参是按照名称进行匹配的
5. 字典关键字传参 - 关键字传参
字典关键字传参是指实参为字典,将字典用 ** 拆解后,再进行关键字传的一种方式
说明:
1. 字典的键名和形参名必须一致
2. 字典的键名必须为字符串
3. 字典的键名在形参中必须存在
6. 函数的综合传参
函数的传参方式在能确定形参能唯一匹配到相应的实参的情况下,任意组合
说明:
位置传参(序列传参) 在要 关键字传参(字典关键字传参) 的左侧
示例:
def show(a,b,c):
pass
#有以下调用方式
show(100,200,300)
show(100,*[200,300])
show(*(100,200),300)
show(*[100],200,*(300,))
show(100,c=200,b=300) # 正确
show(300,a=200,b=100) # 错误
show(c=200,b=300,100) # 错误
show(100,**{'c':300,'b':200}) # 正确
8. 函数的缺省参数
声明函数的时候,可以为形参指定默认值,在调用函数的时候,有默认值的参数可以不传参
语法:
def 函数名(形参名1=默认值1, 形参名2=默认值2, ...):
pass
注意:
缺省参数必须自右至左依次存在,如果一个参数有缺省值得话,那么其右侧的所有参数都必须是缺省值
def fun1(a, b=10, c):
pass
以上声明是错误的
def fun1(a, c, b=10):
pass
以上声明时正确的
9. 函数形参的定义方式
1. 位置形参
2. 星号元组形参
3. 命名关键字形参
4. 双星号字典形参
1. 位置形参
语法:
def 函数名(形参名1, 形参名2, ...):
语句块
2. 星号元组形参
1. 作用
收集多余的位置传参
2. 语法
def 函数名(*元组形参名):
语句块
3. 命名关键字形参
1. 作用
强制所有的参数都必须使用关键字 或 字典关键字 传参
2. 语法
def 函数名(*, 命名关键字形参):
语句块
或
def 函数名(*args, 命名关键字形参):
语句块
4. 双星号字典传参
1. 作用
收集多余的关键字参数到一个字典中
2. 语法
def 函数名(**字典形参名):
pass
注意:字典形参名通常都会被命名为 kwargs
5. 函数的参数说明
位置参数,缺省参数,星号元组形参,双星号字典形参 可以混合使用
函数的形参从左至右的顺序如下:
位置形参
星号元组形参
命名关键字形参
双星号字典传参
示例:
def func(a, b, *args, c, **kwargs):
pass
func(100,200,300,400,c="China",d="D", j="Japan")
这里:
a = 100
b = 200
args = (300,400)
c = "China"
kwargs = {
'd' : 'D',
'j' : 'Japan',
}
6. 函数的不定长 参数
1. 作用
可以接收任意的位置传参和关键字传参
2. 语法
由 星号元组形参 和 双星号字典形参 共同组成
def func(*args,**kwargs):
pass
func(100,200,300)
func(name='zsf',age=35,gender='男')
func(100,200,name='zwj',age=35)
10
1. 局部变量 - local variable
1. 定义在函数内部的变量就是局部变量
2. 函数的形参也是局部变量
3. 局部变量只能在函数内部使用
4. 局部变量在函数调用时才会被创建,调用之后会自动销毁?
2. 全局变量 - global variable
1. 定义在函数外部,模块(xx.py)内部的变量就是全局变量
2. 所有的函数都可以访问全局变量,但函数内不能直接赋值(需要专门声明)
3. globals() / locals() 函数
globals() 返回当前全局变量所组成的字典
locals() 返回当前局部变量所组成的字典
11
1. 函数名是变量,它在 def 语句创建函数时,绑定一个函数
2. 一个函数可以作为另一个函数的实参进行传递
def myinput(fn):
L = [1,3,5,7,9]
return fn(L)
print(myinput(max)) # 相当于 max([1,3,5,7,9])
print(myinput(min)) # 相当于 min([1,3,5,7,9])
print(myinput(sum)) # 相当于 sum([1,3,5,7,9])
函数的嵌套定义时,指一个函数里面用 def 语句来创建其他的函数的情况
12
1. 什么是作用域
作用域也叫名字空间-namespace, 是访问变量时查找变量名的访问空间
2. Python四个作用域
作用域 英文解释 英文缩写
1. 局部作用域(函数内) Local(function) L
2. 外部嵌套函数作用域 Enclosing function locals E
3. 函数定义所在模块作用域 Global(module) G
4. Python内建模块的作用域 Builtin(Python) B
变量的查找规则:
访问变量时:
首先去局部作用域中查询(搜索本地变量)
其次在外部嵌套函数作用域内查找(包裹此函数的外部函数内)
之后在函数定义所在模块作用域查找(全局变量)
最后在Python内建模块作用域中查找(内建变量)
即:L ---> E ---> G ---> B
默认情况下,使用变量时从当前所在的作用域中查找
3. global 语句
作用:
1. 告诉解释器,global 语句声明的一个或多个变量的作用域为模块级作用域,也就是全局变量
2. 全局声明(global)将赋值语句操作的变量映射到模块文件内部的作用域

