可迭代对象什么意思
发布时间:2025-05-14 08:59:43 发布人:远客网络
一、可迭代对象什么意思
可迭代对象的意思:可以使用for循环遍历的对象。
在Python中,任何对象,只要它定义了可以返回迭代器的__iter__()方法,或者定义了可以支持下标索引的__getitem__()方法,就可以被称为可迭代对象。可迭代对象是Python中十分重要的一种对象类型,在Python编程中的使用频率非常高,能够方便地处理序列数据和进行编程。
对于可迭代对象,我们可以使用for循环来进行迭代操作,也可以使用内置函数iter()将其转换为迭代器对象,然后使用next()函数来逐个访问对象中的元素。可迭代对象的存在,使得我们可以更加方便地对数据进行遍历、过滤、映射等操作。
1、迭代:可迭代对象可以被用于for循环中,使得我们能够遍历其中的元素。
2、列表推导式和生成器表达式:可迭代对象可以被用于生成器表达式和列表推导式中,使得我们能够方便地生成新的序列。
3、函数:可迭代对象可以被用于一些高阶函数中,比如map()和filter()函数等,使得我们能够更加方便地处理序列数据。
4、数据流处理:可迭代对象可以被用于在数据流处理中处理大量数据,比如读取文件中的数据或从网络流中读取数据等。
5、装饰器:可迭代对象可以被用于装饰器中,使得我们能够更好地实现装饰器的功能。
二、Python中什么是迭代
1、如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
2、在Python中,迭代是通过for... in来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的,比如Java代码:
3、for(i=0; i<list.length; i++){ n= list[i];
4、可以看出,Python的for循环抽象程度要高于Java的for循环,因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。
5、list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:
6、>>> d={'a': 1,'b': 2,'c': 3}>>> for key in d:... print(key)
7、因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。
8、默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。
9、由于字符串也是可迭代对象,因此,也可以作用于for循环:
10、>>> for ch in'ABC':... print(ch)
11、所以,当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。
12、这个网站有很多Python的系统、基础教程,可以看看。网页链接
三、Python中的“迭代”详解
1、迭代器模式:一种惰性获取数据项的方式,即按需一次获取一个数据项。
2、所有序列都是可以迭代的。我们接下来要实现一个 Sentence(句子)类,我们向这个类的构造方法传入包含一些文本的字符串,然后可以逐个单词迭代。
3、接下来测试 Sentence实例能否迭代
4、解释器需要迭代对象 x时,会自动调用iter(x)。
5、由于序列都实现了 __getitem__方法,所以都可以迭代。
6、可迭代对象:使用内置函数 iter()可以获取迭代器的对象。
7、与迭代器的关系:Python从可迭代对象中获取迭代器。
8、下面用for循环迭代一个字符串,这里字符串'abc'是可迭代的对象,用 for循环迭代时是有生成器,只是 Python隐藏了。
9、如果没有 for语句,使用 while循环模拟,要写成下面这样:
10、 Python内部会处理 for循环和其他迭代上下文(如列表推导,元组拆包等等)中的 StopIteration异常。
11、 __next__:返回下一个可用的元素,如果没有元素了,抛出 StopIteration异常。
12、 __iter__:返回 self,以便在需要使用可迭代对象的地方使用迭代器,如 for循环中。
13、迭代器:实现了无参数的 __next__方法,返回序列中的下一个元素;如果没有元素了,那么抛出 StopIteration异常。Python中的迭代器还实现了 __iter__方法,因此迭代器也可以迭代。
14、接下来使用迭代器模式实现 Sentence类:
15、注意,不要在 Sentence类中实现 __next__方法,让 Sentence实例既是可迭代对象,也是自身的迭代器。
16、为了“支持多种遍历”,必须能从同一个可迭代的实例中获取多个独立的迭代器,而且各个迭代器要能维护自身的内部状态,因此这一模式正确的实现方式是,每次调用 iter(my_iterable)都新建一个独立的迭代器。
17、实现相同功能,但却符合 Python习惯的方式是,用生成器函数代替 SentenceIteror类。
18、只要 Python函数的定义体中有 yield关键字,该函数就是生成器函数。调用生成器函数,就会返回一个生成器对象。
19、生成器函数会创建一个生成器对象,包装生成器函数的定义体,把生成器传给 next(...)函数时,生成器函数会向前,执行函数定义体中的下一个 yield语句,返回产出的值,并在函数定义体的当前位置暂停,。最终,函数的定义体返回时,外层的生成器对象会抛出 StopIteration异常,这一点与迭代器协议一致。
20、如今这一版 Sentence类相较之前简短多了,但是还不够慵懒。惰性,是如今人们认为最好的特质。惰性实现是指尽可能延后生成值,这样做能节省内存,或许还能避免做无用的处理。
21、目前实现的几版 Sentence类都不具有惰性,因为 __init__方法急迫的构建好了文本中的单词列表,然后将其绑定到 self.words属性上。这样就得处理整个文本,列表使用的内存量可能与文本本身一样多(或许更多,取决于文本中有多少非单词字符)。
22、 re.finditer函数是 re.findall函数的惰性版本,返回的是一个生成器,按需生成 re.MatchObject实例。我们可以使用这个函数来让 Sentence类变得懒惰,即只在需要时才生成下一个单词。
23、标准库提供了很多生成器函数,有用于逐行迭代纯文本文件的对象,还有出色的 os.walk函数等等。本节专注于通用的函数:参数为任意的可迭代对象,返回值是生成器,用于生成选中的、计算出的和重新排列的元素。
24、第一组是用于过滤的生成器函数:从输入的可迭代对象中产出元素的子集,而且不修改元素本身。这种函数大多数都接受一个断言参数(predicate),这个参数是个布尔函数,有一个参数,会应用到输入中的每个元素上,用于判断元素是否包含在输出中。
25、第二组是用于映射的生成器函数:在输入的单个/多个可迭代对象中的各个元素上做计算,然后返回结果。
26、第三组是用于合并的生成器函数,这些函数都可以从输入的多个可迭代对象中产出元素。
27、第四组是从一个元素中产出多个值,扩展输入的可迭代对象。
28、第五组生成器函数用于产出输入的可迭代对象中的全部元素,不过会以某种方式重新排列。
29、下面的函数都接受一个可迭代的对象,然后返回单个结果,这种函数叫“归约函数”,“合拢函数”或“累加函数”,其实,这些内置函数都可以用 functools.reduce函数实现,但内置更加方便,而且还有一些优点。