三个实例带你了解生成器的作用

python的生成器究竟有什么作用? 本文通过3个具体的例子向你阐述生成器的作用, 1. 使用生成器非常便利的结束两层for循环, 2. 一个for循环遍历多个列表, 3. 并行遍历多个可迭代对象

提到生成器,你可能会有一个简单的概念,如果函数里使用yield关键字,那么这个函数就是一个生成器,不同于return,生成器使用yield来返回值。

令人感到困惑之处在于,似乎yield和return 没啥区别,但实质上区别非常大,最明显之处便在于,return 语句执行后,函数就退出了,而yield语句执行时,仅仅是返回一个值而已,不存在函数结束这个概念,因此生成器都要结合for循环进行使用。

下面通过几个示例,来向你阐释生成器的作用

1. 使用生成器非常便利的结束两层for循环

两层循环过程中,如果想通过break终止循环,是一件简单,但却很麻烦的事情,例如下面的这段代码

lst1 = [1, 2, 4, 5, 6]

lst2 = [1, 5, 6, 8, 9]

stop = False

for i in lst1:

for j in lst2:

if i + j == 10:

stop = True

break

if stop:

break

两层for循环的目的非常简单,从两个列表中各找出一个数,使得他们的和等于10,而且只需找出一个组合即可。

找到满足要求的组合后,为避免不必要的循环,需要终止循环,而此时,if条件语句在for循环的最里层,此处执行break,只能跳出最里层的for循环,想要终止最外层的for循环,就必须传递终止信号给它,代码里,通过stop=True,告知外层for循环可以终止了。

这样的代码写起来,显然有些繁琐,最后的if stop判断总显得多余,面对这种情况,可以巧妙的利用生成器来避免这种复杂的写法。

lst1 = [1, 2, 4, 5, 6]

lst2 = [1, 5, 6, 8, 9]

def num_generator(lst1, lst2):

for i in lst1:

for j in lst2:

yield i, j

for i, j in num_generator(lst1, lst2):

if i + j == 10:

print(i, j)

break

生成器num_generator里通过两层for循环对数据进行遍历,真正的业务逻辑使用一个for循环,这里就避免了跳出两层for循环的困境,这一次break,结束了for循环对num_generator的使用。

试想一下,如果没有生成器这种技术,有什么办法能实现一个break跳出两层for循环么? 这种技术还可以扩展到更多层的for循环。

2. chain--一个for循环遍历多个列表

有这样一种应用场景,你需要遍历多个列表来执行某个操作,比如下面两个列表,你需要找出列表里所有的偶数

lst1 = [1, 2, 4, 5, 6]

lst2 = [1, 5, 6, 8, 9]

2.1 嵌套循环

一种直接的方法是使用多层for循环

lst1 = [1, 2, 4, 5, 6]

lst2 = [1, 5, 6, 8, 9]

for lst in [lst1, lst2]:

for item in lst:

if item % 2 == 0:

print(item)

2.2 创建新列表

为了减少for循环的层次,你也可以创建一个新的列表,包含这两个列表里的所有数据

lst1 = [1, 2, 4, 5, 6]

lst2 = [1, 5, 6, 8, 9]

lst = [*lst1, *lst2]

for item in lst:

if item % 2 == 0:

print(item)

2.3 chain

上面两个方法虽然都可以满足要求,但还有更简单的方法,使用chain

from itertools import chain

lst1 = [1, 2, 4, 5, 6]

lst2 = [1, 5, 6, 8, 9]

for item in chain(lst1, lst2):

if item % 2 == 0:

print(item)

chain内部会对传入的参数逐个进行遍历,lst1 和 lst2仿佛成为一个整体,如果不使用python提供的这个chain类,我们自己可以通过生成器来实现一个效果相同的函数

lst1 = [1, 2, 4, 5, 6]

lst2 = [1, 5, 6, 8, 9]

def my_chain(*iters):

for iter_item in iters:

for item in iter_item:

yield item

for i in my_chain(lst1, lst2):

if i % 2 == 0:

print(i)

3. zip--并行遍历多个可迭代对象

使用chain时,是对列表逐个进行遍历,但有时,我们又希望是并行遍历,python原生的zip函数提供了这样的功能,下面是使用示例

lst1 = ['python', 'java', 'c']

lst2 = [95, 97, 98]

dic = {}

for language, score in zip(lst1, lst2):

dic[language] = score

print(dic)

两个列表,第一个列表是科目,第二个列表是分数,需要将这两个列表的内容转换为字典,使用zip函数,就可以并行遍历两个列表,接下来,我们自己使用生成器来实现一个相同功能的函数

