生成器

生成器

生成器的定义:

  在函数里面具有yield关键字的函数就是生成器。

  生成器的作用:节省了内存空间

在调用函数的时候就不会执行函数体代码了,变成了生成器。

"""生成器其实也是迭代器"""
def index():
    print('first')
    yield
    print('second')
    
res=index() # 由于函数里面有yield关键字,所以函数就不在执行了,激活成生成器
res.__next__() # 第一次yield,代码走到了第一个yield位置,只是停在那个位置了
res.__next__() # 再次next,代码继续从上一个yield位置开始往下继续走
next(res)
next(res)

要想使用生成器,要用next取值

每next取值代码走到下一个yield处停住

yield后面如果跟很多数据,会以元组的形式返回

自定义range

range函数本身就是一个生成器,在Python3中不会直接造出数据来,做了进一步的优化,节省了空间。

# for 循环内部自带next
## 传两个参数
def my_range(start, stop):
    while start<stop:
        yield start
        start += 1


res = my_range(1,10)
for i in my_range(1,10):
    print(i)
#传三个参数
def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += step
res = my_range(1,10,2)
for i in my_range(1, 10, 2):
    print(i)


# 传一个参数
def my_range(start, stop=None, step=1):
    # 判断传了一个参数还是两个参数
    if not stop:
        stop = start
        start = 0
    while start < stop:
        yield start
        start += step
res = my_range(10)
for i in my_range(10):
    print(i)
    

yield关键字传参问题

只要函数里有yield,就不再执行而是变成了生成器

def eat(name):
    print("%s干饭" % name )
    while True:
        food = yield
        print("%s正在吃%s" % (name, food))
res=eat('kevin')
res.__next__()
res.send('狗不理') # 传值又__next__
res.send('狗不理1') # 传值又__next__

return和yield对比

return

  1.函数遇到return直接终止运行

  2. return也可以返回多个值

yield

  1.函数遇到yield代码不会立即终止运行,而是"停住"

  2.yield也可以返回多个值,以元组的形式返回

  3.yield可以把函数变成生成器,而且还支持传参

生成器表达式 

 

# 答案:C
# 求和
def add(n, i):
    return n + i

# 调用之前是函数 调用之后是生成器
def test():
    for i in range(4):
        yield i

g = test()  # 初始化生成器对象
for n in [1, 10]:
    g = (add(n, i) for i in g)
    """
        第一次循环:n=1
            g = (add(1, i) for i in g)
        第二次循环:
            g = (add(n, i) for i in g)
            g = (add(10, i) for i in  (add(10, i) for i in g))
    """
res = list(g)
print(res)

# A. res=[10,11,12,13]
# B. res=[11,12,13,14]
# C. res=[20,21,22,23]
# D. res=[21,22,23,24]

 

posted @ 2023-06-06 16:07  Maverick-Lucky  阅读(34)  评论(0)    收藏  举报