前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《流畅的Python》第十四章学习笔记

《流畅的Python》第十四章学习笔记

作者头像
zx钟
发布2021-03-10 11:39:54
5680
发布2021-03-10 11:39:54
举报
文章被收录于专栏:测试游记测试游记

迭代是数据处理的基石

所有生成器都是迭代器,因为生成器完全实现了迭代器接口。

  • 迭代器用于从集合中取出元素;
  • 生成器用于「凭空」生成元素;

大多数时候都把迭代器生成器视作同一概念

迭代器常用场景

  1. for循环
  2. 构建和扩展集合类型
  3. 逐行遍历文本文件
  4. 列表推导、字典推导和集合推导
  5. 元组拆包
  6. 调用函数时,使用*拆包实参

序列可迭代的原因:iter函数

解释器需要迭代对象x时,会自动调用iter(x)

内置的iter函数的作用

iter函数作用

任何Python序列都可迭代的原因是,它们都实现了__getitem__方法。

检查对象能否迭代

调用iter(x)函数,如果不可迭代,再处理TypeError异常

可迭代对象与迭代器

Python从可迭代的对象中获取迭代器 迭代器可以迭代,但是可迭代对象不是迭代器

代码语言:javascript
复制
s = 'ABC'
for char in s:
    print(char)

it = iter(s)
while True:
    try:
        print(next(it))
    except StopIteration:
        del it
        break

__next__:返回下一个可用的元素,如果没有元素了抛出StopIteration异常

__iter__:返回self,以便在应该使用可迭代对象的地方使用迭代器

StopIteration

该异常表明迭代器到头了。

Python语言会处理for循环和其他迭代器(列表推导、元组拆包等)上下文中的StopIteration

可迭代对象

使用iter内置函数可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。

序列都可以迭代;实现了__getitem__方法,而且其参数是从0开始的索引,这种对象也可以迭代

迭代器

实现了无参数的__next__方法,返回序列中的下一个元素。

如果没有元素了,那么抛出StopIteration异常。

Python中的迭代器还实现了__iter__方法,因此迭代器也可以迭代

⚠️可迭代的对象一定不能是自身的迭代器。也就是 可迭代对象必须实现__iter__方法,但不能实现__next__方法

迭代器模式可以用来

  • 访问一个聚合对象的内容而无需暴露它的内部表示
  • 支持对聚合对象的多种遍历
  • 为遍历不同的聚合结构提供一个统一的接口「支持多态迭代」

生成器

生成器函数是生成器工厂

函数的定义中有yield关键字,该函数就是生成器函数。

调用生成器函数时,会返回一个生成器对象。

re.finditerre.findall的惰性版本,返回的是一个生成器。可以逐个获取匹配项。

itertools.islice(it,stop)itertools.islice(it,start,stop,step=1)惰性切片

用于过滤的生成器函数

  • itertools.compress(it, selector_it)
  • itertools.dropwhile(predicate, it)
  • filter(predicate, it)
  • itertools.filterfalse(predicate, it)
  • itertools.islice(it, stop)
  • itertools.islice(it, start, stop, step=1)
  • itertools.takewhile(predicate, it)

用于映射的生成器函数

  • itertools.accumulate(it, [func])
  • enumerate(iterable, start=0)
  • map(func, it1, [it2, …, itN])
  • itertools.starmap(func, it)

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

  • itertools.chain(it1, …, itN)
  • itertools.chain.from_iterable(it1)
  • itertools.product(it1, …, itN, repeat=1)
  • zip(it1, …, itN)
  • itertools.zip_longest(it1, …, itN, fillvalue=None)

把输入的各个元素扩展成多个输入元素的生成器函数

  • itertools.combinations(it1, out_len)
  • itertools.combinations_with_replacement(it1, out_len)
  • itertools.count(start=0, step=1)
  • itertools.cycle(it)
  • itertools.permutations(it, out_len=None)
  • itertools.repeat(item, [times])

用于重新排列元素的生成器函数

  • itertools.groupby(it, key=None)
  • reversed(seq)
  • tee(it, n=2)

yield from

把不同的生成器结合在一起使用

  1. 代替循环
  2. 创建通道,把内层生成器直接与外层生成器的客户端联系起来
代码语言:javascript
复制
def chain1(*iterables):
    for it in iterables:
        for i in it:
            yield i


def chain2(*iterables):
    for i in iterables:
        yield from i


if __name__ == '__main__':
    s = 'ABC'
    t = tuple(range(3))
    print(list(chain1(s, t)))
    print(list(chain2(s, t)))

iter函数特殊用法

传入两个参数

  • 第一个参数为迭代对象
  • 第二个参数为哨符
代码语言:javascript
复制
with open('a.txt') as f:
    for line in iter(f.readline, '\n'):
        print(line)

逐行读取文件,直到遇到空行或者到达文件末尾为止

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 迭代器常用场景
  • 序列可迭代的原因:iter函数
    • 内置的iter函数的作用
      • 检查对象能否迭代
      • 可迭代对象与迭代器
        • StopIteration
          • 可迭代对象
            • 迭代器
            • 迭代器模式可以用来
            • 生成器
              • 用于过滤的生成器函数
                • 用于映射的生成器函数
                  • 合并多个可迭代对象的生成器函数
                    • 把输入的各个元素扩展成多个输入元素的生成器函数
                      • 用于重新排列元素的生成器函数
                      • yield from
                      • iter函数特殊用法
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档