迭代器

迭代器

闭包

  在一个嵌套函数的内部函数使用外部(非全局)的变量就是闭包

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 = " ")

  递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

  使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

原文地址:https://www.cnblogs.com/yaoyanxin007/p/10559548.html