码迷,mamicode.com
首页 > 编程语言 > 详细

《Python学习之路 -- Python基础之迭代器及for循环工作原理》

时间:2018-04-30 15:38:48      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:检查   nbsp   必须   为什么   com   字符   for 循环   数据类型   学习   

  提到迭代器不得不说迭代器协议,迭代器协议是指:对象必须提供一个__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__()
# 检查可迭代对象的类型,返回 <class ‘list_iterator‘>  列表迭代器
print(type(list_iterable))
# 调用可迭代对象的__next__()方法实现遍历,并捕获StopIteration异常
while True:
    try:
        print(list_iterable.__next__())  # 遍历列表中的所有元素  --- 1  2  3  4
    except StopIteration:
        break

 

《Python学习之路 -- Python基础之迭代器及for循环工作原理》

标签:检查   nbsp   必须   为什么   com   字符   for 循环   数据类型   学习   

原文地址:https://www.cnblogs.com/jonas-von/p/8973612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!