Python 函数
函数
说明:函数是以功能为导向,封装单一功能的代码块,能够被调用执行
优点:函数能够降低代码的重复率
提高代码的可读性
函数的定义:
def fun():
函数体
函数的调用:
fun()
函数被调用了多少次,函数就执行多少次
函数的返回值:
通过return关键字将函数体的结果返回给函数的执行者
return的作用:
1. 结束函数
2. 函数中没有或者只有一个return 函数返回一个None给函数执行者
3. return后面有一个值得时候,函数执行知将得到这个值(不会改变数据类型)
4. return后面跟多个值得时候,多个值组成元组后返回给函数执行者
函数传参: 实际就是实参传给形参的行为过程
形参:定义函数时括号中的参数,用于接收调用函数时传过来的实参
分类:
位置参数 从左至右 按照顺序 一一对应
默认参数 一定要在位置参数的后面,不传实参默认使用形参的默认参数
动态参数
仅限关键字参数
实参:代用函数时指定的参数,用于传给函数中的形参供函数体使用
分类:
位置参数 从左至又 一一对应
关键字参数 一一对应
动态参数 关键字参数一定要在位置参数后面 一一对应
动态参数:*args **kwargs
*args : 能够接收实参角度的所有位置参数,得到一个元组存储到args中
**kwargs : 接收实参角度的所有关键字参数,得到一个字典存储在kwargs中
# def eat(food1,food2,food3):
# print(f'我请你吃:{food1},{food2},{food3}')
# eat('蒸羊羔','蒸熊掌','蒸鹿尾')
# 当给函数传入的参数数目不定时,之前的传参方式解决不了问题。
# 万能参数,动态参数。 *args
# def eat(food1,food2,food3):
# print(f'我请你吃:{food1},{food2},{food3}')
# eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')
def eat(*args): # 将实参角度:定义一个函数时,* 所有的位置参数聚合到一个元组中。
print(args)
print(f'我请你吃:{args}')
eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')
*的魔性用法
-
函数中的打散和聚合
在函数的定义时 *起到的是聚合的作用
在函数的执行时 *起到的是打散的作用
-
处理剩下的元素
a,*b = (1, 2, 3, 4,)
print(a, b) # 1 [2, 3, 4]
*rest,a,b = range(5)
print(rest, a, b) # [0, 1, 2] 3 4
print([1, 2, *[3, 4, 5]]) # [1, 2, 3, 4, 5]
形参角度的最终顺序
位置参数,*args,默认参数,**kwargs (仅限关键字参数在*args和**kwargs之间,和默认参数的位置不冲突)
原因:
-
动态参数*args不能放在位置参数之前,这样位置参数就接收不到任何实参了,都被*args抢去了
-
动态参数*args一定要在默认参数之前,因为放在默认参数后面就没法使用默认参数的默认值了
-
动态参数**kwargs一定要放在默认参数之后,如果在默认参数之前会报错,因为默认参数的值永远改变不了
第四种传参方式:仅限关键字参数
仅限关键字参数是python3x更新的新特性,他的位置要放在*args后面,kwargs前面(如果有kwargs),也就是默认参数的位置,它与默认参数的前后顺序无所谓,它只接受关键字传的参数
也可以把它当成没有默认值的默认参数,只接受关键字参数,不传就会报错
从空间角度研究函数
全局名称空间: py文件运行时开辟的,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失。
临时(局部)名称空间: 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失。
内置名称空间:存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
加载顺序(三个空间加载到内存的顺序)
内置命名空间(程序运行伊始加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载
取值顺序:(就近原则)取值顺序就是引用一个变量,先从哪一个空间开始引用
取值顺序满足的就近原则,从小范围到大范围一层一层的逐步引用。
作用域
作用域就是作用范围, 按照生效范围来看分为全局作用域和局部作用域
全局作用域:全局名称空间,内置名称空间。
局部作用域:局部名称空间。
内置函数:globals,locals
globals(): 以字典的形式返回全局作用域所有的变量对应关系。
locals(): 以字典的形式返回当前作用域的变量的对应关系。
高阶函数(嵌套函数)