Python基础18

生成器(迭代器的一种)

生成器背景

  数据过多的时候,就会占用内存空间,节省内存空间我们我们会把这些数据变为一个对象给你,不会给具体数据,要用的时候在给你

解决问题

  节省内存空间

  range关键字在Python3中也是一个生成器

1 def index():
2     print(‘来了老弟’)
3     yield

  函数中只要有出现yield关键字,那么该函数就从普通函数变成了生成器,就不会在执行该函数

  要想使用生成器只需要使用next取值即可

  我们使用next取值时,每next一次,代码就走到第一个yield处停止,在执行一次就会从上次yield处开始执行到下一个yield停止

  如果答应next的结果,就会返回yield关键字后面的值

  当yield关键字后面的数据用逗号隔开,有多个时,会以元组的形式返回

自定义range功能

  range函数不能使用,写一个和range函数一样的功能

复制代码
 1 def my_range(start,stop=None,step=1):
 2     
 3     if not stop:
 4         stop=start
 5         start=0
 6     while start<stop:
 7         yield start
 8         start+=step
 9 
10 for i in  my_range(10):
11     print(i)
复制代码

yield关键字的传参问题

复制代码
def eat(name):
    print(‘%s正在干饭’%name)
    while Ture:
    food=yield
    print(‘%s正在吃%s’%(name,food))
    函数里面只要有yield关键字,就不会执行函数,变成了生成器
res=eat(‘kevin’)
next(res)
res.send(‘烤全羊’)
'''
    1利用send把参数传给yield
    2执行了next()取值
'''
复制代码

return和yield的对比

  return

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

   2. return也可以返回多个值

  yield

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

   2. yield 也可以返回多个值

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

生成器表达式

复制代码
 1 列表生成式
 2 res = [i for i in range(10)]
 3 
 4 res1 = (i for i in range(10))
 5 print(res1) # <generator object <genexpr> at 0x0000018083EA3A50>
 6 
 7 print(res1.__next__())
 8 print(res1.__next__())
 9 print(res1.__next__())
10 print(res1.__next__())
11 print(res1.__next__())
复制代码

  生成器表达式如果不next()取值是不会给数据的

  迭代器和生成器关系

    生成器也是一种特殊迭代器 

    迭代器、生成器我们都可以把它们看成是"工厂"
    你什么时候要数据我们就设么时候给你生产
    上述这样做的原因:
      节省内存空间

笔试题

复制代码
# 求和
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)
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 @   Py玩家  阅读(185)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 分享4款.NET开源、免费、实用的商城系统
点击右上角即可分享
微信分享提示