美文网首页Fluent Python
可迭代对象、迭代器、生成器

可迭代对象、迭代器、生成器

作者: 一块大番薯 | 来源:发表于2018-01-19 11:22 被阅读92次

序列协议

只要实现了_getitem_ 和 _len_ 就可以看做是序列

import re
import reprlib

RE_WORD = re.compile('\w+')

class Sentence:
    
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)
        
    def __getitem__(self, index):
        return self.words[index]
        
    def __len__(self):
        return len(self.words)
        
    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)
序列协议

可迭代原因:iter 函数

迭代对象的流程:

  • 检查对象是否实现了 _iter_,是,则调用它获取一个迭代器
  • 否,检查对象是否实现了 _getitem_,是,则创建一个迭代器从索引 0 开始获取元素
  • 否,抛出 TypeError
collections.abc.Iterable

可迭代对象与迭代器

关系:Python 从 可迭代对象中获取迭代器

s = 'ABC'
it = iter(s)  # 用可迭代对象构建迭代器
while True:
    try:
        print(next(it))
    except StopIteration:  # for循环,列表推导,元祖拆包也会有
        del it
        break

生成器函数

定义:定义体中含有 yield 关键字的函数。调用生成器函数返回生成器对象。生成器产出值。


生成器函数
生成器函数执行过程

生成器表达式

惰性,当 for 循环迭代时,才会执行函数定义体


生成器表达式

标准库生成器函数

  • filter(predicate, it)
    接受一个断言参数 predicate 和一个迭代器参数。当 predicate(item) 为 True 时,保留。
  • enumerate(it, start=0)
    产出 (index, item),其中 index 从start 开始计数。
  • map(func, it)
    产出 func(item)
  • zip(it1, ..., itN)
    产出由 N 个元素组成的元祖,只有有一个可迭代对象迭代尽了就停止。
  • itertools.zip_longest(it1, ..., itN, fillvalue=None)
  • itertools.chain(it1, ..., itN)
合并多个迭代对象的生成器函数
  • reversed(seq)
    倒序产出 seq 元素

yield from

不同生成器结合在一起使用。
代替嵌套迭代,直接与最内层生成器联系起来。


yield from

可迭代的归约函数

  • all(it)
  • any(it)
  • max(it, [key=, default=])
  • min(it, [key=, default=])
  • reduce(func, it[, initial])
  • sum(it, start=0)
    虽然每个归约函数都可以用 functools.reduce 来代替,但有一项优化措施 reduce 做不到:一旦确定结果立即停止迭代
短路
all([])

I already read the docs, and I know the implementation

 def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

But the question is why not?

def all(iterable):
    if not iterable:
        return False
    for element in iterable:
        if not element:
            return False
    return True

深入分析 iter 函数

iter
  • iter 的第一个参数是可调用对象,不断产生值,第二个参数是哨符,当产出这个值时,抛出 StopIteration,停止迭代。

相关文章

  • Python基础-16生成器-迭代器

    16.生成器-迭代器     可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象,在Python中提供...

  • Python可迭代对象,迭代器,生成器关系

    列表,元组,字符串,迭代器,生成器都是可迭代对象。所以,可迭代对象不一定是迭代器,生成器。 将一个可迭代对象传递给...

  • 迭代器

    可迭代对象(Iterable): for迭代器(Iterator): for + next生成器属于迭代器。 验...

  • 可迭代对象、迭代器、生成器

    可迭代对象 --> 迭代器 --> 生成器; 可迭代对象:实现了__iter__()方法的对象,该方法返回迭代对象...

  • yield and Iterator

    Generator(生成器) 生成器是特殊的迭代器,迭代器不一定是生成器。 生成器与迭代器均是可迭代对象。 目前学...

  • 迭代机制

    可迭代对象、迭代器、生成器、生成式区别 a. 可迭代对象: 一个对象能够被迭代的使用,这个对象就是可迭代对象 b....

  • python生成器、迭代器、可迭代对象

    可迭代对象 迭代器 生成器 1.可迭代对象 可以被for循环遍历的对象成为可迭代对象,其中包括list、str、t...

  • 2-1迭代对象、迭代器、生成器

    可迭代对象、迭代器和生成器的关系 可迭代对象 可迭代对象实现某种接口,对与列表内部实现了__iter__()方法,...

  • Python迭代器和生成器

    所有的生成器都是迭代器;从可迭代的对象中获取迭代器 一、序列可迭代的原因:iter函数 迭代对象x时,自动调用it...

  • 迭代器和生成器

    迭代器和生成器 迭代器 hasattr(list,'iter')True 判断列表是否为可迭代对象 lst = [...

网友评论

    本文标题:可迭代对象、迭代器、生成器

    本文链接:https://www.haomeiwen.com/subject/qsywoxtx.html