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

Python迭代器和生成器

时间:2018-02-06 20:27:37      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:cti   协议   转换   span   cep   __next__   blog   size   bsp   

一、迭代器

现在已知的可迭代对象:str list tuple dict set range和文件句柄。

但是,什么是可迭代对象?可迭代对象的测量方法。

方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.

下面字符串S就是可迭代对象:

s= ‘abcdef‘
print(‘__iter__‘ in dir(s))
可迭代对象,iterable 与迭代器有什么关系?可迭代对象可以转换成迭代器(可迭代对象.__iter__())。
s1 = s.__iter__()
print(s1) #iterator  遵循迭代器协议
 迭代器的取值:(迭代器.__next__())
#迭代器取值:
s2 = ‘abcd‘
s3 = s2.__iter__()
print(s3.__next__())   #a
print(s3.__next__())   #b
只含有__iter__方法的数据是可迭代对象,含有__iter__方法,并且含有__next__方法的数据是迭代器
#迭代器的判断:有__iter__方法,并且含有__next__方法的数据是迭代器
l = [1,2,3,4]
print(‘__iter__‘ in dir(l))  #True
print(‘__next__‘ in dir(l))  #False
liter = l.__iter__()
print(‘__next__‘ in dir(liter))  #True
print(liter.__next__())     #1
print(liter.__next__())     #2
print(liter.__next__())     #3
print(liter.__next__())     #4

 方法二:测量他是可迭代的还是迭代器:

# 方法二 测试他是迭代器还是可迭代对象
l = [1,2,3]
l_iter = l.__iter__()
from collections import Iterable
from collections import Iterator
print(isinstance(l,Iterable))      #True
print(isinstance(l,Iterator))      #False
print(isinstance(l_iter,Iterator)) #True
print(isinstance(l,list))          #Truedied  

 迭代器的意义:

   1)、迭代器节省内存.
   2)、迭代器惰性机制.
   3)、迭代器不能反复,一直向下执行.

 for 循环的内部机制:

    1)、内部含有__iter__方法,他会将可迭代对象先转化成迭代器.
    2)、然后在调用__next__方法.
    3)、for循环有异常处理的方法. 

#用迭代器来表示for循环的内部机制
for i in [1,2,3]:
    print(i)
l = [1,2,3]
l_iter = l.__iter__()
while True:
    try:
        print(l_iter.__next__())
    except StopIteration:
        break

 二、生成器 

 


 

 

 

Python迭代器和生成器

标签:cti   协议   转换   span   cep   __next__   blog   size   bsp   

原文地址:https://www.cnblogs.com/Ming-Hui/p/8423332.html

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