本文共 2513 字,大约阅读时间需要 8 分钟。
原本计划在介绍完元组和字典后,接着讲解列表解析和字典解析。但要理解列表解析和字典解析,就必须掌握Python的高级类型迭代器。因此,本节将首先介绍迭代器的概念。
迭代是指通过重复执行代码来处理相似的数据集的过程,且本次迭代的处理数据要依赖上一次的结果继续往下做。上一次产生的结果为下一次产生结果的初始状态。如果中途有任何停顿,就不能算作迭代。
非迭代例子
loop = 0while loop < 3: print("Hello world!") loop += 1例1仅是循环3次输出"Hello world!",输出的数据不依赖上一次的数据,因此不是迭代。
迭代例子
loop = 0while loop < 3: print(loop) loop += 1
例2的输出依赖上一次的数据,这就是迭代。
容器是一种将多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取。可以通过in、not in关键字判断元素是否包含在容器中。
容器的定义
在Python中,基本上所有有元素的数据类型(字符串除外)都能包含其他类型的对象。容器的本质是可迭代对象赋予了容器这种能力。容器与可迭代对象的关系
容器本身并不提供直接访问元素的能力,而是可迭代对象赋予了容器这种能力。例如,l = [1,2,3,4],我们可以通过for循环遍历它,这是因为列表是可迭代对象。可迭代对象并不是指某种具体的数据类型,而是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__()方法或__getitem__()方法访问。
__iter__方法
__getitem__()方法允许通过实例名[index]访问实例中的元素。可迭代对象的使用
在Python中,任何可迭代对象都可以用for...in循环访问。这实际上是调用了__iter__()方法获得一个迭代器,然后循环调用__next__()方法。常见的可迭代对象
包括列表、元组、字典、集合、字符串等。此外,还有一种特殊的可迭代对象——生成器。可以通过collections模块的Iterable类型来判断。例如:
from collections import Iterableisinstance('', Iterable) # 返回True,表明字符串也是可迭代对象 关于collections后续将有更详细的介绍。
当在迭代可变对象(如列表)时,迭代器记录当前到达的序列中的第几个元素。如果在迭代过程中修改了序列,更新会立即反映到迭代过程中。例如:
l = [1,2,3,4]i = iter(l)list(i) # 将迭代器转换为列表,输出[1,2,3,4]list(i) # 再次转换为列表,输出[]
如果需要多次访问迭代器内容,可以在访问前重新生成迭代器。
迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素。从实现上来看,一个迭代器对象必须定义__iter__()方法和next()方法。
迭代器的特点
迭代器的计算是惰性的,只有在需要返回下一个数据时才会计算。所有的Iterable可迭代对象均可以通过内置函数iter()转换为迭代器。迭代器的优点
迭代器的使用示例
# 通过for循环访问迭代器vList = [1,2,3,4]vIter = iter(vList)for i in vIter: print('第一次:', i)for i in vIter: print('第二次:', i)通过上述代码可以看到,迭代器和可迭代对象的区别。每次for循环访问迭代器时,迭代器会重新开始,从第一个元素开始。
# 通过next()方法访问迭代器vList = [1,2,3,4]vIter = iter(vList)while True: try: i = next(vIter) print('第一次:', i) except: break代码中的while循环可以多次调用next(),但注意到每次调用next()时,迭代器都会移动到下一个元素。
迭代器的局限性
迭代器只能向前访问数据,且一旦访问过,已访问的数据无法再次访问。例如:l = [1,2,3,4]i = iter(l)list(i) # 输出[1,2,3,4]list(i) # 输出[]
如果需要多次访问迭代器内容,可以重新生成迭代器。
迭代完成后的异常
当所有元素都取出后,再次调用next()会抛出StopIteration异常。这并不是错误,而是告诉调用者迭代已经完成。通过for...in方式访问迭代器
vList = [1,2,3,4]vIter = iter(vList)for i in vIter: print('第一次:', i)for i in vIter: print('第二次:', i)通过上述代码可以看出,迭代器是一次性的,第二次循环没有输出数据。
通过next()方法访问迭代器
vList = [1,2,3,4]vIter = iter(vList)while True: try: i = next(vIter) print('第一次:', i) except: break这段代码可以多次调用next(),但每次调用时迭代器都会移动到下一个元素。
通过本节的介绍,希望大家对迭代器有了清晰的理解,并能够根据实际需求选择适合的方式进行数据处理。
转载地址:http://qovk.baihongyu.com/