迭代器
闭包
在一个嵌套函数的内部函数使用外部(非全局)的变量就是闭包
def wrapper(): a = 10 def inner(): print(a) print(inner.__closure__) # 不是None 就是闭包 inner() wrapper()
可迭代对象(Iteration)
可以直接作用于for循环的对象统称为可迭代对象。可以通过查看是否能用__iter__方法来判断是否是可迭代对象。
迭代器(Iterator)
可以被next函数调用并不断返回下一个值的对象称为迭代器。可以使用__iter__和__next__方法的就是迭代器。
创建迭代器的方法
# 方法一 可迭代对象.__iter__ # 方法二 iter(可迭代对象)
迭代器的特性
惰性机制、不能从下向上走、一次性的(用完就没了)
for循环的本质
for i in range(1,6) print(i)
完全等价于
it = iter([1, 2, 3, 4, 5]) while 1: try: # 获得下一个值 x = next(it) except StopIteration: # 遇到StopIteration就退出循环 break
递归
如果一个函数在内部调用自己本身,且有明确结束条件,这个函数就是递归函数
# 计算n! def func(): if n == 1: return 1 return n * func(n - 1)
# 斐波那切数列 def func(n) assert n>= 0, "n > 0" if n <= 0: return n return func(n - 1) + func(n - 2) for i in range(1, 20): print(func(i), end = " ")
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。