生成器,迭代器

一、迭代器

  1、可迭代协议

  查看类中定义好的所有方法:dir 函数

print(dir('qwe'))     打印对象中的方法和函数

print(dir(str))       打印类中声明的方法和函数

  2、内部含有__iter__方法的对象就叫做可迭代对象,可迭代对象遵循可迭代协议。

     可迭代对象不能取值,因为内部不含有__next__方法

  3、如何判断是否为可迭代对象。            print( '__iter__' in dir( ) )

 

二、生成器

  1、生成器的实质就是迭代器

  在python中有三种方式来获取生成器:

    1、通过生成器函数

    2、通过各种推导式来实现生成器

    3、通过数据的转换获取生成器

def func():
    print(111)
    return 222
ret = func()     #函数调用
print(ret)
结果: 111
       222

将函数中的return换成yield就是生成器

def func():
    print(111)
    yield 222
ret = func()     #获取生成器
print(ret)
结果:<generator object func at 0x00000000025E7308>

现在执行函数的时候就不是函数的执行了,而是获取一个生成器

def func():
    print(111)
    yield 222
ret = func()
print(ret.__next__())   __next__()执行生成器
结果: 111
      222
 yield 和return 区别
1. 如果函数中包含了yield, 这个函数是一个生成器函数. 执行函数的时候是: 获取生成器
2. 生成器执行__next__(). 执行到下一个yield
3. yield的作用和return基本相同. 但是,只负责返回. 不会结束函数
4. return,结束函数.

当程序运行完最后一个yield,后面继续运行__next__()会报错

  2、send 和__next__() 的区别

    1、send 和__next__() 都是让生成器向下走一次

    2、send可以给上一个yield位置传递值,不能给最后一个yield位置传递值,第一次执行生成器代码不能使用send()

def jiaoyou():
    print("开始旅游")
    address1 = yield "告诉我你想去哪里"
    print(""+str(address1))
    address2 = yield "你还想去哪儿?"
    print("还想去"+ str(address2))
    yield "结束旅行"
gen = jiaoyou()         #获取生成器
ret = gen.__next__()    # 执行到第一个yield 获取到返回值
print("ret=", ret)
ret2 = gen.send("少林寺")  #给address1传递‘少林寺’
print("ret2 = ", ret2)
ret3 = gen.send("武当山")  #给address2传递‘武当山’
print("ret3 = ", ret3)

结果:
开始旅游
ret= 告诉我你想去哪里
去少林寺
ret2 =  你还想去哪儿?
还想去武当山
ret3 =  结束旅行

 

posted @ 2018-06-19 16:51  小小猎魔人  阅读(134)  评论(0编辑  收藏  举报