python--生成器generator_python代码自动生成器

入门理解python中的generator - 生成器 生成器(Generator)是一种特殊的函数,可以用于迭代地生成一系列值,而不需要一次性生成所有值并将它们存储在内存中。生成器在需要时逐个生成值,并在生成值后暂停执行,保留函数的状态,以便下次调用时能够从停止的地方继续执行。生成器函数使用 yield 语句来定义,而不是常规函数中的 return 语句。当生成器函数被调用时,它返回一个生成器对象,而不是立即执行函数体。每次调用生成器对象的 next() 方法时,生成器函数将从上次执行停止的位置继续执行,直到遇到下一个 yield 语句。 阅读详情

前言

1.生成器是什么?

在Python中,生成器(generator)是一种特殊的迭代器,它是通过函数来实现的。生成器函数在执行过程中可以暂停和继续执行,可以动态地生成一系列值,而不需要一次性生成所有值,从而节省了内存空间和计算资源。

  • 可以由生成器表达式得到。

  • 可以使用yield关键字得到一个生成器函数,再通过调用这个函数得到一个生成器对象,包含yield语句的生成器函数调用生成生成器对象的时候,生成器函数的函数体不会立即执行。

  • 生成器(对象)可以使用next方法,next(generator) 会从函数的当前位置向后执行到之后碰到的第一个yield语句,会中断函数执行,并返回yield表达式的值,再次调用next函数,从上一次的中断点恢复执行,继续调用next函数,生成器函数如果结束执行了(显式或隐式调用了return语句),会抛出StopIteration异常。

  • next()方法超限会直接报错,如果不是有特别需求,一般推荐使用for循环遍历。

  • 生成器对象只能逐次遍历一遍,不能再回头读取。

需要Python零基础学习资料的伙伴,可以在公众号【码农资料库】中回复【py】自行领取 包括以下学习资料:

① Python所有方向的学习路线图,清楚各个方向要学什么东西

②Python课程视频,涵盖必备基础、爬虫和数据分析

③ Python实战案例,学习不再是只会理论

④ Python电子好书,从入门到高阶应有尽有

⑤ 华为出品独家Python漫画教程,手机也能学习 ⑥ 历年互联网企业Python面试真题,复习时非常方便

在这里插入图片描述

2.生成器函数和普通函数的区别

生成器函数与普通函数的区别在于,生成器函数中使用了yield语句来产生值,而不是使用return语句返回值。当生成器函数被调用时,它会返回一个生成器对象,而不是直接执行函数体中的代码。当生成器对象被迭代时,生成器函数中的代码会逐行执行,直到遇到yield语句,此时会暂停执行并将yield后面的值作为迭代器的下一个值返回。下一次迭代时,生成器函数会从yield语句后面的代码继续执行,直到再次遇到yield语句,以此类推。

3.以下是一个简单的生成器函数的示例

它生成了从0开始的自然数序列:

return

numbers = natural_numbers()

难到numbers不应该等于函数natural_numbers的返回值None吗?

虽然有显式return语句(可以没有return),但是当python编译是执行到yield语句时,就会给函数natural_numbers打上生成器标签,于是调用该生成器函数natural_numbers可以返回一个生成器对象存到numbers。

def natural_numbers():
    n = 0
    while True:
        yield n
        n += 1
    return
numbers = natural_numbers()

通过迭代器的方式—next()方法依次获取序列中的值:

yield、return都不是生成器函数的返回值,只有当我对生成器对象使用nexth函数的时候,才会开始运行生成器函数本体

print(next(numbers))  # 输出:0
print(next(numbers))  # 输出:1
print(next(numbers))  # 输出:2

由于生成器对象是一种迭代器,因此可以在for循环中使用,例如:

for n in natural_numbers():
    if n > 10:
        break
    print(n)

4.生成器函数执行逻辑

  • 同一个生成器函数中yield语句可以有多个。
