Python之路【第二十八篇】:生成器与迭代器

#!/usr/bin/env python
# -*- coding:utf-8 -*-

#只要函数的代码里面出现了yield关键字,这个函数就不再是一个普通的函数了,叫做生成器函数
#执行生成器函数,获取到的东西就叫做生成器
#生成器的一个好处就是无需在内存中创键所有东西,什么时候需要什么时候创建
'''
def fun():
    yield 1
    yield 2

r = fun()
'''
#fun是生成器函数,r是生成器,生成器具有生成一些东西的能力

###################生成器原理#######################
'''
#定义一个生成器函数
def fun():
    print(11)
    yield 1

    print(22)
    yield 2

    print(33)
    yield 3

#执行生成器函数,仅仅获取了一个生成器,不会输出任何值
r = fun()


#执行生成器的__next__方法,碰到yield就退出,这里的yield相当于普通函数里面的return,但是不一样,yield可以保存上一次的执行状态,而return 是直接退出的返回值是第一个yield的值
ret = r.__next__()
print(ret)

#再次执行生成器的__next__方法,返回值是第二个yield的值
ret = r.__next__()
print(ret)
'''
############################################################



########################生成器实现#######################

def xrange(n):
    start = 0
    while True:
        if start > n:
            return
        yield start
        start += 1

obj = xrange(5)

n1 = obj.__next__()
n2 = obj.__next__()
n3 = obj.__next__()
n4 = obj.__next__()
n5 = obj.__next__()

print(n1,n2,n3,n4,n5)
#!/usr/bin/env python
# -*- coding:utf-8 -*-

#生成器仅仅具有一种生成能力
#如和将一个函数变为生成器,在函数里面出现了yield,这个函数就不再是普通的函数了,叫生成器函数,执行这个生成器函数就会得到一个生成器
#迭代器具有访问能力,迭代器是一个一个进行迭代,只能一个一个往后找,不能往前找
#迭代器特点:
#访问者不需要关心迭代器内部的结构,仅需要通过next()方法不断去取下一个内容
#不能随机的访问集合中的某个值,只能从头到尾依次访问
#访问到一半时,不能往后退
#便于循环比较大的数据集合,节省内存

#迭代器本质上也是通过next一个一个去取,我们在用的时候直接用for循环迭代就可以了
#生成器需要自己写,而迭代器直接用for循环就可以了

def xrange(n):
    start = 0
    while True:
        if start > n:
            return
        yield start
        start += 1

for x in xrange(10):
    print(x)

生成器与迭代器综合练习:

#! usr/bin/env python
# -*-coding = utf-8 -*-

#生成器

def range(n):
    start = 0
    while True:
        if start < n:
            yield start
            start += 1
        else:
            return
#迭代器
for i in range(10):
    print(i)  

  对于生成器的理解要注意,在例程中,我们使用的是一些整数,既然是生成器,那么可不可以生成别的东西,比如类似于列表或者字典这样的数据结构,可以,如:

li = [1,2,3,4,5]
for item i li:
    yield{
        'index':item
    }

 比如上面类似的写法,也是个生成器,不过生成器中的数据结构是字典形式的 

  

 

posted @ 2018-07-03 15:52  RongHe  阅读(153)  评论(0编辑  收藏  举报