python迭代器,生成器,闭包

    xiaoxiao2025-11-08  8

    可能当你一开始学python的时候,就不可避免的和迭代器接触了。

    迭代器

    一开始,我大概有个模糊的概念,比如在for循环中,其实隐藏了大量的迭代器细节,我们看到的不过是在迭代器协议下可遍历对象的不断迭代而已。正是因为迭代器协议的存在,在python语言中for也可以对文件系统等进行遍历,因为只要你具有“next”和“iter”属性,python都可以使用迭代器协议来访问对象。 但是如果你自己想写迭代器的话需要注意什么呢?

    class fib(): def __init__(self): self.forward = 0 self.next = 1 def __iter__(self): return self def __next__(self): value = self.forward self.forward += self.next self.next = value return value f = fib() for i in f: if i > 10: break else: print(i)

    这是典型的斐波那契数列实现的迭代器写法,可以看出我们在使用for循环对他进行遍历的时候,其实是调用“iter”获得迭代器,再调用“next”获取元素。

    生成器

    生成器时一种特殊的迭代器,生成器自动实现了迭代器协议,不需要手动的实现“iter”和“next”方法。 生成器通常有两种形式,生成器函数和生成器表达式:

    def squre(i): for a in range(i): # a = i*i yield a ** 2 for item in squre(5): print (item)

    上述为生成器函数,同样可以用迭代器方式完成,但是不可避免的使用到了列表等结构让代码更加复杂。 下面所示的生成器表达式的方式,也是很常用的特性。

    >>> squares = (x**2 for x in range(5)) >>> squares <generator object <genexpr> at 0x7fa8c8369bf8>

    这种延迟计算的特性对于大数据的处理具有不错的效益,当然还有pythonic的性质,这在前文我们已经提到过了。

    闭包

    最后讲一下闭包。 前面已经提过了,python的返回值是可以返回一个函数的,那么闭包其实就是函数的内部函数,同时在该内部函数中引用了外部定义的变量等。举个例子:

    def a(x): def b(y): return x+y return b a = a(1) print("func:",a) print("result:",a(1))

    输出是:

    func <function a.<locals>.b at 0x00000213A67DFF28> result 2

    闭包作为装饰器的基础,还是很有用的。


    更新2020/2/9

    闭包和生成器分别是ES5和ES6中比较难理解的东西,虽说和Python中有些相似。

    最新回复(0)