Fork me on GitHub

迭代器

一、迭代器

  迭代取值的工具,每一次迭代都必须基于上一次的结果

为什么要用迭代器

  迭代器给你提供了一种不依赖于索引取值的方式

怎么用迭代器

  

l = [1,2,3,4,5]
s = 'hello'
n = 0
while n <len(l):
    print(l[n])
    n += 1

需要迭代取值的数据类型

字符串,列表,元祖,集合,字典

 

可迭代对象的定义

  只有通过内置有__iter__方法的都叫做可迭代对象

  补充:针对双下线开头 双下线结尾的方法,推荐读作 双下+方法名

基本数据类型中,是可迭代对象的有

  字符串

  列表

  元祖

  字典

  集合

可迭代对象

  执行内置的__iter__方法得到的就是该对象的迭代器对象

 

二、迭代器对象

    1、内置有__iter__方法

    2、内置有__next__方法

    迭代器一定是可迭代对象

迭代器取值

l = [1,2,3,4]
iter_l = l.__iter__()#生成一个迭代器对象

print(iter_l.__next__())  # 迭代器取值 调用 __next__
print(iter_l.next__())
...
#可以一直取,但是取完了 就会直接报错

    迭代器对象无论执行了多少次 __iter__方法得到的还是迭代器对象本身

迭代器取值的异常处理:  

while Ture:
    
    try:
            print(lter_d.__next__())
    except  StopeTeration:  #报错类型
            break

 迭代器取值的特点

  只能往后取 不能往后退

 

总结

  可迭代对象:内置有__iter__方法的

  迭代器对象:即内置有__iter__也内置有__next__方法

迭代取值:

  优点

    1.不依赖索引取值

    2.内存中永远只占一份空间,不会导致内存溢出

  缺点

    1.不能够获取指定的元素

    2,取完后之后会报stopIteration错

三、for循环的本质

  for循环的本质

    1.将in后面的对象调用__iter__转成可迭代对象

    2.调用__next__迭代取值

    3.内容有异常捕获StopIteration,当__next__报这个错 自动结束循环

四、生存器

    用户自定义的迭代器

yield关键字

  函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行

列子

  初始化函数,将函数变成迭代器

def func()
  print('frist')
  yield

yield 后面跟的值就是调用迭代器__next__方法你能得到的值,既可以返回一个值也可以返回

多个值,并且多个值也是按照元组的形式返回

 

def func():
    print('second')
    yield  777
    print('third')
    yield  888
    print('forth')
    yield
    yield
g = func()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())  #没有值得话就是None

  range生成器

  

def my_range(start,end,step):  # 实现range功能
   while start < end:
       yield start
       start += step
for j in my_range(1,100,2):
    print(j)

了解知识点

    yield支持外界为其传参

当函数内有yield关键字的时候,调用该函数不会执行函数体代码,而是将函数变成生成器

yield

  1.帮你提供了一种自定义生成器方式

  2.会帮你将函数的运行状态暂停住

  3.可以返值

与return之间的异同点

  相同点:都可以返回值,并且都可以返回多个值

  不同点:

      yield可以返回多次值而return只能返回一次函数立即结束

      yield还可以接受外部传入的值

五、生成式表达式

表达式 

  res = (i for i in range(1,100)if i !=4)

  print(res)

生成器不会主动执行一行代码

必须通过__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循环g=(add(n,i) for i in test())

    # 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test()))
print(n)
res=list(g)

"""
for i in (add(10,i) for i in test()):  会执行所有的生成器内部的代码
    add(n,i)
"""




#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]  答案
#D. res=[21,22,23,24]

 

 

 

 

 

 

 

 

      

 

posted @ 2019-07-15 22:50  杂货店的音乐  阅读(160)  评论(0编辑  收藏  举报