范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python基础63Python中的生成器

  1、为什么要有生成器
  Python在数据科学领域可以说是很火,我想有一部分的功劳就是它的生成器了吧。
  我们知道我们可以用列表储存数据,可是当我们的数据特别大的时候,列表中的数据都是放在内存中,受到内存限制,列表容量肯定是有限的,而且还会降低计算机的性能。
  如果仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。但如果列表中元素是按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的列表数据,从而节省大量的空间。
  换句话说,我又想要得到庞大的数据,又想让它占用空间少,这时生成器就派上用场了,它可以说是一个不怎么占计算机资源的一种方法。 2、创建生成器(1)简单创建生成器
  将一个列表推导式(也叫列表生成式)  []   改为 ()  即可创建一个生成器。
  python # 1.用推导式定义一个列表 # 关于推导式请看以前的文章有讲解。 my_list = [x * x for x in range(10)]  # 打印列表 print(my_list) # 查看my_list类型,是一个列表 print(type(my_list)) """ 输出结果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]  """    # 2.创建一个生成器 my_gen = (x * x for x in range(10))  # 打印生成器,是一个生成器对象 print(my_gen) # 查看my_gen对象类型,是生成器类型 print(type(my_gen)) """ 输出结果:  at 0x0000000002575148>  """(2)生成器的使用# 创建生成器 my_gen = (x * x for x in range(10))  # 1。方式一:遍历生成器,使用next方法 print(my_gen.__next__())  # 0 print(my_gen.__next__())  # 1 print(my_gen.__next__())  # 4 print(my_gen.__next__())  # 9 # 或者 print(next(my_gen))  # 16 print(next(my_gen))  # 没有数据了则会抛出异常StopIteration    # 2.方式二:遍历生成器的内容 for i in my_gen:     print(1)   # 3.方式三:遍历生成器的内容 while True:     try:         # 调用next函数,获取下一个字符         result = next(my_gen)         print(result)     except StopIteration:         # 释放对it的引用,即废弃迭代器对象         del my_gen         # 不推出循环会成为私循环         break提示:
  在上边练习中,可以看到和迭代器的用法差不多,在这里说明一下生成器本身就是一个迭代器。如果有对迭代器不清楚的可以查看前面说明迭代器的文章。上面方式一不断调用 next()  方法回去元素,实在是太变态了,正确的方法是使用for  循环。generator  保存的是算法,每次调用next()  ,就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration  的错误。总结:
  用 []  推导出来的是迭代器(Iterables  )。用()  推导出来的是生成器(Generators  )。3、yield关键词(1)yield关键词说明
  如果我们想定义一个自己的生成器函数怎么办?
  Python有 yield  关键词。其作用和return  的功能差不多,就是返回一个值给调用者,只不过有yield  的函数返回值后,函数依然保持调用yield  时的状态,当下次调用的时候,在原先的基础上继续执行代码,直到遇到下一个yield  或者满足结束条件结束函数为止。
  啥意思?啥意思?啥意思? 你先把 yield  关键字直观地看做return  关键字,它首先是return  的功能,就是在函数或方法中返回某个值,返回之后程序就不再往下运行了。yield  相当于返回一个值给调用者,停止执行函数中的语句,并且记住这个返回的位置。下次迭代时(或者执行next  方法的时候),代码从yield  记录位置的下一条语句开始执行。带有 yield  的函数不再是一个普通函数,而是一个生成器generator  。调用一个生成器函数,返回的是一个迭代器对象。
  示例: # 定义一个生成器函数 def testYield():     yield 1     yield 2     yield 3  # 获得一个生成器对象 ty = testYield()  """ 调用过程: next(ty)相当于ty.__next__() 掉调用一次next(ty)时 就会执行testYield()内的方法。 当执行的第一行, yield 1时, 返回当前yield的值1给调用者,停止向下执行,并记录函数中当前的执行位置。 也就是每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值。 程序执行结束  当下次再调用next(ty)的时候, 还是会执行testYield()内的方法, 只不过是从yield 1下面一句开始执行。 以此类推。 """ print(next(ty))  # 1 print(next(ty))  # 2 print(next(ty))  # 3 print(next(ty))  # StopIteration
  注意:每次调用  testYield()  函数都会生成一个新的 generator 实例,各实例互不影响。(2)send()方法说明
  send()  方法和next()  方法一样,都能让生成器继续往下走一步(下次遇到yield停),但send()  能传一个值,这个值作为yield表达式整体的结果。def testYield():     yield 1     y = yield 2     if (y == "hello"):         yield 9     yield 3   ty = testYield()  print(ty.__next__())  # 1 print(next(ty))  # 2 """ 第三次执行,send方法会把"hello"传递进去 就是y = "hello" 换句话说,就是send可以强行修改上一个yield表达式值 程序会从第二个yield的下一行开始执行 执行到下一个yield停止,并记录位置,返回结果。 """ print(ty.send("hello"))  # 9 print(next(ty))  # 3 print(next(ty))  # StopIteration
  注意:第一次执行要么 next(ty)  要么ty.send(None)  ,不能使用ty.send("xxxxx")  ,否则会报错的。4、使用yield实现斐波那契数列""" 数学中有个著名的斐波那契数列(Fibonacci), 数列中第 个数0,第 个数1,其后的每 个数都可由前两个数相加得到: 如下: 0,    1,    1,   2,    3,    5,   8,    13,    21,   34,    ...  现在我们想要通过for...in...循环来遍历迭代斐波那契数列中的前n个数。 那么这个斐波那契数列我们就可以 生成来实现, 每次迭代都通过数学计算来 成下 个数。 """ from collections.abc import Iterable, Iterator   class FibGenerator(object):     """         fib数列生成器     """      # 初始化方法     def __init__(self):         # 斐波拉契数列中的前两个数         self.num1 = 0         self.num2 = 1          # 用来记录迭代次数(计数器)         self.i = 0      def gen(self, count):         # 用来保存迭代的总次数         self.count = count          # 判断是否迭代结束,如果没有到达迭代次数,则返回数据         # self.count 需要迭代的次数         # self.i已迭代次数         while self.i < self.count:             yield self.num2             # 计算num1, num2的值,方便下次迭代返回             # 这里运用的是序列的封包与解包,不会的可以看我以前的文章(元组)             self.num1, self.num2 = self.num2, self.num1 + self.num2              # 执行一次next方法,计数器+1             self.i = self.i + 1   # 创建一个对象 fibGen = FibGenerator()  # 调用生成器函数得到一个生成器 fg = fibGen.gen(15)  # fibIter对象是一个迭代器 print(isinstance(fg, Iterable))  # True print(isinstance(fg, Iterator))  # True  # next方法方式获取数据 # print(next(fg))  # 1 # print(next(fg))  # 1 # print(next(fg))  # 2 # print(next(fg))  # 3 # print(next(fg))  # 5 # print(next(fg))  # 8   # 遍历生成器,可执行 for li in fg:     print(li)5、总结生成器 generator  就是迭代器iterator  的一种,以更优雅的方式实现的iterator  ,而且完全可以像使用iterator  一样使用generator  。当然除了定义,定义一个 iterator  ,你需要分别实现__iter__()  方法方法和__next__()  方法。但generator只需要一个yield关键字就可以。Python生成器主要目的就是为了让你的代码更省资源,更高效!
  参考:
  https://blog.csdn.net/weixin_37720172/article/details/78482291
  https://www.cnblogs.com/liangmingshen/p/9706181.html
  https://blog.csdn.net/xiangxianghehe/article/details/77281186
  原文地址:https://www.cnblogs.com/liuyuelinfighting/p/15953745.html

