最近在自己写python程序时,迭代器这一块遇到了些问题。网上找了资料终于把问题解决了,现在分享如下。

python的for循环

我们知道python的for循环在风格上与C、C++、JS 等语言的for循环风格不太一样。

这是一个JS的for循环:

这是一个python的for循环:

很显然python的for循环中,对于每个待循环的变量,并没有对其进行下标索引,而是直接对每个变量进行循环迭代。

可迭代对象是任何可以用for循环遍历的东西。可迭代对象可以被循环遍历,任何可以被循环遍历的东西都是可迭代对象。

序列是一种很常见的可迭代对象。列表,元组和字符串都是序列。

Python中的很多东西都是可迭代对象,但并非所有的可迭代对象都是序列。集合,字典,文件和生成器都是可迭代对象,但这些都不是序列。

迭代器驱动for循环

Python的for循环在底层不使用索引。Python的for循环使用迭代器。迭代器驱动可迭代对象。你可以从任何可迭代对象中获得一个迭代器。你可以使用迭代器手动循环遍历可迭代对象。

使用Python的内置iter函数向每个可迭代对象要一个迭代器。将一个可迭代对象传递给iter函数就返回一个迭代器,无论我们操作什么类型的可迭代对象。一旦我们有了迭代器,我们就可以用内置的next函数来获取它的下一个元素。

迭代器协议就像是在说“如何在Python中循环遍历可迭代对象”。它本质上是定义iter和next函数在Python中的工作方式。Python中所有形式的迭代都是由迭代器协议驱动的。

迭代器的惰性

惰性指的是python的迭代是需要驱动的,比如上面的用next()来获取下一个变量直到迭代器被耗尽。因此在编程中我们会经碰到这种问题——迭代器被耗尽,因为迭代器是一次性的,迭代结束以后迭代器就清空了或者每迭代一个变量,其对应的迭代器中的该变量就被清空了。因此必须注意迭代器一次性使用和惰性这两个主要的特性。

 

补充一些自己遇到过的相关问题:

1.自动迭代问题

字符串本身是可迭代对象,因此可以通过迭代来实现一些功能,比如字符串转化为数字。

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
s = '1234'
DIGITS[s]

如上所示,这样并不会得到字符转为数字的结果。因为Python的迭代是需要迭代器来驱动的。

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
str = '1234'
s = 0
j = len(str)-1
for i in str:
    s = s + DIGITS[i]*(10**j)
    j-=1
print(s)

需要加入迭代器for来实现字符串的元素的逐个迭代。