一、函数名的用法
打印函数名可以得到函数的内存地址
def func(): pass print(func)
函数名可赋值给变量:
def func(): print(1) a = func
函数名可放入容器类数据类型里:
def func(): print(1) def func2(): print(2) li = [func,func2] print(li)
函数名可以当做返回值返回给调用者
def func():
def aa():
print(2)
return aa
func()()
二、闭包
在嵌套函数里,当内层函数调用非全局的外部函数的变量时,我们就称这个内层函数为闭包。
如下,函数inner就是一个闭包。
def wrapper(): money = 10 def inner(num): nonlocal money money += num print(money) return inner wrapper()(100)
判断是不是闭包的方法:print(函数名.__closure__)若打印结果为None就不是闭包
闭包的优点:使用闭包, 可以保证外层函数中的变量在内存中常驻
闭包的缺点:内存溢出
三、迭代器
可迭代对象:满足python的可迭代协议,即内部具有__iter__()函数
迭代器:内部包含__iter__()函数与__iter__()函数
迭代器特性:
- 惰性机制
- 单向运行
- 随用随删
for循环其实就是利用了迭代器
li = [1, 2, 3, 4, 6, 7, 87, 8, 9, 90, 0, 0, 0, 0, 8, 7, 7, 67, ] em = li.__iter__() while 1: try: print(em.__next__()) except StopIteration: break
try语句是python排错语句,具体解释详见:
四、递归
def func(n): n+=1 print(n) if n == 5: return func(n) func(2)
递归默认层次:官方说明1000,实际测试998/99
递归的效率比较低,尾递归的用时 和 for的用时 是一样的,比for慢
递归的应用场景:在我们不明确循环的次数时用;递归操作文件目录