for i in range(5):
    yield i  #执行了5次yield语句。
  • 遍历生成器函数对象时,函数执行到yield语句会中断执行,并返回yield表达式的值。
  • 再次遍历该对象时,函数从上一个yield断点位置继续执行,并执行到下一个yield语句。
  • 重复上一步,直到函数正常结束,或者遇到return语句。
  • return语句依然可以终止函数运行,但return语句的返回值不能被获取到。
  • return会导致当前函数返回,无法继续执行。生成器对象至此已经没有可迭代深度。
  • 继续使用next()方法,抛出StopIteration异常。
  • 如果函数没有显式的return语句,如果生成器函数执行到结尾(相当于执行了return None),一样会抛出StopIteration异常。
    def gen():
        print('line 1')
        yield 1
        print('line 2')
        yield 2
        print('line 3')
        return 3
        yield 4

5.next()

  • 如果直接用next()方法调用生成器函数本身,那么每次都会重新生成一个生成器对象,也就无法对某一个生成器对象持续向下遍历。
    next(gen()) # line 1
    next(gen()) # line 1
    
    ```
    ```
    line 1
    1
    line 1
    1   
    
  • 因此需要使用一个变量接收gen()返回的生成器对象。
    g = gen()
    print(g)
    
    ```
    ```
    <generator object gen at 0x000001C19302C228>
    
  • 用next方法,逐次遍历该生成器对象,可以正常输出。
    print(next(g)) # line 1
    print(next(g)) # line 2
    
   line 1
   1
   line 2
   2
   
  • 但是如果再继续用next()遍历,解释器会报错,StopIteration ,说明遍历超限了,函数已经在 return 3 处返回,不会执行到之后的yield
    print(next(g)) # StopIteration
    
   line 3
   
   ---------------------------------------------------------------------------
   
       StopIteration                             Traceback (most recent call last)
       <ipython-input-91-9757af9844f9> in <module>
       ----> 1 print(next(g)) # StopIteration
       
       StopIteration: 3
       
       StopIteration: 3
   

6.作用

  • 生成器可以用于处理大数据集,减少了内存的占用。此外,生成器还可以用于惰性计算,即仅在需要时才计算,从而提高程序的效率。
  • 生成器函数可以作为中断循环体的执行的隔断,每次调用生成器对象时,函数循环体才会继续运行一次。
  • 无限循环:
def counter():
	i = 0
	while True:
		i += 1
		yield i
def inc(c):
	return next(c)
c = counter()
print(inc(c))

  • 计数器:
def inc():
	def counter():
		i = 0
		while True:
			i += 1
			yield i
	c = counter()
	return lambda : next(c)
foo = inc()
print(foo()) # 1
print(foo()) # 2
print(foo()) # 3

  • 处理递归问题:原本的死循环递归,会引起解释器超过最大递归深度报错,但是插入yield语句之后,循环体被卡主了,被生成器对象调用一次才函数循环体会执行一次。
def fib():
	x = 0
	y = 1
	while True:
		yield y
		x, y = y, x+y
foo = fib()
for _ in range(5):
	print(next(foo))	

7.生成器函数语法糖-yield from

  • yield from是Python 3.3出现的新的语法

  • yield from iterable 是 for item in iterable: yield item 形式的语法糖

def inc():
	for x in range(1000):
		yield x

def inc(): 
	yield from range(1000)  ## 解释器优化的语法糖


-END-


python之生成器 生成器 1.生成器 生成器(generator)也是一种迭代器,在每次迭代时返回一个值,直到抛出 StopIteration 异常。它有两种构造方式: (1).生成器表达式 和列表推导式的定义类似,生成器表达式使用 () 而不是 [] ,比如: 可以看出生成器表达式无法像列表推导式那样直接输出,它和可迭代对象一样只能采用for循环调用next()函数 (2).生成器函数 含有 yield 关键字的函数,调用该函数时会返回一个生成器。 可以看到,上面的函数没有使用 return 语句返 阅读详情

相关推荐

Python - Generator生成器( yield )

