iter方法是python的一个内建方法,它会返回一个迭代器对象。它定义如下
iter(o[, sentinel])
第一个参数o可以是一个可迭代对象,也可以是一个可调用对象。
当参数o是可迭代对象时,第二个参数可省。这里又分为两种情况。
- 如果参数o实现了__iter__方法,则直接调用该方法,创建迭代器。
- 如果参数o没有实现__iter__方法,那么它比是一个序列对象。iter方法根据该序列对象诱导出一个迭代器。
如果参数o是一个可调用对象时,iter方法返回的迭代器工作原理如下。
每次调用迭代器的next方法时,最终都会调用o方法。此时第2个参数sentinel必须给定。当o方法的返回值与sentinel相同时,抛出StopIteration异常。
一些例子
1. 由集合构造迭代器
myiter = iter([1,2,3])
myiter.next()
myiter.next()
myiter.next()
myiter.next()
输出结果
1
2
3
Traceback (most recent call last):
File "test.py", line 27, in <module>
print myiter.next()
StopIteration
2. 由序列对象构造迭代器。
myiter = iter(MyRange(1, 4))
print myiter.next()
print myiter.next()
print myiter.next()
print myiter.next()
MyRange的定义见
博文。
3. 由迭代器对象构造迭代器。
myiter1 = MyIterator(1, 4)
myiter2 = iter(myiter1)
print myiter1 == myiter2
MyIterator的定义见
博文。上面代码输出的值为True。
4. 由可调用对象构造迭代器。
myiter1 = MyIterator(1, 4)
myiter2 = iter(myiter1.next, 4)
print myiter2.next()
print myiter2.next()
print myiter2.next()
print myiter2.next()
输出结果
1
2
3
Traceback (most recent call last):
File "test.py", line 27, in <module>
print myiter.next()
StopIteration
有兴趣的读者可以尝试下面代码的输出结果。
myiter2 = iter(myiter1.next, 3)
print myiter2.next()
print myiter2.next()
print myiter2.next()
print myiter2.next()
myiter2 = iter(myiter1.next, 5)
print myiter2.next()
print myiter2.next()
print myiter2.next()
print myiter2.next()