首页 > 其他分享 >【语法】生成器

【语法】生成器

时间:2025-01-03 19:11:16浏览次数:1  
标签:res 生成器 yield next 语法 send print

python中的推导式、生成器_python生成器推导式-CSDN博客

“”“生成器应用的场景是在大数据的范围中使用, 切记不可直接用for遍历所有,可能无法短时间内获取所有数据”“”

使用 yield 来实现生成器,并使用next 进行激活

1,__next__()&next()的区别
        __next__()是生成器对象的实例方法,next()是python的内置方法。他们实现的功能是一样的,只能对可迭代的对象使用。

2,next()和send()用以唤醒生成器
        当生成器函数中执行yield时,程序会卡在yield的地方不执行,next()和send()的作用就是唤醒卡住的程序,让他继续执行。

3,send()方法的作用
        send()作为生成器对象的实例方法,可以向生成器发送数据并唤醒生成器函数。一般send()方法要写在next()方法后面,当next()和send()写在一块时,相当于唤醒两次生成器。

生成器表达式无法像列表推导式那样直接输出,它和可迭代对象一样只能采用for循环调用next()函数,原因在于range返回的是一个可迭代对象,
列表推导式之所以能直接print就是因为 []将可迭代对象转为列表。

#初始化生成器函数 => 返回生成器对象 => 简称生成器
调用该函数的时候不会立即执行代码,而是返回了一个生成器对象;
当使用 next() (在 for 循环中会自动调用 next() ) 作用于返回的生成器对象时,函数 开始执行,在遇到 yield 的时候会『暂停』,并返回当前的迭代值;
当再次使用 next() 的时候,函数会从原来『暂停』的地方继续执行,直到遇到 yield语句,如果没有 yield 语句,则抛出异常;

send的使用方式 (给上一个yield发送数据)

#next和send区别:
next 只能取值
send 不但能取值,还能发送值,发送给yield
#send注意点:
第一个 send 不能给 yield 传值 默认只能写None
最后一个yield 接受不到send的发送值

send要想成功执行,第一次必须发送None最后一次调用,要有对应层级的yield,也就是send个数少于等于yield个数

 1 def mygen():
 2     print("start")
 3     
 4     res = yield "内部1"
 5     print(res,"<==内部==>")
 6     
 7     res = yield "内部2"
 8     print(res,"<==内部==>")
 9     
