首页 > 编程语言 >python中的yield与yield from

python中的yield与yield from

时间:2024-06-21 17:14:20浏览次数:26  
标签:curr 迭代 python self 生成器 yield prev

生成器与迭代器

在Python中,迭代器就是可以用来迭代(比如for循环中的迭代)操作的对象,任何实现了__next__方法的对象都可以称之为迭代器。

class Fib:
    def __init__(self, n) -> None:
        self.prev = 0
        self.cur = 1
        self.n = n
    
    def __next__(self):
        if (self.n > 0):
            value = self.cur
            self.cur = self.cur + self.prev
            self.prev = value
            self.n -= 1
            return value
        else:
            raise StopIteration()
    
    def __iter__(self):
        return self

f = Fib(10)
print(next(f))
print(next(f))
print([i for i in f])

"""
1
1
[2, 3, 5, 8, 13, 21, 34, 55]
"""

虽然写了好几行代码只是生成了一个列表,但迭代器的优势在于:不用将所有可能用到的数据都加载到内存中,而是通过next方法返回特定的元素,也不用保存之前遍历过的元素。在一些特定的场景下,迭代器可以节省大量的内存。

生成器与迭代器的作用相似,但在用法上更加简洁。在python中,使用了yield关键字的函数会成为生成器函数。函数执行到yield语句后会立即返回,这一点和return的行为一样。不同之处在于:下一次调用该函数的时候,会从yield语句后面接着继续执行。

def fib(n):
    prev, curr = 0, 1
    while n > 0:
        n -= 1
        yield curr
        prev, curr = curr, curr + prev

f = fib(10)
print(next(f))
print(next(f))
print([i for i in f])

"""
1
1
[2, 3, 5, 8, 13, 21, 34, 55]
"""

使用yield from 的关键字也会成为生成器,不过它会将自己的部分任务交给另一个生成器完成。

def func(n):
    print('let\'s go')
    yield from fib(n - 1)
    yield 55

def fib(n):
    prev, curr = 0, 1
    while n > 0:
        n -= 1
        yield curr
        prev, curr = curr, curr + prev

print([i for i in func(10)])

"""
let's go
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
"""

注意:使用'yield from'时,控制权会转移到子生成器,并直接从子生成器中获取值,知道子生成器完成迭代。

标签:curr,迭代,python,self,生成器,yield,prev
From: https://www.cnblogs.com/hetailang/p/18260920

相关文章

  • python rce
    之前学习过了rce在php下的利用,接下来来学习一下python中rce的利用,其根本主要就是执行系统命令的函数有所不同.os模块os是python中用来执行系统命令的包.下面是常用的两个方法.1.os.system:可以用来执行系统命令,但是无法将系统命令执行的结果返回.如果执行成功了会返回0,失败......
  • python读取excel文件
    在Python中,可以使用pandas库来读取Excel文件。首先,确保安装了pandas和openpyxl(用于处理Excel文件的库):pipinstallpandasopenpyxl以下是使用pandas读取Excel文件的示例代码:importpandasaspd#读取Excel文件df=pd.read_excel('example.xlsx')#显示数据框内容p......
  • Python学习之爬虫简单例子
    importBeautifulSoupimportpandasaspdimporturllib.request,urllib.errordefrequestUrl(url):  headers={    'User-Agent':"Mozilla/5.0(Macintosh;IntelMacOSX10_14_6)AppleWebKit/537.36(KHTML,likeGecko)Chrome/81.0.404......
  • 【python数据可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图
    用Python爬虫抓取全年天气数据并绘制天气轮播图一、运行结果:二、代码展示:由csv文件生成↓接下来是绘制天气轮播图运行结果:完整代码请看这里↓......
  • 我一直看不明白:“C++会被java/python等这些语言替代”
    在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!有些程序,是既可以用c++编写,也可以用java/python编写。如果这类程序以前主要是由c++编写,后来逐渐变成主要......
  • python pta 7-43 密码强度
    本题目要求根据输入密码字符串(字符串长度大于6),密码只能由大写字母、小写字母、数字及下划线四种类型组成,其密码强度为包含类型的数量,例如包含大小写则密码强度为2,四种类型全包含则为4.若包含其他类型的字符则输出IllegalPassword.输入样例1:在这里给出一组输入。例如:123456......
  • python pta 7-44 计算时间间隔
    输入两个日期,以hh:mm的格式输入,两者之间以空格分割。输出二者的时间间隔,同样以hh:mm的格式输出。其中,hh代表小时,mm代表分钟。若时间非法则输出IllegalTime.提示一:若不希望Python代码继续执行可调用exit()函数退出。提示二:为避免歧义,小时数限定为[0,24);分钟数限定为[0,60)......
  • python学习第二天之基本数据类型及其方法
    python的基本数据类型1.数字int2.字符串str3.布尔型bool4.列表list5.元组tuple6.字典dict一个一个来看,分别梳理各自的方法。一、数字int1.bit_length--得到指定数值的二进制的长度a=10print(a.bit_length)输出:4因为a=10,而10的二进制数是1010,刚好......
  • python 趣味习题_递归函数(炸弹迷宫的走法)
    @[toc]python学习中,常会遇到一些百思不得其解的难题,但有时“灵光一现”找准方法,难题便会迎刃而解。本专栏旨在记录本人解决问题的思考方法,及实现过程。有更好方法或对程序执行有疑问的伙伴,可在评论区留言,共同讨论。题目要求题目描述:在一串连续的迷宫(房间编号为1-11的......
  • vscode python编程入门与插件推荐
    使用背景作者是一名ai测开工程师,工作环境中通常会使用到pythonshellpostgresql数据库jupyter,shh工具git版本控制等,因此向选用一个适合自己的文本编辑软件,经过长时间磨合,最终选择VScode作为我的工作软件优点内存占用率低,集成度高,开源免费插件推荐AI助手:codegeex此插件......