Day13

1、迭代器

内部含有__iter__方法的对象就叫做可迭代对象

可迭代对象遵循可迭代协议

for循环可以循环的就是可迭代对象

   可迭代对象:str,list,set,dict,tuple,range,

   迭代器:f1文件句柄

如何判断 两种方式

s='laonanhai'
print('__iter__' in dir(s))
l=[1,2,3,4]
from collections import Iterable
print(isinstance(l,Iterable)) #True print(type(l)) #class list print(isinstance(l,list)) #True

迭代器

l1=[1,2,3]

可迭代对象转化成迭代器:可迭代对象.__iter__()    --->迭代器

迭代器不仅含有__iter,还含有__next__ 遵循迭代器协议

l1_obj=l1__iter__()  #迭代器
print('__iter__' in dir(l1_obj))
print('__next__' in dir(l1))
print('__next__' in dir(l1_obj))
print(l1_obj.__next__())
for i in l1_obj:
    print(i)

判断迭代器:

print('__iter__' in dir(s))

print('__iter__' in dir(s))

print(isinstance(s,Iterable))

迭代器的好处:

1、节省内存空间

2、满足惰性机制

3、不能反复取值,不可逆

#1、将可迭代对象转化成迭代器
#2、内部使用__next__方法取值
#3、运用了异常处理去处理报错
l2=[1,2,3,4,5,6,7,8]
l2_obj=l2.__iter__()
while True:
    try:
        i=l2_obj.__next__()
        print(i)
        except Exception:
            break

2、生成器

生成器本质上是迭代器

l=[1,2,3]

l.__iter__()

生成器的产生方式:

1、生成器函数构造

2、生成器推导式构造

3、数据类型的转化

def func1():
    print(111)
    print(222)
    print(333)
    yield 666
    yield 555
    yield 777print(g.__next__())
print(g.__next__())
print(g.__next__())

第一:函数中只要有yield那他就不是一个函数,而是一个生成器

第二:g称为生成器对象

def func1():
    for i in range(1,10001):
        yield '老男孩校服%d号' %i
g=func1()
for i in range(50):
    print(g.__next__())
for j in range(150):
    print(g.__next__())
l1=[i for i in range(1000)]
print(l1)

send:next和send功能一样,都是执行一次

send可以给上一个yield赋值

def generator():
    print(123)
    content = yield 666
    print(content)
    print(456)
    yield 777
g = generator()
g.__next__()
g.send('hello')
from collections import Iterable
原文地址:https://www.cnblogs.com/a352735549/p/8709947.html