10     res = yield "内部3"
11     print(res,"<==内部==>")
12     
13     print("end")
14     
15 # 初始化生成器函数 => 生成器
16 gen = mygen()
17 # 第一次调用生成器
18 """
19 第一次调用生成器时,因为没有遇到yield保存的代码位置,
20 无法发送数据,默认第一次只能发送None
21 """
22 res = gen.send(None)
23 print(res,"<==外部==>")
24 
25 # 第二次调用生成器
26 res = gen.send("100")
27 print(res,"<==外部==>")
28 
29 # 第三次调用生成器
30 res = gen.send("200")
31 print(res,"<==外部==>")
32 
33 # 第四次调用生成器
34 """
35 error
36 res = gen.send("300")
37 print(res,"<==外部==>")
38 """
39 """
40 使用send调用生成器,第一次发送时必须是None,因为还没有遇到yield保存的代码位置
41 res = gen.send(None)  走到mygen生成器函数中
42 print("start") 
43 res = yield "内部1"  执行第80行 ,保存退出,记录当前代码位置,将 "内部1" 返回
44 在98行接受数据  res = "内部1"  print(内部1,"<==外部==>")
45 
46 第二次调用生成器
47 res = gen.send("100") 把100这个数据发送给上一次代码保存的位置80行进行接受. => 导致 80行 res = 100
48 打印81行  print(100 ,"<==内部==>")
49 执行83行  res = yield "内部2"  保存退出,记录当前代码位置,将 "内部2" 返回
50 执行102行 res = gen.send("100") => "内部2" print("内部2","<==外部==>")
依次类推 …
到第四次调用时, 因为没有更多的yield 返回数据,gen.send(300)无法接受到返回值,所以出现停止迭代 StopIteration的报错,程序终止;

yield from 的使用

“”“将一个可迭代对象变成一个迭代器返回 “””

 1 def mygen():
 2     lst = ["张磊","李亚峰","刘一峰","王同培"]
 3     yield from lst
 4     
 5 #初始化生成器函数
 6 gen = mygen()
 7 print(next(gen))
 8 print(next(gen))
 9 print(next(gen))
10 print(next(gen))
11 #print(next(gen)) # StopIteration

 

标签:res,生成器,yield,next,语法,send,print
From: https://www.cnblogs.com/liu-Gray/p/18650781

相关文章

  • 【语法】enumerate、zip
    enumerateenumerate(iterable,[start=0])功能:枚举;将索引号和iterable中的值,一个一个拿出来配对组成元组,通过迭代器返回参数:iterable:可迭代性数据(常用:迭代器,容器类型数据,可迭代对象range)start:可以选择开始的索引号(默认从0开始索引)返回值:迭代器1dic={k:v......
  • Python语法——增加代码可读性
    类型注释增加代码可读性fromtypingimportList,Dict,Set,Union,Optionaldefadd_enter(b:str)->str:returnb+'\n'defparse_data(data):total=0fork,vsindata.items():ifk[1]:forvinvs:......
  • C#实现LALR(1)解析器的生成器
    YetAnotherCompiler参考lex和yacc的输入格式,参考虎书《现代编译原理-C语言描述》的算法,大力整合优化,实现了LALR(1)的C#生成器(暂命名为bitParser)。词法分析器根据DFA和最小化DFA分别生成词法分析器代码(状态转换表、保留字、Token类型等)支持全Unicode字符。支持int.MaxVal......
  • ArkTs基础语法知识
    文章目录:目录基本知识声明类型运算符语句函数函数声明可选参数Rest参数返回类型函数的作用域函数调用函数类型箭头函数(又名Lambda函数)闭包函数重载类字段方法构造函数可见性修饰符对象字面量抽象类接口接口属性接口继承抽象类和接口泛型类型和函......
  • 学习笔记:C#高级进阶语法——特性(Attribute)
    三、特性(Attribute)3.1、特性的本质什么是特性?特性本质是一个类,直接或间接的继承自抽象类Attribute,可以把这个类,用[类名]进行注册标记到类似及类内部的所有成员:约定俗成,默认以Attribute结尾,在进行标记的时候,如果特性类是Attribute结尾的,可以省略不写结尾的Attribute。特性的......
  • 2. C语言 基础语法
    本章目录:前言1.C语言的基础结构1.1C程序的基本构成1.2一个简单的C程序实例1.3复杂的C程序结构2.C语言的基本构成单元2.1关键字标准关键字C99新增关键字C11新增关键字2.2标识符2.3常量2.4注释3.语句与表达式3.1语句3.2表达式4.分隔符与空格4.1......
  • 【Access语法】SQL连接查询
    在MicrosoftAccess中,联合查询(也称为JOIN查询)是用于从两个或多个相关表中检索数据的一种方法。通过使用联合查询,您可以将来自不同表的数据组合在一起,以便在一个结果集中进行查看和分析。联合查询的类型Access支持几种不同类型的联合查询,包括:内连接(InnerJoin):返回两个表中......
  • 【Access语法】SQL嵌套查询
    SQL子查询(Subquery)是在一个查询语句中嵌套另一个查询语句的功能。子查询可以出现在SELECT、FROM、WHERE或HAVING等子句中,用于返回单个值、一行值或一列值,以供外部查询使用。多层嵌套查询(也称为多级嵌套查询或深度嵌套查询)是指在一个查询语句中嵌套了多个子查询的情况。这种查询结......
  • Python 基本语法全解析:从安装到应用
    Python是一种广泛使用的高级编程语言,因其简洁易懂的语法和强大的功能而受到开发者的喜爱。从数据分析到人工智能,Python都在各个领域占据着重要地位。如果你是编程新手,Python是一个非常适合入门的语言。本篇博客将带你从安装Python到理解其基础语法,再到实际应用中常见的内......
  • Verilog语法之generate与genvar用法
    摘要:本文主要讲解了generate与genvar的用法,并且给出了详细的一些例子和用法,可以通过阅读本文基本了解其用法和规则。    generate语法可以实现某些语句的重复。genvar与generate是Verilog2001才有的,功能非常强大,可以配合条件语句,分支语句等做一些有规律地例化或者赋......