python迭代列表,迭代法Python

发布时间:2022-11-20

本文目录一览:

  1. Python基础之迭代器
  2. Python中迭代和递归的区别
  3. Python列表循环的两种方法
  4. Python中迭代器和列表解析怎么使用
  5. Python中的“迭代”详解

Python基础之迭代器

一. 什么是迭代器

迭代器是用来迭代取值的工具。 而涉及到把多个值循环取出来的类型有:列表,字符串,元组,字段,集合,打开文件等。通过使用的遍历方式有 for···in···while 等,但是,这些方式只适用于有索引的数据类型。为了解决索引取的局限性,Python 提供了一种不依赖于索引的取值方式:迭代器。

二. 可迭代对象

可迭代对象:但凡内置有 __iter__ 方法的都称为可迭代对象。 常见的可迭代对象:

  1. 集合数据类型,如 list, tuple, dict, set, str 等。
  2. 生成器,包括生成器和带 yield 的生成器函数。

三. 如何创建迭代器

迭代器是一个包含数个值的对象。 迭代器是可以迭代的对象,这意味着您可以遍历所有值。 从技术上讲,在 Python 中,迭代器是实现迭代器协议的对象,该协议由方法 __iter__()__next__() 组成。 简而言之,一个类里面实现了 __iter__()__next__() 这两个魔法方法,那么这个类的对象就是可迭代对象。

四. 迭代器的优缺点

  1. 优点
  2. 缺点

五. 迭代器示例

另外,如果类 Stu 继承了 Iterator,那么 Stu 可以不用实现 __iter__() 方法。

遍历迭代器

StopIteration

如果你有足够的 next() 语句,或者在 for 循环中使用,则上面的例子将永远进行下去。 为了防止迭代永远进行,我们可以使用 StopIteration 语句。 在 __next__() 方法中,如果迭代完成指定的次数,我们可以添加一个终止条件来引发错误。

Python中迭代和递归的区别

在函数内部,调用函数自身的编程技巧称为递归(recursion)。 递归是要干活的,需要完成任务。 利用 for 循环来遍历一个列表(list)或元组(tuple),将值依次取出,这种方法我们称为迭代。 而迭代,只出工,不出力。

Python列表循环的两种方法

列表循环的一种方法是,先获取列表的下标,然后迭代列表的每一个下标。 列表循环的另一种方法是直接获取列表的每一个元素。 运行结果如下:

Python中迭代器和列表解析怎么使用

一种特殊的数据结构,以对象形式存在:

i1 = l1.__iter__()
i1 = iter(l1)

可迭代对象:

  • 序列:list, str, tuple
  • 非序列:dict, file
  • 自定义类:__iter__(), __getitem__() 注意: 若要实现迭代器,需要在类中定义 next() 方法。 要使迭代器指向下一个对象,则使用成员函数 next()
i1.next()

当没有元素时,会引发 StopIteration 异常。 for 循环可用于任何可迭代对象。 例如:

l1 = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
i1 = l1.__iter__()
il.next()  # 'Sun'
il.next()  # 'Mon'

Python中的“迭代”详解

迭代器模式:一种惰性获取数据项的方式,即按需一次获取一个数据项。 所有序列都是可以迭代的。我们接下来要实现一个 Sentence(句子)类,我们向这个类的构造方法传入包含一些文本的字符串,然后可以逐个单词迭代。 接下来测试 Sentence 实例能否迭代。

序列可以迭代的原因

iter() 解释器需要迭代对象 x 时,会自动调用 iter(x)。 内置的 iter 函数有以下作用: 由于序列都实现了 __getitem__ 方法,所以都可以迭代。 可迭代对象:使用内置函数 iter() 可以获取迭代器的对象。 与迭代器的关系:Python 从可迭代对象中获取迭代器。 下面用 for 循环迭代一个字符串,这里字符串 'abc' 是可迭代的对象,用 for 循环迭代时是有生成器,只是 Python 隐藏了。 如果没有 for 语句,使用 while 循环模拟,要写成下面这样:

