初始函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(x,y): pass func(3,y=4)
1,函数的定义和调用
def 函数名():
函数体
调用函数:函数名()
2,函数的返回值
a,没有返回值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(): print(666) func()
不写return,会默认返回None
只写return,也会返回None
函数在调用的过程中一旦遇到return,就会结束整个函数。
b,返回一个值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(n): return n f=func(3) print(f)
c,返回多个值
1,返回的多个值会被组织成元组被接收
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(m,n) return m,n f=func(2,3) print(f)
2,多个值接收
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(m,n): return m,n a,b=func(2,3) print(a,b)
函数的参数
形参与实参
在定义函数是,写在括号里的变量名,就是形参
在调用函数的时候,写在括号里的参数,就是实参
位置参数
站在实参的角度上
1,按照位置传参
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(x,y): pass func(1,2)
2,按照关键字传参
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(x,y): pass func(y=1,x=2)
3,位置参数和关键字参数混合用
a,位置参数必须在关键字参数的前面
b,对于一个形参只能赋值一次
站在形参的角度上
位置参数必须传值
默认参数
一般将变化比较小的参数设成默认参数
动态参数
给函数传的参数很多,不定个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(*args,**kwargs): print(args,kwargs) f=func(1,2,3,4,a=1,b=2,c=3)
传参顺序:位置参数,*args,默认参数,**kwargs
函数的命名空间:
全局命名空间
局部命名空间
内置命名空间
三种命名空间的加载和取值顺序:
加载顺序:内置命名空间(程序运行前加载)》》》全局命名空间(程序运行时:从上到下加载)》》》局部命名空间(程序运行时:调用时加载)
取值顺序:
在局部调用时:局部命名空间 》》》 全局命名空间 》》》 内置命名空间
在全局调用时:全局命名空间 》》》 内置命名空间
从小范围,一层一层到大范围去寻找
作用域
全局作用域:内置名称空间,全局名称空间
局部作用域:局部名称空间
globals(),locals()
global关键字
1,声明全局变量
2,在局部变量想要修改全局作用域的全局变量时用global
仅限于int,str
对可变数据类型(list,dict,set)可以直接引用,不用修改
nonlocal关键字
1,不能修改全局变量
2,在局部作用域中,对父级作用域的变量进行引用和修改,并且引用到哪层,从那层及以下的变量全部发生修改。