第四十六节,生成器函数和迭代器

生成器函数

生成器函数就是通过特殊改装过的函数

yield函数关键字,只要函数里写了yield关键字,这个函数就叫做生成器函数

执行函数内部是一旦遇到yield关键字会自动退出函数

生成器函数返回的是一个生成器对象

#!/usr/bin/env python
# -*- coding:utf8 -*-
def asd():
    print(1)
    yield 1
    print(2)
    yield 2
    print(3)
    yield 3
    print(4)
    yield 4
a = asd()
print(a)
# 输出
# <generator object asd at 0x0000008903305990>

 

__next__()获取生成器方法

功能:__next__()用于执行生成器函数里yield关键字之前的代码,和返回yield关键字的返回值也就是去函数里找yield关键字来执行yield之前的代码,一旦遇到yield关键字,退出函数返回yield的返回值,如果没有yield则报错,注意函数里有多个yield,只能获取到第一个,因为函数执行内部时一旦遇到yield关键字就会退出函数,再次运用__next__方法时会从上一次yield退出的地方开始执行函数内部,再次遇到yield关键词会再次退出,依次循环,  所以有几个yield关键字,就可以用几个__next__方法来获取和执行函数内部,

#!/usr/bin/env python
# -*- coding:utf8 -*-
def asd():
    print(11) #函数内部代码
    yield 1  #yield关键字返回值
    print(22)
    yield 2
    print(33)
    yield 3
    print(44)
    yield 4
a = asd()
b = a.__next__()
print(b)

b = a.__next__()
print(b)
# 11  函数内部代码
# 1   yield关键字返回值
# 22  函数内部代码
# 2   yield关键字返回值

 

用生成器函数,生成0到5的数

#!/usr/bin/env python
# -*- coding:utf8 -*-
def range_1(n): #创建生成器函数
    srt = 0 #定义一个值
    while True: #循环
        if srt > n: #判断定义值大于接收值时
            return #定义值大于接收值时退出整个函数
        yield srt #yield关键字返回yield值
        srt += 1 #每一次循环让定义值加1
a = range_1(5)
b1 = a.__next__() #__next__方法获取第一次循环的yield返回值
b2 = a.__next__() #__next__方法获取第二次循环的yield返回值
b3 = a.__next__() #__next__方法获取第三次循环的yield返回值
b4 = a.__next__() #__next__方法获取第四次循环的yield返回值
b5 = a.__next__() #__next__方法获取第五次循环的yield返回值
b6 = a.__next__() #__next__方法获取第六次循环的yield返回值
print(b1,b2,b3,b4,b5,b6)
# 输出
# 0 1 2 3 4 5

 

迭代器

迭代器,就是能用生成器对象,从头到尾迭代执行生成器函数内部得到结果的方法

__next__()方法迭代器

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""生成器"""
def range_1(n): #创建生成器函数
    srt = 0 #定义一个值
    while True: #循环
        if srt > n: #判断定义值大于接收值时
            return #定义值大于接收值时退出整个函数
        yield srt #yield关键字返回yield值
        srt += 1 #每一次循环让定义值加1
a = range_1(5)

"""迭代器"""
b1 = a.__next__() #__next__方法获取第一次循环的yield返回值
b2 = a.__next__() #__next__方法获取第二次循环的yield返回值
b3 = a.__next__() #__next__方法获取第三次循环的yield返回值
b4 = a.__next__() #__next__方法获取第四次循环的yield返回值
b5 = a.__next__() #__next__方法获取第五次循环的yield返回值
b6 = a.__next__() #__next__方法获取第六次循环的yield返回值
print(b1,b2,b3,b4,b5,b6)
# 输出
# 0 1 2 3 4 5

for循环迭代器

for循环底层封装的也是__next__()方法

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""生成器"""
def range_1(n): #创建生成器函数
    srt = 0 #定义一个值
    while True: #循环
        if srt > n: #判断定义值大于接收值时
            return #定义值大于接收值时退出整个函数
        yield srt #yield关键字返回yield值
        srt += 1 #每一次循环让定义值加1
a = range_1(5)

"""迭代器"""
for i in a: #用for迭代循环出生成器对象里的数据
    print(i) #每一次循环打印出数据
# 输出
# 0
# 1
# 2
# 3
# 4
# 5

 

posted @ 2016-09-07 15:29  林贵秀  阅读(273)  评论(0编辑  收藏  举报