13,迭代器 和 生成器

迭代器

什么是可迭代对象?

内部含有__iter__方法就是可迭代对象。

什么事迭代器?

内部含有__iter__和__next__方法的就是迭代器。

实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。

迭代器取值有两种方法。

第一种 (print(la.__next__()))

l = [1, 2, 3]
la = l.__iter__()
print(la.__next__()) #取值,执行一次取一个值。
print(la.__next__()) #取值,执行一次取一个值。
print(la.__next__()) #取值,执行一次取一个值。

第二种方法 for循环

l = [1, 2, 3]
la = l.__iter__()
print([a for a in la])
print('__next' in dir(la))

如何判断是不是迭代器或可迭代对象(有两种方式)

第一种

__iter__ in dir(数据类型)

#str类型
print('__iter__'in dir('laonanhai')) # True

#列表类型
print('__iter__' in dir([1,2,3,4])) #True

#字典类型
print("__iter__" in dir({'alex': 1})) #True

#int类型
print("__iter__" in dir(1)) #False

#bool类型
print("__iter__" in dir(bool)) #False

#set类型
print("__iter__" in dir({4}))

#文件句柄,既是可迭代对象,也是迭代器。
with open('log',encoding='utf-8') as f1:
print("__iter__" in dir(f1))  #True
print("__next__" in dir(f1))  #True
print(isinstance(range,Iterator))#False
print(isinstance(range,Iterable))#False
print('__iter__' in dir(range))#True
print('__next__' in dir(range))#False
 

第二种方法(需要调用一个模块模块名字叫from collections import Iterable)

from collections import Iterable
l1 = 'str类型'
print(isinstance(l1,Iterable)) #True
l2 = [123,456]
print(isinstance(l2,Iterable))#True
l3 = {3:1}
print(isinstance(l3,Iterable))#True
l4 = {'a'}
print(isinstance(l4,Iterable))#True
l5 = bool
print(isinstance(l5, Iterable))#False
l6 = 3
print(isinstance(l6, Iterable))#False
with open('log',encoding='utf-8') as f1:
    print(isinstance(f1, Iterable))#True

 for 循环有一个机制:

1,将可迭代对象转化成迭代器。

2,利用__next__进行取值。

3,用try一场处理方法防止报错。(万能的rty都能解决)

例如:

l = [1, 2, 3, 4, 5]
l_obj = l.__iter__()
while True:
    try:
        print(l_obj.__next__())
    except Exception:
        break

迭代器总结:

什么是迭代器:

1 节省内存

2,满足惰性机制

3,取值过程不可逆

可以使用__next__()来取值

可以for循环取值

生成器:

生成器的本质也是迭代器,生成器是自己用python写的迭代器。

1,通过生成器函数构造。

2,通过生成器推导式构建。

通过函数构建如下:

def func1():
    print(111)
    print(222)
    print(444)
    yield 555
    print(666)
    yield 555

a = func1()
print(a.__next__())
print(a.__next__())
每执行一次print(a.__next__()),就会执行第一个yield以前的值。
凡是带yield的都是迭代器。
def cloth2():
    for i in range(1,10001):
        yield '衣服',i
a = cloth2()
for i in range(1,51):
    print(a.__next__())
for i in range(1,151):
    print(a.__next__())#每次自增150
    print(a.__next__())#每次自增150
    print(a.__next__())#每次自增150
    print(a.__next__())#每次自增150
    print(a.__next__())#每次自增150
def func1():
    count = yield 222
    print(count)
    yield 777
    yield 888
    return 888
g_obj = func1()
print(g_obj.__next__())
print(g_obj.send('wusir'))
print(g_obj.send('wusir'))

send

def func1():
    count = yield 222
    print(count)
    yield 777
    yield 888
    print(2222)
    yield 444
g_obj = func1()
print(g_obj.__next__())
print(g_obj.send('wusir'))
print(g_obj.send('111'))
print(g_obj.send('wusir'))
1,send 具有next功能。
2,send 可以给上一个yield传值。
3, 第一个取值不能使用send.
4,最后一个yield不会得到send的值。、

猜你喜欢

转载自www.cnblogs.com/ZJGG/p/9046007.html
今日推荐