(15)python中的迭代

1.10 迭代

1.10.1 迭代概念

 可迭代对象(Iterable)

 可迭代对象(Iterable)简单理解就是可以从集合的第一个数据开始进行遍历的属性的对象。注意:此处集合不是指python是set类型,而是指由多个元素组成的对象,如列表、字符串【字符串中一个字符看做一个元素】等。

 凡是具有__iter__的方法的类,都是可迭代的类。可迭代类创建的对象实现了__iter__方法,就是可迭代对象。

 Python的内置工具(如for循环,sum,min,max函数等)访问对象,for循环并不需要知道对象具体是什么。

 迭代器(Iterator)

 Iterator是Python一个强大的功能,它可以记录被迭代“对象”的位置,迭代器对象从集合的第一个元素开始访问数据,直到所有数据访问结束,迭代器中实现了两个基本函数iter()和next()。

 __next__()方法,它返回迭代中的元素,在没有更多元素后,抛出StopIteration异常,终止迭代。

 Python内置模块itertools,提供了很多相关的函数。

 可迭代器(iterator)与可迭代对象(iterable)并不是同一个概念。

 可迭代对象(iterable):凡是具有__iter__的方法的类,都是可迭代的类。可迭代对象通过__iter__方法返回一个迭代器,然后在内部调用__next__方法进行迭代,最后没有元素时,抛出异常(这个异常python自己会处理,不会让开发者看见)。

 迭代器(iterator):迭代器对象必须同时实现__iter__和__next__方法才是迭代器。对于迭代器来说,__iter__ 返回的是它自身 self,__next__ 则是返回迭代器中的下一个值,最后没有元素时,抛出异常(异常可以被开发者看到)。

 总结:

 迭代器一定是可迭代对象,因为它实现了__iter__()方法;

 通过iter()方法(在类的内部就是__iter__)能够使一个可迭代对象返回一个迭代器。

 迭代器的 __iter__ 方法返回的是自身,并不产生新的迭代器对象。而可迭代对象的 __iter__ 方法通常会返回一个新的迭代器对象。这就是可迭代对象可以重复遍历的原因(每次返回一个独立的迭代器,就可以保证不同的迭代过程不会互相影响);而迭代器由于返回自身,因此只能遍历一次。


1.10.2 迭代中的循环机制

当对象本身就是迭代器时,循环机制:

 调用 __iter__方法,返回自身self,也就是返回迭代器。

 不断地调用迭代器的next()方法,每次按序返回迭代器中的一个值。

 迭代到最后没有元素时,就抛出异常 StopIteration

在可迭代对象中,循环机制:

 先判断对象是否为可迭代对象(等价于判断有没有__iter__或__getitem__方法),没有的话直接报错,抛出TypeError异常。有的话,调用 __iter__方法,返回一个迭代器。

 在python内部不断地调用迭代器的__next__方法,每次按序返回迭代器中的一个值。

 迭代到最后没有元素时,就抛出异常 StopIteration,这个异常 python 自己会处理,不会暴露给开发者。


1.10.3 常见的可迭代对象

 序列或集合类型,包括str、list、tuple、dict、set等

 文件对象

 在类中定义了__iter__()方法的对象,即是 Iterable对象。如:

>>> dir(list)

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

 示例,用list的extend方法示例迭代:

>>> help(list.extend)

extend(self, iterable, /)

    Extend list by appending elements from the iterable.

list的extend方法是通过可迭代对象将迭代对象中的元素(数据)一个个循环扩展到原list后面。

>>> aList = [1,2,3]

>>> b = 'abc'

>>> aList.extend(b)

>>> aList #字符串是可迭代对象,每个字符当做一个元素。通过迭代内部机制将元素(字符)循环追加到aList后面。输出:[1, 2, 3, 'a', 'b', 'c']

 示例:

>>> family3GList=['niuniu', 'laoma', 'laoba']

>>> it = iter(family3GList)

>>> next(it)

'niuniu'

>>> next(it)

'laoma'

>>> next(it)

'laoba'

import sys

family3GList=['niuniu', 'laoma', 'laoba']

it = iter(family3GList)    # 创建迭代器对象

while True:

    try:

        print (next(it))

    except StopIteration: #异常用于标识迭代的完成,防止出现无限循环的情况

        sys.exit()

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容