Logo

郎哥编程

可迭代对象

2020-12-18 326

可迭代对象

可迭代对象是迭代器类型,当一个容器类型实现了迭代器协议,这个类型也称为迭代器类型,该类型的实例化对象就是可迭代对象,可迭代对象的英文名称是Iterable。

存储数据项集合的数据结构称为容器类型,如序列类型、映射类型、集合类型都是容器类型,映射类型和集合类型在后面的课程会学到。

22.png

迭代器协议规定,容器类型要提供迭代支持,必须定义一个方法:

container.__iter__()

container是指一个容器类型,该方法会返回容器支持的一个迭代器(iterator),返回的迭代器需要支持下文所述的迭代器协议。

返回的迭代器自身需要支持以下两个方法:

iterator.__iter__()

返回一个可迭代器对象,这是同时允许容器和迭代器配合 for 和 in 语句使用所必须的。

iterator.__next__()

该方法从容器中返回下一项。 如果已经没有项可返回,则会引发 StopIteration 异常。

前面学过的字符串(str)、列表(list)、元组(tuple)、二进制序列(bytes和bytearray)都是可迭代对象。

案例代码:

>>> # 创建一个列表对象
>>> s = ["Python","java","C++"]
>>> # 调用列表对象的_iter_方法返回一个迭代器
>>> iterlist = s.__iter__()
>>> # 输出iterlist的类型
>>> type(iterlist)
<class 'list_iterator'>
>>> # 调用迭代器的__next__迭代列表的元素
>>> print(iterlist.__next__())
Python
>>> print(iterlist.__next__())
java
>>> print(iterlist.__next__())
C++
>>> print(iterlist.__next__())
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    print(iterlist.__next__())
StopIteration
>>>

从案例代码可以看出,列表类型实现了迭代器协议规定的__iter__()方法和__next__()方法。列表对象s调用__iter__()方法会返回一个list_iterator类型的可迭代器对象,调用该对象的__next__方法可迭代列表对象s的元素,当可迭代对象没有项可返回时,会抛出StopIteration异常。

用迭代器遍历序列对象

前面使用for循环遍历对象的过程中,已经使用了序列对象的迭代器。在while循环中,也可以使用序列对象的迭代器来遍历对象元素。

Python提供了内置函数iter从object对象返回一个迭代器,iter函数声明如下:

iter(object[, sentinel])

函数返回object对象的一个迭代器,如果可选参数sentinel没有给出,object对象必须实现迭代器协议。

Python的内置函数next,调用迭代器的 __next__() 方法获取可迭代对象的下一个元素。如果可迭代对象没有元素返回,会抛出StopIteration异常。Next函数声明如下:

next(iterator[, default])

该函数通过调用 iterator 的 __next__() 方法获取对象的下一个元素。default是可选参数。如果对象无元素返回,若给出default,返回default,否则抛出StopIteration异常。

因为迭代器在迭代完可迭代对象所有元素后,会引发StopIteration异常,因此需要把迭代代码放入到try-except块中(异常处理语句,在后面的课程会学到)。

编程案例:查找一个词是否在给出的词组中。

词组是多个词的组合,在词组中查找一个词,查找的词为查询词。最好的处理方法就是遍历整个词组,依次与查询词进行匹配,匹配成功说明查询词出现在词组中。程序流程图如下:

23.png

程序首先初始化词组列表,然后要求用户输入查询词,再使用迭代器迭代词组列表,在词组列表的迭代过程中,获取每个词对象,并与查询词进行匹配。若匹配成功,输出匹配成功信息并执行break语句跳出迭代,程序结束;若匹配失败则进入下一轮迭代。当迭代器抛出StopIteration异常,说明词组中没有与查询词相匹配的词,输出匹配失败信息,程序结束。

案例代码

#初始化词组列表
word_list = ['Java','Python','PHP','C++','Basic','Fortran'];
#要求用户输入查询词
query_word = input("请输入查询词:");
#迭代wordList
#获得wordlist迭代器
iterword = iter(word_list);
while True:
    try:
        # 获取迭代器的下一个数据项
        # 若迭代器无法返回数据项,抛出StopIteration异常
        temp_word = next(iterword);
        if temp_word == query_word:
            print("%s匹配成功" % query_word);
            break;
    except StopIteration:
        print("%s匹配失败" % query_word);
        break;

try-except是Python的异常处理语句,当需要Python捕获异常代码时,需要把认为可能会出现异常的代码包括在try语句块中,在程序执行时,如果try内语句发生错误就会抛出异常,except语句会捕获异常,except语句块内的代码将会被执行,这样就可以处理异常错误了。因为迭代器在迭代完所有对象成员后,会引发StopIteration异常,因此需要把迭代代码放入到try-except块中。

上机操作

1、创建一个列表对象,列表对象的值为10、30、20、11、9、8、6,编写程序,实现下面要求的功能:

(1)使用iter函数取该列表对象的迭代器,并使用type函数输出迭代器的类型;

(2)使用while循环和迭代器遍历列表对象的元素;

(3)输出列表元素的最大值和最小值;

(4)对列表元素按照从小到大进行排序;

(5)要求用户输入一个整数,程序查询列表是否存在这样的整数。

 

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论