python中迭代器和生成器_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())

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

Enjoy your code, good luck.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值