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