lst1 = ['python', 'java', 'c']

lst2 = [95, 97, 98]

def my_zip(*args):

min_len = min(len(item) for item in args)

index = 0

while index < min_len:

lst = []

for iter_item in args:

lst.append(iter_item[index])

index += 1

yield tuple(lst)

info = {}

for language, score in my_zip(lst1, lst2):

info[language] = score

python的用途实例-三个实例带你了解生成器的作用相关推荐

  1. python回调接口_三个案例带你了解python回调函数

    原标题:三个案例带你了解python回调函数 回调函数: 把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用 ...

  2. python的函数调用_三个案例带你了解python回调函数

    回调函数: 把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用 ...

  3. python可视化分析(三)-绘制带趋势线的散点图

    实现功能: 在散点图上添加趋势线(线性拟合线)反映两个变量是正相关.负相关或者无相关关系. 实现代码: import pandas as pd import matplotlib as mpl imp ...

  4. Vue实例和组件实例

    一.创建一个应用实例 每一个vue应用都是通过createApp函数创建一个新的应用实例开始的 const app = Vue.createApp({ /*选项*/ }) 该应用实例是用来在应用中注册 ...

  5. python自动化发送邮件_python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下(详解)...

    简介 发邮件前我们需要了解的是邮件是怎么一个形式去发送到对方手上的,通俗点来说就是你写好一封信,然后装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去,其他的就不关心了,只是关心时间,而电子邮 ...

  6. python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下

    简介 发邮件前我们需要了解的是邮件是怎么一个形式去发送到对方手上的,通俗点来说就是你写好一封信,然后装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去,其他的就不关心了,只是关心时间,而电子邮 ...

  7. python程序实例教程基础-python基础教程第三版源代码

    [实例简介] python基础教程第三版源代码 python基础教程第三版源代码 [实例截图] [核心代码] Beginning_Python_version3_SourceCode └── Begi ...

  8. python数据库实例_Python3.6简单的操作Mysql数据库的三个实例

    安装pymysql 参考:https://github.com/PyMySQL/PyMySQL/ pip install pymsql 实例一 import pymysql # 创建连接 # 参数依次 ...

  9. Python 暴力绘制RGB三色图 Pygame框架下实例

    Python 暴力绘制RGB三色图 Pygame框架下 昨天水群,有个群友想要绘制一个三色图,如下 对于Pygame或者其他的GUI框架,画面显示都是依靠图像的一层层覆盖来实现刷新的.所以当绿色的圆覆 ...

最新文章

  1. clusterProfiler对差异表达基因进行富集分析
  2. class viewController has no initializers解决办法
  3. [转载]男生女生过家家呀
  4. 进程间通信-Queue 消息队列 先进先出
  5. sealer背后实现整个集群一键交付的奥秘 | 龙蜥技术
  6. 天线接收功率计算公式_对讲机天线到底有多重要?通信效果好不好全靠它了!...
  7. oracle 之索引,同义词 ,关键词,视图 ,存储过程,函数,触发器
  8. python部署thrift服务以及客户端
  9. 计算机tlv简介_TLV编码格式详解
  10. 史上最详细的Maven安装教程
  11. 《微软System Center 2012 R2私有云部署实战》——第一章 微软私有云概述1.1 大数据...
  12. ueditor的初始化使用
  13. 鸿蒙系统安装第三方,网友表示:鸿蒙最新系统可以通过连接U盘安装第三方软件了...
  14. Calcite的PullUp规则
  15. 浅谈filter中的chain.doFilter(request, response)的作用
  16. 计算机不能上网查找原因的步骤,电脑不能上网的原因及操作步骤_电脑突然不能上网...
  17. FreeMind简介
  18. 界面控件BCGControlBar for .NET v7.1正式发布——支持VS 2022
  19. Windows11不插耳机、音箱提示无法找到输出设备的问题解决方法
  20. 性能调优攻略——来自酷壳陈皓

热门文章

  1. C++ decltype类型指示符
  2. [转] - 学习ASP.NET比较完整的流程!
  3. KRSReader酷狗音乐歌词写真图片提取工具(提取KRS文件中的图片)
  4. 20个非常有用的PHP类库
  5. 基于MIPS架构的BackTrace实现
  6. Godaddy如何导入导出MSSQL数据库
  7. python使用符号#表示单行注释-【经济金融及Python应用讲义】Python编程规范之注释...
  8. 基于python物流管理系统毕业设计-Python程序设计实验报告八:文件
  9. 怎么安装python3-如何装python3
  10. python爬虫代码1000行-最精简的爬虫 --仅需4行代码(python)