一.函数:对功能或者动作的封装
语法:
def 函数名(形参列表):
函数名(代码块,return)
函数名(实参列表)
形参:在函数声明的位置是形参(变量)
实参:在函数调到的时候给函数的形参传递的信息(值)
传参:把实参的交给形参的过程
返回值:
return 可终止一个函数的运行
1.什么都不写,不写return 返回None
2.写了return 不写值返回None
3.return有一个值返回一个值
4.return有多个值返回多个值
参数:
形参:
1.位置参数
2.默认值参数
3.动态传参
实参:
1.位置参数
2.关键字参数
3.混合参数:先位置后关键字
#在Python函数中,传递的参数如果默认有一个为列表(list),那么就要注意了,此处有坑!!
def f(x,li=[]): for i in range(x): li.append(i*i) print(li) print('---1---') f(4) print('---2---') f(5)
预期结果
---1--- [0, 1, 4, 9] ---2--- [0, 1, 4, 9, 16]
实际结果
---1--- [0, 1, 4, 9] ---2--- [0, 1, 4, 9, 0, 1, 4, 9, 16]
当定义函数时,会保存函数中默认参数 list 的值,也就是列表 li=[],在每次调用的时候如果传递了新的列表,则使用传递的列表,但这里没有传递新列表,使用定义函数时保存的默认参数(li=[]),由于列表是可变的数据类型,所以列表在第一次append的时候会在 li=[] 原来的基础上append追加值,所以第二次执行的时候是带着追加的内容进去的,因此会产生以上结果.
函数动态传参
1.*args 位置参数动态传参(*args最终得到的结果是元组)
2.**kwargs 关键字参数动态传参(**kwargs最终得到的结果是字典)
顺序:位置参数,*args,默认值,**kwargs
什么都参数都可以接
def func(*args,**kwargs): pass
形参的位置*,**:聚合
实参的位置*,**:打散
命名空间
1.内置名称空间:存放python解释器为我们提供的名字
2.局部命名空间:在函数中声明的变量会放在局部命名空间
3.全局命名空间:在py文件中,函数外声明的变量属于全局命名空间
作用域:
1.全局作用域:内置+全局
2.局部作用域:局部
globals() 查看全局中的内容
locals() 查看当前作用域中的内容
global:在局部访问全局中的内容
nonlocal:在局部寻找外层函数中离他最近的那个变量