1. 带有 yield 的函数在 Python 中被称之为 generator(生成器) ; 2. 在函数中,当yield语句作为表达式使用,该函数成为协程; yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 itera...

⚡ 1303

不用写一行代码!Python最强自动化神器!

Playwright是一个由Microsoft开发的开源自动化测试工具,它可以用于测试Web应用程序。Playwright支持多种浏览器,包括Chrome、Firefox和WebKit,同时也支持多种编程语言,如JavaScript、TypeScript、Python和C#。

m0_75277660的博客 7768

Python中的生成器(Generator)详解

在Python中,我们可以使用yield语句来定义一个生成器。生成器可以被视为一个特殊的函数,它的执行过程可以在多个时间点上被中断和恢复。当生成器被调用时,它会返回一个生成器对象,该对象可以用于迭代获取生成器产生的值。yield 1yield 2yield 3在上面的代码中,函数是一个生成器函数。它使用了三个yield语句来定义生成器的行为。每次调用生成器时,它会从当前暂停的位置开始执行,执行到下一个yield语句处并返回一个值。当生成器的所有语句都执行完毕时,它会引发异常来表示迭代结束。

BugHunterX的博客 1818

Python生成器(Generator)

Python生成器是一种特殊的迭代器,可以逐个地产生元素,而不是一次性产生所有元素。生成器的工作方式与迭代器相似,可以通过for循环或者next()函数逐个获取生成器中的元素,而且生成器还支持惰性计算,即只有在需要时才会计算下一个元素。生成器的语法使用yield关键字,yield用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

1万+

Python生成器(Generator)深度解析

最近有很多学Python同学问我,Python Generator到底是什么东西,如何理解和使用。Ok,现在就用这篇文章对Python Generator做一个敲骨沥髓的深入解析。

一个被知识诅咒的人 9831

信贷风控分析—征信数据源

详解企业和个人征信报告,以及信贷风控之指标构造案例参考

csdnbt的博客 3636

python--生成器generator

虽然有显式return语句(可以没有return),但是当python编译是执行到yield语句时,就会给函数natural_numbers打上生成器标签,于是调用该生成器函数natural_numbers可以返回一个生成器对象存到numbers。生成器函数与普通函数的区别在于,生成器函数中使用了yield语句来产生值,而不是使用return语句返回值。yield、return都不是生成器函数的返回值,只有当我对生成器对象使用nexth函数的时候,才会开始运行生成器函数本体。4.生成器函数执行逻辑。

m0_62865498的博客 2538

一文讲透什么是ADC/DAC中的DDC、DUC、采样率以及数据率等概念

摘要:ADC/DAC中的采样率与数据率概念不同,采样率是转换器的时钟速率,而数据率是数字输出的实际速率。抽取通过滤波降低数据速率,提升信噪比但牺牲带宽;内插则通过插零和滤波提高采样率,将镜像信号移远但增加延迟和功耗。JESD204B标准的高速转换器需平衡通道数与串行速率,内插/抽取技术是关键。文章还解析了DDC、DUC的应用及优缺点,为高速数据转换设计提供参考。(150字)

weixin_49761275的博客 4268

python代码自动生成器,python官网手机版中文

大家好,小编来为大家解答以下问题,python官网提供了不同平台下的安装版本,python官网自带的集成开发环境,现在让我们一起来看看吧!

weixin_60705416的博客 716

【嵌入式DIY实例-ESP32篇】-智能花园助手

本文介绍了一个基于ESP32的智能花园监控系统。系统使用ESP-EYE摄像头开发板,集成了土壤湿度传感器、DHT22温湿度传感器和电磁阀等模块,实现植物生长环境监测与自动灌溉功能。硬件部分详细说明了各传感器的接线方式,软件部分展示了如何通过Firebase实现数据存储和远程监控。系统可实时采集土壤湿度、空气温湿度等数据,并通过摄像头监控植物状态,当检测到环境参数异常时,可自动控制水泵进行灌溉,为植物提供最佳生长环境。

视觉与物联智能 263

基于FFT的轴承故障诊断 - MATLAB代码和详细解释

