迭代器和生成器

迭代器:

什么是可迭代对象?

方法1:dir(被测对象)  如果里面含有 __iter__  则是可迭代对象

s = 'abc'
print(dir(s))
#输出:['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', .......]
# 如果此列表里面有 __iter__,则是可迭代对象
s = 'abc'
print('__iter__' in dir(s))
#输出True  则代表是可迭代对象

方法2: 测试他是迭代器还是可迭代对象

from collections import Iterable
from collections import Iterator
l = [1,2,3]
l_iter = l.__iter__()
print(isinstance(l,Iterable))           #True
print(isinstance(l,Iterator))         #False
print(isinstance(l_iter,Iterator))      #True
print(isinstance(l,list))            #True

可迭代对象 转换成 迭代器:

可迭代对象.__iter__()  ---> 迭代器

s = 'abc'
s = s.__iter__()
print(s)
#输出:<str_iterator object at 0x000000029B515588>

迭代器取值:

s = 'abcd'
s = s.__iter__()
print(s.__next__())        #用next,写一个打印一个
print(s.__next__())
#输出:    a
#        b
l = [1,2,3,4]
print(dir(l))                   #打印:['__add__', '__class__', '__contains__', '__delattr__',....]
print('__iter__' in dir(l))     #输出:True   表示__iter__ 在dir(l)里面
print('__next__' in dir(l))     #输出:False  表示__next__ 不在dir(l)里面
liter = l.__iter__()             #把列表转换成迭代器
print(liter.__next__())          #输出:  1    
print(liter.__next__())          #输出:2
print(liter.__next__())        #输出:3
print(liter.__next__())       #输出:4

可迭代对象和迭代器的区别:

只含有__iter__方法的数据是可迭代对象
含有__iter__方法,并且含有__next__方法的数据是迭代器

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

生成器:

生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.

1,可以用生成器函数
2,可以用各种推导式构建迭代器.
3,可以通过数据转化.

def gener():
    print('aaa')
    yield 222
    print('bbb')
    yield 333
    print('ccc')
g = gener()
print(g.__next__())    #输出:aaa   222
print(g.__next__())    #输出:bbb   333
#yiled 返回给调用者值,并将指针停留着当前位置.

return yield 区别:
return 返回给调用者值,并结束此函数.
yiled   返回给调用者值,并将指针停留着当前位置.

send:

1,send 和next功能一样
2, 给上一个yiled 整体发送一个值

  send不能给最后一个yield发送值

  获取第一个值的时候,不能用send 只能用next

def gener():
    yield 222
    count = yield 333
    print('-------->',count)
    yield 'aaa'
    yield 'bbb'
g = gener()
print(g.__next__())
print(g.__next__())
print(g.send('AAAA'))
print(g.__next__())
# 输出:
#    222
#    333
#    --------> AAAA
#    aaa
#    bbb
原文地址:https://www.cnblogs.com/pygg/p/8423765.html