ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python中的迭代器和生成器

2020-04-15 09:58:50  阅读:188  来源: 互联网

标签:__ 迭代 Python self 生成器 start step


前言

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

迭代器

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

它基于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.

标签:__,迭代,Python,self,生成器,start,step
来源: https://www.cnblogs.com/DeaconOne/p/12703315.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有