首页 > 其他分享 >生成式

生成式

时间:2024-03-03 20:45:08浏览次数:11  
标签:生成式 生成器 yield next print mygen gen

生成器

生成器是一种特殊的迭代器,可以允许用户自定义迭代逻辑。与迭代器相比,生成器的主要区别在于:

  • 迭代器是系统内置的,不能被重写。
  • 生成器是用户自定义的,可以重写迭代逻辑。

生成器可以通过两种方式创建:

  1. 生成器表达式:这是一种类似于列表推导式的表达式,只不过它的结果是一个生成器,而不是列表。
  2. 生成器函数:这是一种特殊的函数,它使用yield关键字来产生值。

生成器表达式

gen = (i for i in range(10))
print(gen)  # 输出:<generator object <genexpr> at 0x7f1d1f7df200>

# 判断类型
from collections import Iterator, Iterable
print(isinstance(gen, Iterator))  # 输出:True

生成器可以通过多种方式调用:

  1. 使用next函数来获取下一个值:

    print(next(gen))  # 输出:0
    print(next(gen))  # 输出:1
    
  2. 使用for循环和next函数来获取多个值:

    for i in range(3):
        print(next(gen))  # 输出:2, 3, 4
    
  3. 使用for循环来获取所有的值:

    for i in gen:
        print(i)  # 输出:5, 6, 7, 8, 9
    
  4. 使用list函数来一次性获取所有的值:

    gen = (i for i in range(10))
    print(list(gen))  # 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

注意,当生成器的所有值都被获取后,再次调用next函数会引发StopIteration异常。

生成器函数

生成器函数是创建生成器的另一种方式。它使用yield关键字来产生值。yieldreturn类似,但有以下区别:

  • yieldreturn都会把值返回出去。
  • yield每次返回时,会记住上次离开时执行的位置,下次再调用生成器时,会从上次执行的位置往下走。
  • return则会直接终止函数,每次都从头开始调用。

yield()

### 生成器函数
def mygen():
    print("111")
    yield 1
    
    print("222")
    yield 2
    
    print("333")
    yield 3

生成器可以通过next函数来获取下一个值:

gen = mygen()  # 初始化生成器函数,返回生成器对象
print(next(gen))  # 输出:1
print(next(gen))  # 输出:2
print(next(gen))  # 输出:3

注意,当生成器的所有值都被获取后,再次调用next函数会引发StopIteration异常。

生成器函数可以被优化,例如在处理大数据时,可以使用生成器来逐步获取数据:

def mygen():
    for i in range(1, 101):
        yield i

gen = mygen()
for i in range(30):
    print(next(gen))

send()

生成器函数还可以使用send方法来发送值给yield

def mygen():
    print("start")
    res = yield "内部1"
    print(res, "<==内部==>")
    res = yield "内部2"
    print(res, "<==内部==>")
    res = yield "内部3"
    print(res, "<==内部==>")
    print("end")

gen = mygen()
gen.send(None)  # 第一次调用生成器时,必须发送None
gen.send("100")
gen.send("200")

"""
print("111")  yield 1 保存当前第3行代码的状态,把1返回,并且等待下一次调用
# 第二次调用
从上一次保存的位置13行往下走, print("222") yield 2 保存当前第5行代码的状态,把2返回,并且等待下一次调用
# 第三次调用
从上一次保存的位置16行往下走, print("333") yield 3 保存当前第7行代码的状态,把3返回,并且等待下一次调用
# 第四次调用
因为没有更多的yield 返回数据,所有停止迭代.出现报错异常.
"""

#生成式的优化场景
def mygen():
    for i in range(1,101):
        yield i
# 初始化生成器函数 => 生成器
gen = mygen()
print("<=====>")
for i in range(30):
    num = next(gen)
    print("我的球衣号码是{}".format(num))

print("<=====>")
for i in range(40):
    num = next(gen)
    print("我的球衣号码是{}".format(num))
    
    
# next和send区别:
	next 只能取值
	send 不但能取值,还能发送值
# send注意点:
	第一个 send 不能给 yield 传值 默认只能写None
	最后一个yield 接受不到send的发送值

注意,第一次调用生成器时,因为还没有遇到yield保存的代码位置,所以无法发送数据,必须发送None。最后一个yield无法接收到send的值。

yield from

生成器函数还可以使用yield from关键字来返回一个可迭代对象的所有值:

def mygen():
    lst = ["张磊","李亚峰","刘一峰","王同培"]
    yield from lst

gen = mygen()
print(next(gen))  # 输出:"张磊"
print(next(gen))  # 输出:"李亚峰"
print(next(gen))  # 输出:"刘一峰"
print(next(gen))  # 输出:"王同培"

生成器函数可以用来实现复杂的算法,例如斐波那契数列:

def mygen(maxval):
    a, b = 0, 1
    i = 0
    while i < maxval:
        yield b
        a, b = b, a + b
        i += 1