it = iter('abc')
while True:
    try:
        print(next(it))
    except StopIteration:
        break

Python 内部会处理 for 循环和其他迭代上下文(如列表推导,元组拆包等等)中的 StopIteration 异常。

标准的迭代器接口有两个方法:

  • __next__:返回下一个可用的元素,如果没有元素了,抛出 StopIteration 异常。
  • __iter__:返回 self,以便在需要使用可迭代对象的地方使用迭代器,如 for 循环中。 迭代器:实现了无参数的 __next__ 方法,返回序列中的下一个元素;如果没有元素了,抛出 StopIteration 异常。Python 中的迭代器还实现了 __iter__ 方法,因此迭代器也可以迭代。 接下来使用迭代器模式实现 Sentence 类: 注意,不要在 Sentence 类中实现 __next__ 方法,让 Sentence 实例既是可迭代对象,也是自身的迭代器。 为了“支持多种遍历”,必须能从同一个可迭代的实例中获取多个独立的迭代器,而且各个迭代器要能维护自身的内部状态,因此这一模式正确的实现方式是,每次调用 iter(my_iterable) 都新建一个独立的迭代器。 所以总结下来就是: 实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替 SentenceIteror 类。 只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数。调用生成器函数,就会返回一个生成器对象。 生成器函数会创建一个生成器对象,包装生成器函数的定义体,把生成器传给 next(...) 函数时,生成器函数会向前,执行函数定义体中的下一个 yield 语句,返回产出的值,并在函数定义体的当前位置暂停。最终,函数的定义体返回时,外层的生成器对象会抛出 StopIteration 异常,这一点与迭代器协议一致。 如今这一版 Sentence 类相较之前简短多了,但是还不够慵懒。惰性,是如今人们认为最好的特质。惰性实现是指尽可能延后生成值,这样做能节省内存,或许还能避免做无用的处理。 目前实现的几版 Sentence 类都不具有惰性,因为 __init__ 方法急迫的构建好了文本中的单词列表,然后将其绑定到 self.words 属性上。这样就得处理整个文本,列表使用的内存量可能与文本本身一样多(或许更多,取决于文本中有多少非单词字符)。 re.finditer 函数是 re.findall 函数的惰性版本,返回的是一个生成器,按需生成 re.MatchObject 实例。我们可以使用这个函数来让 Sentence 类变得懒惰,即只在需要时才生成下一个单词。 标准库提供了很多生成器函数,有用于逐行迭代纯文本文件的对象,还有出色的 os.walk 函数等等。本节专注于通用的函数:参数为任意的可迭代对象,返回值是生成器,用于生成选中的、计算出的和重新排列的元素。 第一组是用于过滤的生成器函数:从输入的可迭代对象中产出元素的子集,而且不修改元素本身。这种函数大多数都接受一个断言参数(predicate),这个参数是个布尔函数,有一个参数,会应用到输入中的每个元素上,用于判断元素是否包含在输出中。 以下为这些函数的演示: 第二组是用于映射的生成器函数:在输入的单个/多个可迭代对象中的各个元素上做计算,然后返回结果。 以下为这些函数的用法: 第三组是用于合并的生成器函数,这些函数都可以从输入的多个可迭代对象中产出元素。 以下为演示: 第四组是从一个元素中产出多个值,扩展输入的可迭代对象。 以下为演示: 第五组生成器函数用于产出输入的可迭代对象中的全部元素,不过会以某种方式重新排列。 以下为演示: 下面的函数都接受一个可迭代的对象,然后返回单个结果,这种函数叫“归约函数”,“合拢函数”或“累加函数”,其实,这些内置函数都可以用 functools.reduce 函数实现,但内置更加方便,而且还有一些优点。

参考教程:

《流畅的 Python》 P330 - 363