考拉海购买玩具靠谱吗?考拉海购电商平台是阿里巴巴旗下专门售卖世界各地大牌商品的平台,它有自己的采购人员,在找到商品后会对商品进行专业的检测,是有正品行货才能流入市场供客户选择,那么在琳琅满目的大牌商品中2022年支付宝骗局再现?有人险失18万!一定警惕陌生人电话移动支付技术改变了人们的支付方式,把我们带入到了无现金时代,其中的便利相信大家都深有感触。然而,新技术新产品的不断出现在便利我们生活的同时,也让一些骗子和不法分子有了可趁之机。在支ozon入驻要求有哪些?中国卖家需要准备哪些资料Ozon作为俄罗斯最有潜力的电商平台之一,吸引了很多跨境卖家的入驻,而中国卖家就占了一大部分。但我们大多数中国的跨境卖家对Ozon平台还是很陌生,不仅有语言沟通交流难的障碍,ozo鸡头的超强防抖能力,到底有多逆天?人类科技有它稳吗?我们先看这个图片,这鸡头像不像手机稳定器。我们知道鸡是恐龙的远方亲戚,属于兽脚类恐龙,曾经称霸地球物种的一个支脉,从这我们知道鸡就不会是简单的存在,谁还没点看家本领。感兴趣的朋友点华卓科技完成亿元人民币A轮融资,领跑云原生医疗信息化基于云原生架构的医疗科技应用操作系统公司华卓科技日前宣布完成1亿元人民币的A轮融资,本轮融资由启明创投领投。基于云原生的医疗应用操作系统此前华卓科技这个名字在市场上出现的频次不高,工信部工业和信息化领域数据处理者境内收集和产生重要数据向境外提供应进行数据出境安全评估金融界2月10日消息工信部再次公开征求对工业和信息化领域数据安全管理办法(试行)的意见。意见提出,工业和信息化领域数据处理者在中华人民共和国境内收集和产生的重要数据和核心数据,法律Meta股价暴跌而亚马逊表现强劲华尔街日报简讯2022020506HiringShowsSurprisingStrength租赁市场呈现惊人的增长U。S。payrollsexpandedby467,000inJa自动化测试是否有必要做自动化测试?目录一前言二自动化目的三自动化分类四自动化实现一前言在一些测试交流群经常会看到有小伙伴在问,怎么做自动化测试?学习自动化测试有什么资料吗?自动化测试是不是很牛逼?,甚至有些言论是不软银集团会长兼社长孙正义没想到ARM出售案会遭强烈反对,将力争实现半导体行业最大IPO南方财经2月9日电,界面援引媒体消息,软银集团会长兼社长孙正义8日接受采访表示,ARM出售案受到全球IT企业反对,美英和欧盟等各国政府与监管机构显示出强烈担忧。孙正义称英伟达方面提小米手机双品牌再发力,Redmi开年瞄准电竞市场智通财经APP获悉,2月9日,Redmi红米手机官微发布,将于2月16日召开新品发布会,推出K50电竞版。该款手机的官方海报打出了全线拉满的冷血旗舰口号,官方表示,将按电竞标准打造半导体需求助推增长台积电成亚洲市值最高公司新加坡联合早报网站近日报道称,随着全球半导体需求不断升高,中国台湾芯片制造商台积电市值达6000亿美元,成为亚洲市值最高的公司。新媒援引美国华尔街日报的报道称,标普全球市场财智基于
银行面临四面楚歌的竞争环境作者杰米戴蒙摩根大通董事会主席兼CEO译吴卫军德勤中国副主席来源吴卫军会计师银行不仅在与庞大的强有力的影子银行体系竞争,同时还面临着来自硅谷的金融科技公司和大型科技公司巨头的广泛竞用更好的营商环境服务数字经济发展近年来,随着互联网大数据云计算人工智能区块链等技术加速创新,数字经济的质量逐步提高,发展越来越快。全国政协经济委员会副主任中国商务部原副部长房爱卿近日在第14届金麒麟论坛上表示,这十四五大数据产业发展规划发布,移动云赋能大数据创新发展近日,工业和信息化部发布十四五大数据产业发展规划,明确到2025年,大数据产业测算规模突破3万亿元,年均复合增长率保持在25左右,创新力强附加值高自主可控的现代化大数据产业体系基本福特通用汽车苹果英特尔等多家企业高管敦促美国国会提供芯片补贴记者李亦萌编辑眼下,包括福特汽车公司通用汽车苹果公司和英特尔在内的众多美国大型企业均在呼吁美国国会通过立法,在全球芯片短缺期间,为美国芯片制造业提供数十亿美元的补贴。50多家公司的噪声去无踪,收听更干净,收音机输入噪声消除器评测一大众的心声只要信号,不要噪音请设想一下一家名为短波收听国际公司的单位召开了年度会议,身着定制西装的首席执行官看上去神采奕奕,正在向聚集在一起的众人讲话。一个显示信噪比的方程式展现好用不贵!90平米小三居如何买家电最省钱装修是个老大难的话题,很难有人不踩坑,当你好不容易装修完硬装后,关于家电的选择又会出现新的纠结点,那家电该如何选择呢?本着刚需用途品质优先尽量省钱的原则,我来跟大家聊聊装修后的家电华为Mate40Pro相当于苹果什么水平的机型?一番对比后,结果揭晓近日,华为又放了一批华为Mate40Pro货源,惹的一众花粉们心痒难耐。不过,说实话这款华为高端旗舰毕竟是去年的产品了,且它的价格也仍旧不便宜,与苹果不相上下。而苹果今年已经迭代了新能源车熄火了?宁德时代两连跌,遭北向资金出逃逾10亿元澎湃新闻记者葛佳宁德时代新能源科技股份有限公司(300750,下称宁德时代)股价自12月3日盘中创出历史新高后,出现高台跳水。12月7日,宁德时代高开低走,盘中一度下跌近7,最终该Python中所有文件读写模式大全增加表示把当前文件以读写模式打开(r,w,a,rb,rw,ra),基本特性和不适用号之前一致,操作结果有些许区别。带上号之后只要open一个文件之后就可读可写。fopen(a。txWindows11小组件彻底移除方法win11添加了小组件功能,就是屏幕左边划出的功能winw唤出面板,下面是怎么彻底移除这个功能应用安装目录在CProgramFilesWindowsApps应用名称Microsof字节跳动发布全系云产品,持续发力企业服务市场2021年11月,字节跳动火山引擎单独成为公司业务线。12月2日,字节跳动旗下企业服务品牌火山引擎发布全系云服务产品,正式进入公有云市场。字节跳动的企业服务布局正在快速迭代。中长期