python函数五(迭代器,生成器)

一。迭代器

1.可迭代对象(只含有__iter__方法的数据是可迭代对象)

常见的可迭代对象:str list tuple dict set range

1.1什么是可迭代对象?

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

s = 'alex'
l = [1,2,3,4,5]
print('__iter__' in dir(s))
print('__iter__' in dir(l))
# 输出结果:
# True
# True

2.迭代器(含有__iter__方法,并且含有__next__方法的数据是迭代器)

常见的迭代器:文件句柄

2.1迭代器的取值

s = 'alex'
l = [1,2,3,4,5]
s1 = s.__iter__()
print(s1.__next__())
print(s1.__next__())
print(s1.__next__())
# 输出结果: a   l   e

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

for循环的机制就是完美的运用的迭代器
内部含有__iter__方法,他会将可迭代对象先转化成迭代器。

然后在调用__next__方法,

他有异常处理的方法.

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

3.可迭代对象与迭代器的关系

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

s = 'alex'
l = [1,2,3,4,5]
l1 = l.__iter__()     #迭代器
print(l1)   #iterator  遵循迭代器协议
# 输出结果:<list_iterator object at 0x00000156B0EC7630>

判断是可迭代对象还是迭代器

方法二(isinstance与type类似,但是功能比type更强大

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

二。生成器

生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.
1,可以用生成器函数
2,可以用各种推导式构建迭代器.
3,可以通过数据转化.

def gener():
    print(111)
    yield 222
    count = yield 333
    print(count)
    yield 444
    yield 555
g = gener()
print(g)
print(g.__next__())
print(g.__next__())
print(g.send('aaa'))
print(g.__next__())
# 输出结果:
# <generator object gener at 0x0000014CDE5B1BF8>
# 111
# 222
# 333
# aaa
# 444
# 555

4.send
1)send 和next功能一样
2)给上一个yiled 整体发送一个值
send不能给最后一个yield发送值
获取第一个值的时候,不能用send 只能用next

    

原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8422991.html