目录
一、可变长参数
*形参
调用函数时,用元组接收多余的位置实参
def f1(*args): 一般约定俗成用args来做形参的变量名
print(args)
**形参
调用函数时,用字典接收多余的关键字实参
def f1(**kwargs): # 一般约定俗成用kwargs来做*形参的变量名
print(kwargs)
*实参
传参时,把列表中的元素打散成位置实参然后依次传给位置形参
def f1(a, b, c, e, d, f, g):
print(a, b, c, e, d, f, g)
lt = [1, 2, 3, 4, 5, 6, 7]
f1(*lt)
**实参
传参时,把字典中的元素打散成关键字实参然后依次传给位置形参
def f1(z, b):
print(z, b)
dic = {'z': 1, 'b': 2} # a=1,b=2
f1(**dic)
二、函数对象
python中一切皆对象
函数也是一种对象
函数对象 = 函数名
函数名+() 就是在调用,就是在调用
引用(拷贝)
def f1():
print('from f1')
func = f1
print('f1:', f1)
print('func:', func)
func()
容器元素
def f1():
print('from f1')
lt = [f1, 1, 2, 3]
print('lt[0]', lt[0])
print('f1', f1)
lt[0]()
作为函数的实参
def f1():
print('from f1')
def f2(f2_f1):
print('f2_f1',f2_f1)
f2_f1()
f2(f1)
作为函数的返回值
def f1():
print('from f1')
def f2(f2_f1):
return f2_f1
res = f2(f1) # 即res = f1
print('res', res)
print('f1', f1)
res()
三、函数嵌套
函数嵌套 :函数里面有函数
定义函数时,只检测语法,不会执行代码
函数内部定义的函数,外部不能用
四、名称空间和作用域
名称空间的执行(生成)顺序
- 内置内置名称空间:python解释器启动的时候就有了
- 全局名称空间:执行文件代码的时候才会有全局
- 局部名称空间:函数调用的时候才会有局部
搜索顺序
先从当前所在位置寻找,找不到再按照这种顺序,不会逆着方向寻找
局部 --》 全局 --》 内置 --》 报错
名称空间
内存中专门用来储存名称的空间
内置名称空间
储存了内置方法的名称的空间
全局名称空间
除了内置和局部都叫全局
局部名称空间
函数内部定义的都叫局部
作用域
全局作用域
内置名称空间+全局名称空间 = 全局作用域
局部作用域
局部名称空间 = 局部作用域
局部作用域的特点
- 全局作用域的 x 和局部作用域的 x 没有半毛钱的关系
- 局部作用域1的x和局部作用域2的x也没有任何关系,即使局部作用域1和局部作用域2再同一个局部作用域下