首页 > 其他分享 >生成器

生成器

时间:2023-06-06 16:25:35浏览次数:26  
标签:res 生成器 yield next start range

生成器

生成器的定义:

  在函数里面具有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]

 

标签:res,生成器,yield,next,start,range
From: https://www.cnblogs.com/Lucky-Hua/p/17460861.html

相关文章

  • MybatisPlus代码生成器
    MybatisPlus代码生成器这里讲解的是新版(mybatis-plus3.5.1+版本),旧版不兼容官方文档:https://baomidou.com/(建议多看看官方文档,每种功能里面都有讲解)https://cloud.tencent.com/developer/article/2119707配置这里的配置表格和官方文档一致手动配置代码生成器建表,插入数......
  • 生成器
    生成器就是节省空间,在函数里出现关键字yield,函数就变成了生成器,就不再执行函数了想要使用生成器,只需要使用next取值即可每next取一次值代码走到下一个yield处停止yield后面如果有很多数据,会以元组的形式输出defindex():print('执行')yield 123,234,345res=index() ......
  • Python生成器深度解析:构建强大的数据处理管道
    前言生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素。它在处理大规模数据集、实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用。在本篇文章中,我们将从理论和实践两方面来探索Python生成器的深度用法。生......
  • Python生成器深度解析:构建强大的数据处理管道
    前言生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素。它在处理大规模数据集、实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用。在本篇文章中,我们将从理论和实践两方面来探索Python生成器的深度用法。......
  • Python之生成器
    生成器''' 生成器就是迭代器的另一种形式,可以理解为生成器就是一种自定义的迭代器 '''所以什么是生成器? 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前......
  • 生成器案例
    生成器案例【一】源码defadd(n,i):returnn+ideftest():foriinrange(4):yieldig=test()fornin[1,10,11]:g=(add(n,i)foriing)res=list(g)print(res)待选项#A.res=[10,11,12,13]#B.res=[11,12,13,14]......
  • day18 生成器
    生成器【一】生成器与yield若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象>>>defmy_range(start,stop,step=1):...print('start...')...whilestart<stop:...yieldstart...start+=step...print......
  • day18 生成器
    生成器【一】生成器与yield若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象>>>defmy_range(start,stop,step=1):...print('start...')...whilestart<stop:...yieldstart...start+=step...print......
  • python中可以节省内存的机制-生成器
    nums=[1,2,3,4,5,6]squares_it=(n**2forninnums)#squares_it得到一个生成器,仅在调用时动态生成nums的平方squares_lst=[n**2forninnums]#squares_lst一次性计算所有元素并生成一个列表并保存下来所以,当您这样做时:fornins......
  • hibernate中自定义主键生成器
    自定义hibernate主键生成机制[url]http://walle1027.iteye.com/blog/1114824[/url]org.hibernate.id.MultipleHiLoPerTableGenerator主键生成器[url]http://suzefeng8806.iteye.com/blog/923511[/url][url]http://zhongrf.iteye.com/blog/972303[/url]......