Python生成器和迭代器学习笔记

定义

生成器 (generator)

  1. 一种定义体中含有yield关键词的函数被调用时得到的对象
  2. 有时指上述的函数

迭代器 (iterator)

  1. 一种实现了无参数__next__方法和__iter__方法的对象(实例)
  2. python内建的一种类,其继承自collections.Iterable (py3.4)

可迭代对象

实现了__iter__或__getitem__方法的对象

范例

class GeneratorSampleInClass:
    def __iter__(self):
        for item in [1, 2, 3]:
            yield item


g = GeneratorSampleInClass()
print(type(GeneratorSampleInClass.__iter__))  # <class 'function'>
print(type(g.__iter__()))  # <class 'generator'>
print(dir(g.__iter__()))  # [..., '__next__', ...]


def generator_sample_in_function():
    for item in [1, 2, 3]:
        yield item


print(type(generator_sample_in_function))  # <class 'function'>
print(type(generator_sample_in_function()))  # <class 'generator'>
print(dir(generator_sample_in_function))  # 没有__next__方法
print(dir(generator_sample_in_function()))  # [..., '__next__', ...]


class IteratorSampleInClass:
    def __iter__(self):
        return self

    def __next__(self):
        for item in [1, 2, 3]:
            yield item


from collections import Iterator

i = IteratorSampleInClass()
print(isinstance(i, Iterator))  # True

注意

  1. 迭代器是可迭代对象
  2. 生成器也是迭代器
  3. 不要把yield和yield from搞混,后者虽然可以简化for循环中的yield语句,但其的定义较复杂,我也不是很明白,这里就不做展开

作用

  1. 更优雅的代码
  2. 更有效处理大型对象 (不用一次性读入所有数据)
  3. 其他 (例:生成器还可以通过.send()方法变身为协程)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值