迭代器

迭代器

''''
'''
'''
什么是迭代器
    迭代:更新换代的过程,每次迭代必须基于上次迭代的结果
    迭代器:迭代取值的工具

可以迭代取值的数据类型
    字符串
    列表
    元组
    集合
    字典
    
如何判断是否是可迭代对象
    内置方法有.__iter__的数据就是可迭代数据
 







如何判断迭代器对象?
    内置方法有.__iter__
              .__next__  两种内置方法的称为迭代器对象 
文件属于迭代器对象

迭代器对象不管执行多少次.__iter__ 最后还是迭代器本身   

l = [1,2,3,4]
iter_f = l.__iter__()
print(iter_f is iter_f.__iter__().__iter__().__iter__().__iter__())  # True


内置方法.__iter__ 就是将可迭代对象转换为迭代器对象

l = [1,2,3,4] 
iter_l = l.__iter__()
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
# 迭代次数超过迭代器对象中元素个数时,会报错StopIteration


异常处理
l = [1,2,3,4]
iter_l = l.__iter__()
while True:
    try:
        print(iter_l.__next__())
    except StopIteration:
        print('取值结束')
        break
        
迭代器取值的特点:
    只能往后依次取 不能返回再次取值

'''

for循环原理

'''
for 循环的本质
    for循环是将in后面的对象调用.__iter__ 转换成迭代器对象
    调用__next__ 进行迭代取值
    内部有异常捕获StopIteration  当__next__报错这个错时,直接结束循环

迭代取值的优缺点
    优点:不依赖索引取值
         内存中只占一个空间,内存不会溢出
         
    缺点:不能索引取值
         全部取完再取会报StopIteration
         
'''

生成器

'''
生成器:就是 用户自己定义的迭代去,本质上就是迭代器
def func():
    print('hello')
    yield
在函数定义中出现yield就是代表生产器
但是函数名加括号 不会触发函数体代码的运行

'''


def func():
    print('cly')
    yield 1
    print('clysb')
    yield 1,2
    print('clydsb')
    yield 1,2,3,4,5

f = func()  # 生成器初始化,将函数变成迭代器
print(f.__next__())
print(f.__next__())
print(f.__next__())

'''
yield关键字后面跟的值,就是__next__需要返回的值
yield不能结束函数,但能暂定函数,需要再次__next__取值才会继续执行
yield后 返回多个值时,会将多个值以元组的形式返回

yield 与 return的相同点在于 都能返回值,返回多个值都是以元组的形式返回

yield 与 return的不同点在于 return能直接结束函数 , yield只是暂停函数
                            能从外部给yield传值

def func():
    print('今天学了啥')
    while True:
        study = yield
        print(study)
f = func()
f.__next__()
f.send('迭代器')  # 内部共做了两个步骤 给yield左边的变量传参,在执行f.__next__一次
# f.__next__()


'''

'''
生成器表达式:
    f = (i for i in range(10) if i != 4)
    这是一个生成器,并不是元组生产器
生产器不会主动执行任何一行代码,
必须通过.__next__触发代码执行
'''
def add(n,i):
    return n+i
def test():
    for i in range(4):
        yield i
g=test()

for n in [1,10]:
    g=(add(n,i) for i in g)
# 第一次for循环 add(1,i) for i in test()
# 第二次for循环 add(10,i) for i in (add(1,i) for i in test())
print(n)
res=list(g)

 

posted @ 2019-07-15 19:12  Nmdlao  阅读(115)  评论(0编辑  收藏  举报