Fluent Python

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

2018-01-19  本文已影响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 函数

迭代对象的流程:

collections.abc.Iterable

可迭代对象与迭代器

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

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

生成器函数

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


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

生成器表达式

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


生成器表达式

标准库生成器函数

合并多个迭代对象的生成器函数

yield from

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


yield from

可迭代的归约函数

短路
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
上一篇下一篇

猜你喜欢

热点阅读