美文网首页
python迭代器,生成器,闭包

python迭代器,生成器,闭包

作者: 何赛艾慕 | 来源:发表于2019-05-21 15:23 被阅读0次

    可能当你一开始学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
    

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

    相关文章

      网友评论

          本文标题:python迭代器,生成器,闭包

          本文链接:https://www.haomeiwen.com/subject/vytjzqtx.html