Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >yield关键字

yield关键字

作者头像
TomatoCool
发布于 2023-07-30 09:43:52
发布于 2023-07-30 09:43:52
18600
代码可运行
举报
文章被收录于专栏:TomatoCoolTomatoCool
运行总次数:0
代码可运行

在一个函数内实用yield关键字将函数变成生成器。

一个简单的例子:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#  一个迭代器函数
def fun(n):
    for i in range(n):
        yield i
        print('--分割线--')

#  获取迭代器
a = fun(5)
#  使用next让迭代器继续执行
print(next(a))
print(next(a))
print(a.__next__())
print(a.__next__())

解释:

  1. 定义一个生成器a,运行完第三行停止
  2. 第一个next函数执行,接收第一个i,此时i=0,输出0,第三行后的代码不执行
  3. 第二个next函数执行,从第四行执行代码,输出分割线后,进入下一个for循环,接收第二个i,此时i=1,输出1,第三行后的代码不执行
  4. 第三个next方法执行,从第四行执行代码,输出分割线后,进入下一个for循环,接收第二个i,此时i=2,输出2,第三行后的代码不执行

抽象解释: 将yield看成两个部分,一:return i,二:一个锁,每次执行next函数后,程序运行在一和二之间。下一次调用next函数先开第二部分的锁,输出分割线后进入一个新的循环,再return一个新的i,被新的锁锁住。(第一次相当于没有锁,直接return后再被锁)

tip:next函数和__next__()方法效果相同

关闭生成器:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#  关闭后无法用next进行迭代(用的少)
a.close()
向生成器发送数据:

改一下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#  一个迭代器函数
def fun(n):
    for i in range(n):
        k = yield i
        if k:
            print(k)
        print('--分割线--')

#  获取迭代器
a = fun(5)
print(next(a))
#  发送一个字符
print(a.send('a'))
print(a.__next__())
print(a.__next__())

可以看到a被输出了,不影响其他代码运行(send后同样进行一次迭代,结果和next相同)

传入一个异常:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#  此时生成器会抛出一个错误(可以用try语句接收)
a.throw(Exception)

#  一般这样接收
try:
    yield 1
except Exception:
    yield 'Exception'
finally:
    print('finally')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023 年 05 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【C++】unordered_set和unordered_map
