欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-09 15:24:02
...
#!/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
    }

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