简看pythong迭代器和生成器

一、迭代器

什么是迭代?

  迭代:更新换代的过程,每次的迭代都必须基于上一次的结果

  迭代器:迭代取值的工具

为什么要用?

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

  ps:需要迭代取值的数据类型:str、list、tuple、dict、set。

 

二、什么是可迭代对象 

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

  可迭代对象有:str、list、tuple、set、dict

         文件对象(执行内置__iter__之后还是本身,没有任何变化),因为文件对象本身就是迭代器对象

 

三、什么是迭代器对象 (迭代器对象:既内置有__iter__也内置有__next__方法)

  1、可迭代对象执行内置的__iter__方法后,得到的就是该对象的迭代器对象

    内置__next__方法的
    内置__iter__方法

  ps:迭代器对象一定是可迭代对象,而迭代对象不一定是迭代器对象

 

  2、生成一个迭代器对象用.__iter__()

    迭代器取值调用.__next__()  #  如果迭代器值取完了,直接报错 StopIteration

    防止取值报错的方法:用 trt 和 except StopIteration,当无值可取吗,反馈输出条件

      try:

        print(iter_d.__next__())

      except StopIteration

        print('无值可取')

        break   

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

  4、迭代取值:

    __next__

      优点:1、不依赖于索引取值

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

      缺点:1、不能获取指定的元素

         2、去完之后会报StopIteration错

四、for循环内部原理:

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

  2、调用__next__迭代取值

  3、内部有异常捕获StopIteration,当__next__报错,自动循环结束

 

五、生成器及表达式

  定义:用户自定义的迭代器,本质是生成器(生成器表达式和列表生成式类似,通常被误认为元组生成式。)

  5.1、把函数变迭代器要点:  

  def func():

    yield 123,234

  g = func  #生成器初始化

    1、如果函数内有yild关键字,那么括号加执行函数的时候不会出发函数代码的执行

    2、yield后面跟的值就是调用迭代器__next__方法得到的值,可返回多个值,并且是按元组的形式返回

ps:

yield
1.帮你提供了一种自定义生成器方式
2.会帮你将函数的运行状态暂停住
3.可以返回值
# yield支持外界为其传参
def dog(name):
    print('%s 准备开吃'%name)
    while True:
        food = yield
        print('%s 吃了 %s'%(name,food))
# def index():
#     pass

# 当函数内有yield关键字的时候,调用该函数不会执行函数体代码
# 而是将函数变成生成器
# g = dog('egon')
# g.__next__()  # 必须先将代码运行至yield 才能够为其传值
# g.send('狗不理包子')  # 给yield左边的变量传参  触发了__next__方法
# g.send('饺子')
View Code

 

  5.2、列表生成式特点:

    res = ( i for i in range(1,1000) if i !=4)  #  生成器表达式

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

    必须通过__next__出发代码的运行

 

posted @ 2019-07-15 17:33  小王八+1  阅读(196)  评论(0编辑  收藏  举报