函数python
说明:函数是以功能为导向,封装单一功能的代码块,可以被调用执行函数
优势:函数可以下降代码的重复率spa
提升代码的可读性3d
函数的定义:rest
def fun():内存
函数体作用域
函数的调用:it
fun()class
函数被调用了多少次,函数就执行多少次变量
函数的返回值:
经过return关键字将函数体的结果返回给函数的执行者
return的做用:
1. 结束函数
2. 函数中没有或者只有一个return 函数返回一个None给函数执行者
3. return后面有一个值得时候,函数执行知将获得这个值(不会改变数据类型)
4. return后面跟多个值得时候,多个值组成元组后返回给函数执行者
函数传参: 实际就是实参传给形参的行为过程
形参:定义函数时括号中的参数,用于接收调用函数时传过来的实参
分类:
位置参数 从左至右 按照顺序 一一对应
默认参数 必定要在位置参数的后面,不传实参默认使用形参的默认参数
动态参数
仅限关键字参数
实参:代用函数时指定的参数,用于传给函数中的形参供函数体使用
分类:
位置参数 从左至又 一一对应
关键字参数 一一对应
动态参数 关键字参数必定要在位置参数后面 一一对应
*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(): 以字典的形式返回当前做用域的变量的对应关系。