最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。因此,通过分析频谱图,我们可以识别轴承故障的特征。因此,通过分析频谱图,我们可以识别轴承故障的特征。我们可以选择适当的阈值,并在频谱图上标记异常特征。通过这种基于FFT的轴承故障诊断方法,我们可以快速、准确地检测和诊断轴承故障。接下来,我们将应用FFT来获取振动信号的频谱信息,频谱显示了信号在不同频率上的能量分布。通过将异常特征标记在频谱图上,我们可以直观地识别轴承故障的存在。

COWizard的博客 613

Python——生成器(Generator)

目录 简单生成器 generator元素的打印(g.next) 生成器:一边循环一边计算的机制。 一、简单生成器 把一个列表生成式的[ ]改成( ),就创建了一个generator: >>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g.

WallE 5548

【GameFramework框架内置模块】6、实体(Entity)

实体Entity就是一个实体的基本单元,类似于Unity的GameObject对象本体,然后这个本体上面附加其他各种各样组件,才能实现各种各样的功能。一般需要在游戏运行时动态加载的游戏对象,比如怪物、武器、子弹、特效,都需要给这个物体挂载一个实体Entity,这样的话就可以方便的对实例出来的对象进行管理。下面就来看一下如何使用吧。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 3137

python小说自动生成器_python- generator生成器

什么是生成器?通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,...

weixin_39803022的博客 1697

【图论】系列(七)图论的中心性度量方法及重要性评价指标

图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。

qq_30066733的博客 1077

使用SIMD思想进行memcpy的优化

arm64平台的memcpy的性能优化,相比C库提升30~40%,SIMD优化思路

zhaoxin1989的博客 1万+

python13-generator生成器

生成器generator的定义、创建、执行流程、返回值

qq_31532983的博客 1063

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Python:生成器generator的使用

generator,iterator区别与使用方法,代码具体实现

weixin_45873353的博客 1422

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

generator生成器的使用

generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。 ES6定义generator标准的哥们借鉴了Python的generator的概念和语法,如果你对Python的generator很熟悉,那么ES6的generator就是小菜一碟了。如果你对Python还不熟,赶快恶补Python教程!。 我们先复习函数的概念。一个函数是一段...

weixin_43837268的博客 732

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Python生成器(Generator)详解

这篇文章主要介绍了Python生成器(Generator)详解,本文讲解了什么是生成器、简单生成器、带yield 语句的生成器、加强的生成器等内容,需要的朋友可以参考下 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费

喜欢就要珍惜,珍惜就别放弃 7467

Python中的生成器——generator

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 要创建一个generator,有很多种方法。第一种...

weixin_42494225的博客 1327

generator原理及用法解析——Python的生成器

前言 生成器generator 生成器的本质是一个迭代器(iterator) 要理解生成器,就要在理解一下迭代,可迭代对象,迭代器,这三个概念 Python生成器generator简介 iteration, iterable, iterator 迭代(iteration):在python中迭代通常是通过for...in...来实现的.而且只要是可迭代对象iterable,都能进行迭代. 可迭代对象(iterable):Python中的任意的对象,只要它定义了可以返回一个迭代器的 __iter.

m0_49079037的博客 1145

Python3 生成器(generator)概念浅析

引子 某次面试问候选人:Python 中生成器是什么?答曰:有 yield 关键字的函数。而在我印象中此种函数返回的值是生成器,而函数本身不是。如下: In [1]: def get_nums(n): ...: for i in range(n): ...: yield i ...: .

m0_59235508的博客 995

最简单的python代码生成器_Python生成器(Generator)详解

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环...

weixin_39621044的博客 1367

开源python代码生成器_python 生成器 generator

一、为什么用生成器?通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Pyth...

weixin_39727105的博客 507
上一篇: 17岁辍学被社会毒打12年,30岁终成月入过万IT工程师!
下一篇: 用python自动生成C#代码_python转c#
黑客老许
博客等级 码龄8年 6153粉丝 1028原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值