https://legacy.cplusplus.com/reference/unordered_set/
风中的云彩
2025/06/10
50
【C++ map和set】数据的吟游诗:Map与Set的双城记
前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间一般没有紧密的关联关系,比如交换一下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。
Undoom
2025/05/29
640
【C++ map和set】数据的吟游诗:Map与Set的双城记
初识C++ · map和set的使用
在前面阶段,我们已经学习了stl里面的部分容器,比如vector,list,deque等,这些容器都被称为序列式容器,也就是每个值之间式没有关联的,那么今天介绍的容器,map和set,是关联式容器,即每个值之间是有关联的,关联式容器在数据存储方面和序列式容器没有什么大差别,但是在数据检索上就很有用了,其中map的key - value模型存的键值对在数据检索方面的效率是很高的。
_lazy
2024/10/16
930
初识C++ · map和set的使用
C++ STL (标准模板库) 详细内容讲解
顺序容器有以下三种:可变长动态数组 vector、双端队列 deque、双向链表 list。
杨鹏伟
2020/09/11
2.2K0
⭐️STL⭐️之list,set,map全解,❤️算法必备❤️<下>
文章目录 😘 闲聊几句 👍 list 👍list的反转和排序 👍set/multiset 👍对组 👍map / multimap ❤️最后 😘 闲聊几句 时间过的很快,码神马上就要开学了,这也是STL系列的最后一篇了,假期学了不少,距离自己的奥赛巅峰水平可以说是十分接近了,如果说学这c++有什么用的话,可能就是兴趣所至吧,在博客更新之际,也认识了不少行业大佬,给我提了不少意见,感谢!STL完了以后,就是算法和python脚本吧,做自己想做的事情,更要做难的事情,总体来说STL的浏览量不多,但是还要说,why
秋名山码神
2022/12/13
2620
⭐️STL⭐️之list,set,map全解,❤️算法必备❤️<下>
❤ 挑战C站最强C++ STL标准库总结(内含大量示例)
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,(ノ´▽`)ノ♪-》点击这里->一个宝藏级人工智能教程网站。
全栈程序员站长
2022/09/09
1.4K0
❤ 挑战C站最强C++ STL标准库总结(内含大量示例)
【C++】详解 set && multiset && map && multiset 的使用
​ 我们已经接触过 STL 中的部分容器,比如:vector、list、deque、forward_list 等,这些容器统称为 序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。至于 stack 和 queue,他们其实不能算是容器,而应该是**容器适配器**,是用 deque 封装的。
利刃大大
2025/02/16
1130
【C++】详解 set && multiset && map && multiset 的使用
C++中STL-set详解
目录 set/ multiset容器 1. set基本概念 2.set构造和赋值 3.set大小和交换 4.set插入和删除 5.set容器-查找和统计 6.set和multiset的区别 7.pair对组创建 8.set容器排序 9.set存放自定义数据类型 ---- set/ multiset容器 1. set基本概念 简介: 所有元素都会在插入时自动被排序 本质: set/multiset属于关联式容器,底层结构是用二叉树实现。 set和multiset区别:  set不允许容器中有重复的
莫浅子
2022/12/09
4660
C++中STL-set详解
C++:set和map的使用
一般来说,像string、vector、list、deque、forward_list等容器,这些容器的底层逻辑机构为线性序列的数据结构,所以这些容器也叫做序列式容器,序列式容器两个位置存储的值之间一般没有紧密的关联关系,如若将其交换,依旧是序列式容器。序列式容器中的元素是按他们在容器中的存储位置保存和访问的。
HZzzzzLu
2024/11/26
1780
C++:set和map的使用
【C++指南】你真的了解map和set吗?【上】
序列式容器:前文所讲的STL中的string、vector、list、deque、array、forward_list等容器,我们都称为序列式容器,因为它们的逻辑结构是线性序列的,两个位置存储的值之间⼀般没有紧密的关联关系,⽐如交换⼀下,他依旧是序列式容器。
egoist祈
2025/03/22
950
【C++指南】你真的了解map和set吗?【上】
STL_set/multiset
简介:本文主要介绍STL中的,set与multiset的使用,只需要把本文的代码自己敲完便可学会。
GeekLiHua
2025/01/21
850
STL_set/multiset
C++进阶:详细讲解容器set与map(pair、multiset、multimap)
std::pair 是C++标准库中提供的一个简单的键值对实现。它包含在 <utility> 头文件中。一个 std::pair 有两个公有成员:first 和 second,分别表示键和值==(first<= =>key ; second<= =>value)==
是Nero哦
2024/04/10
5020
C++进阶:详细讲解容器set与map(pair、multiset、multimap)
【c++丨STL】set/multiset的使用
之前,我们已经探索了STL中的多个容器及容器适配器,如string、vector、list,以及stack和priority_queue等。今天,我们将进一步拓宽视野,深入学习STL中的容器——set及其变种multiset。
ephemerals__
2024/12/25
1550
【c++丨STL】set/multiset的使用
【C++】map和set
在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、 forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身,存储的数据之间没有关联。那什么是关联式容器?它与序列式容器有什么区别?
zxctscl
2024/11/29
1280
【C++】map和set
C++ —— set系列的使用
https://legacy.cplusplus.com/reference/set/
迷迭所归处
2024/11/19
1000
C++ —— set系列的使用
C++ STL学习之容器set和multiset (补充材料)
一、set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。 需要包含头文件: #include <set> set和mu
Angel_Kitty
2018/04/08
1.2K0
C++ STL学习之容器set和multiset (补充材料)
【C++】map和set的使用
  vector、list、dequeforward_list(C++11)等,这些容器统称为 序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?
用户11029129
2024/08/14
1230
【C++】map和set的使用
【C++进阶篇】C++容器完全指南:掌握set和map的使用,提升编码效率
在C++中,容器是存储和操作数据的核心工具。序列式容器(如vector、list)通过线性顺序存储数据,而关联式容器(如set、map)则通过键值对存储数据,允许更高效的查找、插入和删除。set是一个存储唯一元素的容器,内部自动排序,底层通常使用红黑树实现。它支持高效的查找和元素去重。map是存储键值对的容器,每个键都是唯一的,值可以重复,同样基于红黑树实现,提供快速的键值对查找。在需要快速检索、插入或删除元素时,set和map是非常实用的选择。
熬夜学编程的小王
2025/05/19
1830
【C++/STL】map和set介绍
vector、list、deque等这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。
秦jh
2024/07/23
910
【C++/STL】map和set介绍
map和set的概念及使用
树型结构的关联式容器主要有四种:map、set、multimap、multiset四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。
海盗船长
2020/08/27
6740
相关推荐
【C++】unordered_set和unordered_map
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验