zoukankan      html  css  js  c++  java
  • Python中的迭代器和生成器

    前言

    面试的时候总是被问到迭代器、生成器、装饰器,一开始不知道怎么回答,然后查阅资料之后总算是有点认识了。

    迭代器

    迭代器其实是一个实现了迭代器协议的容器对象。

    它基于2个方法:

    • __next__: 返回容器的下一个元素
    • __iter__: 返回迭代器本身

    range()函数就是一个迭代器

    接下来我模拟range写一个迭代器

    class Range:
        def __init__(self, start : int = 0, end : int = 10, step : int = 1):
            self.start = start
            self.end = end
            self.step = step
        
        def __next__(self):
            if self.start > (self.end - self.step):
                raise StopIteration
            self.start += self.step
            return self.start
        
        def __iter__(self):
            return self
    

    测试默认值:

    >>> print([i for i in Range()])
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    测试非默认值,设置步长为3:

    >>> print([i for i in Range(10, 50, 3)])
    [13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49]
    

    可见Range对象是一个可以迭代的对象

    迭代器跟生成器一般是结合使用的。

    生成器

    基于yield语句,生成器可以暂停当前执行的函数,返回yield当前要返回的值,并保存上下文。

    例如生成可以被3整除的数:

    def divide_three():
        a = 3
        while True:
            yield a
            a += 3
    

    测试:

    >>> res = divide_three()
    >>> print([next(res) for i in range(20)])
    [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60]
    

    这里调用了20次,理论上,如果你愿意,可以调用无限次,是不是很神奇。

    来看看divide_three的类型:

    >>> print(divide_three())
    <generator object divide_three at 0x1116db550>
    

    现在是不是对迭代器、生成器有点感觉了。

    Enjoy your code, good luck.

    不积跬步,无以至千里。
  • 相关阅读:
    客户端及服务端_终端模拟
    安装-homebrew
    客户端及服务端_网页访问
    python server搭建
    ping不通localhost但是可以ping通ip地址
    CentOS7 修改Jenkins以root用户运行
    tomcat配置外部静态资源映射路径(windows和Linux部署)
    Centos 6.10 安装 Jenkins
    axios ios 微信浏览器session问题
    微信公众号 分享接口 签名通过 分享无效果(JSSDK自定义分享接口的策略调整)
  • 原文地址:https://www.cnblogs.com/DeaconOne/p/12703315.html
Copyright © 2011-2022 走看看