博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Python学习之路 -- Python基础之迭代器及for循环工作原理》
阅读量:4560 次
发布时间:2019-06-08

本文共 928 字,大约阅读时间需要 3 分钟。

  提到迭代器不得不说迭代器协议,迭代器协议是指:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一项,要么就抛出一个StopIteration异常(相当于报错的意思)以终止迭代。然而遵循这个协议的对象就称为可迭代对象,又称为迭代器。在Python中,for循环操作的对象就是可迭代对象。说到这里可能会引起一些误会,原因就是我们都知道for循环可以直接遍历列表、元组或字符串等等集合,但是这些数据类型并没有上面提到的__next__()方法,也就是说这些数据类型根本就不遵循迭代器协议,也就意味着列表、元组、字符串或字典等都不是可迭代对象,那么for循环究竟是如何工作的呢?

  首先,验证刚刚说的列表或字符串等等都不是可迭代对象:

那么问题来了,为什么说 for 循环操作的是可迭代对象,然而这些数据类型又不是可迭代对象,那为什么 for 循环能够操作他们呢?下面就来介绍 for 循环的工作原理:

其实,for 循环在处理这些数据前,会调用 __iter__() 方法,将这些数据转化为一个可迭代对象,然后调用可迭代对象的 __next__() 方法,并捕获StopIteration异常,也就实现了遍历完所有数据就会结束,并不会抛出这个异常。

# 利用while循环模拟for循环num_list = [1,2,3,4]# 先调用数据的__iter__()方法,生成一个可迭代对象list_iterable = num_list.__iter__()# 检查可迭代对象的类型,返回 
列表迭代器print(type(list_iterable))# 调用可迭代对象的__next__()方法实现遍历,并捕获StopIteration异常while True: try: print(list_iterable.__next__()) # 遍历列表中的所有元素 --- 1 2 3 4 except StopIteration: break

 

转载于:https://www.cnblogs.com/jonas-von/p/8973612.html

你可能感兴趣的文章
js自定义实用函数总结
查看>>
java内存区域与内存溢出异常
查看>>
点点滴滴的成长[2011-11-1]:理解C#修饰符
查看>>
csrf(跨站请求伪造)
查看>>
高性能MySQL笔记-第1章MySQL Architecture and History-001
查看>>
c# 基本知识 ref 和 out
查看>>
在ubuntu下如何验证文件的MD5码 (转载)
查看>>
嵌入式Linux开发板
查看>>
通过创建制定版本react-native项目解决“Unable to resolve module `AccessibilityInfo` ”的问题...
查看>>
C# 一个例子,北大青鸟的。自己变了下。
查看>>
Error: invalid "instanceof" keyword value Promise的解决方法
查看>>
一,模块,模块导入
查看>>
linux metapost 简介
查看>>
错误检查roswtf
查看>>
React Native Picker (逐个添加数据、array循环添加数据)
查看>>
9.2
查看>>
mysql locks
查看>>
jQuery HTML-删除元素
查看>>
20145317 《信息安全系统设计基础》第八周总结2
查看>>
[Django_1_1]第一个app
查看>>