gen = mygen(10)
for i in range(3):
    print(next(gen))  # 输出:1, 1, 2
for i in range(5):
    print(next(gen))  # 输出:3, 5, 8, 13, 21

标签:生成式,生成器,yield,next,print,mygen,gen
From: https://www.cnblogs.com/wbcde116/p/18050673

相关文章

  • 【译】生成式人工智能 - 音频
    原作:马可·兰波尼引言:在生成式人工智能领域,关注的焦点一直放在语言和图像上,但近期在音频领域也取得了许多进展。本文将为您介绍有关生成式音频模型的一切知识。 在过去的十年中,我们见证了人工智能驱动的音频生成技术取得了显著进步,包括音乐和语音合成。然而,直到最近,这些改进仍......
  • 猜字谜|构建生成式 AI 应用实践(一)
    在2023亚马逊云科技re:Invent之后,细心的开发者们也许已经发现有一个很有趣的动手实验:开发一款可部署的基于大语言模型的字谜游戏:该款游戏使用了文生图模型为玩家提供一个未知的提示词,玩家需要根据模型生成的图像来猜测该提示词,来完成游戏。该动手实验完整地展示了如何在亚马......
  • OpenAI推出生成式视频划时代的模型:Sora惊艳登场,引爆行业变革!这次,它又将颠覆哪些领域?
    哈喽,大家好,我是程序视点的小二哥!前言就在今天,一个消息把我给震惊呆了:奥特曼发布OpenAI首个视频生成模型Sora。完美继承DALL·E3的画质和遵循指令能力,能生成长达1分钟的高清视频。就在昨天~就是昨天,我还在和AI的小伙伴讨论说“目前的AI,在文生视频方面,还停留在5、6秒的视频......
  • 【译】生成式人工智能,废话即服务
    原作:阿尔贝托·罗梅罗引言:AI令人惊叹,然而人类正在将其用于垃圾邮件、虚假和作弊行为 本文选自《算法之桥》,这是一个旨在弥合人工智能与人类之间差距的教育项目。人工智能并不是将情报成本归零,而是将废话成本归零。SamAltman喜欢声称OpenAI以及生成式AI的目标是将智慧的......
  • 创新指南|生成式AI实验 - 企业快速渐进采用人工智能的科学新方法
    生成式人工智能(GenAI)正迅速成为各行各业的企业创新焦点。生成式AI实验对于企业创新而言至关重要,不仅可以帮助企业识别最适合和最有影响的应用场景,还能促进组织沿着生成式AI学习曲线前进,建立早期的创新领导者和AI人才梯队,为未来的AI创新发展奠定基础。企业应谨慎选择AI实验起......
  • 2024年生成式AI芯片市场规模将达500亿美元
    1月24日,德勤发布《2024科技、传媒和电信行业预测》中文版报告,2024年是科技、传媒和电信行业关键的一年,不少科技公司正利用生成式AI升级软件和服务,预计今年全球生成式人工智能芯片销售额可能达到500亿美元以上。 2024年将有许多软件公司在产品中嵌入生成式AI,有些企业的产品将......
  • 【译】生成式人工智能 - 语言
    原作: 瑞安·奥康纳引言:像ChatGPT这样的生成式AI语言模型正在改变人类和AI交互和协作的方式,但这些模型实际上是如何工作的呢?在这个简单的指南中了解您需要了解的有关现代语言生成人工智能的所有信息。 生成式人工智能在语言领域取得了长足的进步。OpenAI的ChatGPT可......
  • 起心动念 | 生成式 AI 开发实践系列的开端
    生成式AI和大模型的技术变革力量,正在逐渐影响着我们当下这个时代,全球各行各业都呈现百舸争流、万象更新的趋势。在2023年,我们通过各种面向开发者的活动,收集到了大量开发者关于基于生成式AI的开发内容需求和建议反馈。开发者们都期待我们在2024年推出更多关于生成式AI开......
  • 新型生成式 AI 助手 Amazon Q(预览版)上线
    今天,我们宣布推出AmazonQ,这是一种新型的生成式人工智能助手,专门用于满足办公场景需要,可以根据客户业务进行定制。客户可以使用AmazonQ进行对话、解决问题、生成内容、获取见解并采取行动,所有这些都基于客户自身的信息存储库、代码、数据和企业系统。AmazonQ为员工提供即时......
  • 生成式 AI 已掀起浪潮,行业发展会怎么样?
    大家可以看看一些研究报告。本报告总结成关键的6个部分:1.引言:介绍生成式AI应用的概念和重要性,以及本文的主要内容和目的。2.生成式AI应用的基础知识:包括什么是生成式AI、其与自然语言处理(NLP)之间的关系、数据隐私保护等方面的内容。3.ChatGPT:介绍了ChatGPT这一生成式AI应用......