Python迭代器与生成器

迭代器

访问集合元素的一种方式,可以记住遍历的位置的对象
从集合的第一个元素开始,直到所有的元素被访问完结束,迭代器只能往前不会后退

iter(),创建迭代器对象

iter(object, [sentinel])
object,迭代的集合

如果有第二个参数,第一个参数必须是可调用对象。
iter创建迭代器对象后,每次调用__next__()方法都会调用object

next(),输出迭代器的下一个元素,要和iter()一起使用

next(iterable, [default])
iterable,可迭代对象

default,可选参数,设置没有下一元素是返回的默认值,不设置的话没有下一参数时会发出`StopIteration`异常
list = [1, 2, 3, 4]
li = iter(list)
print(next(li))
for i in li:
    print(i, end=' ')

在这里插入图片描述

创建迭代器

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
    def __next__(self):
        x = self.a
        self.a += 1
        return x

myclass = MyNumbers()
myiter = iter(myclass)

# next只输出一个元素,for循环会无限循环下去
# print(next(myiter))
for i in myiter:
    print(i)

StopIteration

标识迭代的完成,防止无限循环
for 循环中无需处理 StopIteration 异常,循环会正常结束

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 # 20次迭代后停止
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

生成器

使用yield函数的称为生成器,结果返回迭代器,只能用于迭代操作
yield指路https://www.runoob.com/w3cnote/python-yield-used-analysis.html

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        print b 
        a, b = b, a + b 
        n = n + 1
fab(5)

缺少复用性,无法获得生成序列

class Fab(object):
    def __init__(self, max):
        self.max = max
        self.n, self.a, self.b = 0, 0, 1
    def __iter__(self):
        return self
    def __next__(self):
        if self.n < self.max:
            r = self.b
            self.a, self.b = self.b, self.a + self.b
            self.n = self.n + 1
            return r
        raise StopIteration()
for n in Fab(5):
    print(n)

利用iterable,内存占用始终为常数,但不简洁

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        # print b 
        a, b = b, a + b 
        n = n + 1
for n in fab(5): 
    print n

利用yield来获取iterable效果,保持简洁

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值