python特性(三):iter方法

转自  http://blog.csdn.net/hedan2013/article/details/55002389

iter方法是python的一个内建方法,它会返回一个迭代器对象。它定义如下

 

[python] view plain copy
 
  1. iter(o[, sentinel])  


第一个参数o可以是一个可迭代对象,也可以是一个可调用对象。

 

当参数o是可迭代对象时,第二个参数可省。这里又分为两种情况。

 

  • 如果参数o实现了__iter__方法,则直接调用该方法,创建迭代器。
  • 如果参数o没有实现__iter__方法,那么它必须是一个序列对象。iter方法根据该序列对象诱导出一个迭代器。

 

如果参数o是一个可调用对象时,iter方法返回的迭代器工作原理如下。

每次调用迭代器的next方法时,最终都会调用o方法。此时第2个参数sentinel必须给定。当o方法的返回值与sentinel相同时,抛出StopIteration异常。

 

一些例子

 

1. 由集合构造迭代器

 

[python] view plain copy
 
  1. myiter = iter([1,2,3])  
  2. myiter.next()  
  3. myiter.next()  
  4. myiter.next()  
  5. myiter.next()  

 

 

输出结果

 

[plain] view plain copy
 
  1. 1  
  2. 2  
  3. 3  
  4. Traceback (most recent call last):  
  5.   File "test.py", line 27, in <module>  
  6.     print myiter.next()  
  7. StopIteration  


2. 由序列对象构造迭代器。

 

 

[python] view plain copy
 
  1. myiter = iter(MyRange(1, 4))  
  2. print myiter.next()  
  3. print myiter.next()  
  4. print myiter.next()  
  5. print myiter.next()  

MyRange的定义见博文。

 

 

3. 由迭代器对象构造迭代器。

 

[python] view plain copy
 
  1. myiter1 = MyIterator(1, 4)  
  2. myiter2 = iter(myiter1)  
  3. print myiter1 == myiter2  

MyIterator的定义见博文。上面代码输出的值为True。

 

 

4. 由可调用对象构造迭代器。

 

[python] view plain copy
 
  1. myiter1 = MyIterator(1, 4)  
  2. myiter2 = iter(myiter1.next, 4)  
  3.   
  4. print myiter2.next()  
  5. print myiter2.next()  
  6. print myiter2.next()  
  7. print myiter2.next()  

 

 

输出结果

 

[plain] view plain copy
 
  1. 1  
  2. 2  
  3. 3  
  4. Traceback (most recent call last):  
  5.   File "test.py", line 27, in <module>  
  6.     print myiter.next()  
  7. StopIteration  

 

 

 

有兴趣的读者可以尝试下面代码的输出结果。

 

[python] view plain copy
 
    1. myiter2 = iter(myiter1.next, 3)  
    2. print myiter2.next()  
    3. print myiter2.next()  
    4. print myiter2.next()  
    5. print myiter2.next()  
    6. myiter2 = iter(myiter1.next, 5)  
    7. print myiter2.next()  
    8. print myiter2.next()  
    9. print myiter2.next()  
    10. print myiter2.next()  
posted @ 2017-10-07 18:52  alxe_yu  阅读(538)  评论(0)    收藏  举报