Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法

本人之前一直是Java工程师,最近接触了一个Python项目,第一次看到如下的代码:

i = sum(letter in target_arr for letter in source_arr)

这条语句是计算source 与 target 数组中有几个单词是相同的。

当我第一眼看到这样的写法的时候,我的第一感觉是这样的。
还可以这样写?
我读书少,见识少,那是真不懂,于是赶紧孤狗一下,想要一探究竟。

原来这叫:生成器表达式

生成器表达式语法

生成器表达式(Generator Expression)是一种简洁高效地创建迭代器(Iterator)的方式。它类似于列表推导式(List Comprehension),但生成器表达式使用圆括号 () 而不是方括号 []。
生成器表达式的语法
(expression for item in iterable if condition)

  • expression:对每个元素进行的操作,生成迭代器中的值。

  • item:迭代变量,表示可迭代对象 iterable 中的每个元素。

  • iterable:可迭代对象,例如列表、元组、字符串等。

  • condition:可选的过滤条件,只有满足条件的元素才会被处理。
    生成器表达式的特点

  • 惰性求值: 生成器表达式不会一次性计算所有元素,而是按需生成。这样可以节省内存,特别是在处理大量数据时。

  • 返回迭代器: 生成器表达式返回一个迭代器对象,可以通过 for 循环或 next() 函数来遍历其中的元素。

  • 不可索引: 迭代器不支持索引操作,不能像列表那样通过下标访问元素。
    生成器表达式的应用

  • 过滤数据:
    even_numbers = (x for x in range(10) if x % 2 == 0) # 偶数

  • 映射数据:
    squares = (x**2 for x in range(5)) # 平方数

  • 组合数据:
    pairs = ((x, y) for x in [1, 2] for y in [3, 4]) # [(1, 3), (1, 4), (2, 3), (2, 4)]

  • 传递给函数:
    sum(x for x in range(100) if x % 3 == 0) # 3 的倍数之和

生成器表达式 vs. 列表推导式

特点生成器表达式列表推导式
返回值迭代器对象列表
惰性求值
内存占用
适用场景处理大量数据、只需遍历一次的数据需要多次访问数据、需要索引操作的数据

案例分析

回到我们的案例中来,我们根据语法解释对我们文章开始的案例进行拆解。

i = sum(letter in target_arr for letter in source_arr)

(expression for item in iterable if condition)对应关系

语法元素生成器表达式中的元素解释
expressionletter in target_arr对于每个 letter,判断它是否存在于target_arr 中,返回布尔值
itemletter迭代变量,表示 source_arr 中的每个元素
iterablesource_arr可迭代对象,源字符串数组
condition(无)此处没有过滤条件,所有 letter 都会被处理

总结

  • 生成器表达式会遍历 source_arr 中的每个 letter。
  • 对于每个 letter,计算 letter in target_arr,得到一个布尔值(True 或 False)。
  • sum 函数将这些布尔值相加,得到匹配的总次数,即 match_score。

注意事项

  • 这里没有使用 if condition 部分,表示不对元素进行过滤,所有元素都会参与计算。
  • 由于 Python 中 True 被视为 1,False 被视为 0,所以 sum 函数可以直接对布尔值求和。

希望这个详细的语法讲解能帮助您更好地理解生成器表达式的语法和用法!

关注我的公众号

欢迎大家关注、点赞、转发,一起交流软件开发、架构设计、云原生技术。
TXZQ聊IT技术与架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell遍历路径所有文件并把列表写成字符串遍历

1. ls dir/* | tr ‘\n’ ’ ’ 换行替换成空格 你可以使用 ls 命令和 tr 命令来将文件列表根据空格拼接起来成一个字符串。以下是一个示例: ls dir/* | tr \n 解释 ls dir/*:列出 dir 目录下的所有文件。tr \n :将所有的换行符&#xf…

ChatGPT生成常见面试题【面试准备】

ChatGPT生成常见面试题【面试准备】 前言版权ChatGPT生成常见面试题【面试准备】MySQL面试问题与回答1. 数据库连接与操作2. 索引和查询优化3. 事务管理4. 索引是什么?为什么使用索引可以提高查询性能?如何在MySQL中创建索引?5. SQL查询优化有…

Varjo XR-4功能详解:由凝视驱动的XR自动对焦相机系统

Varjo是XR市场中拥有领先技术的虚拟现实设备供应商,其将可变焦距摄像机直通系统带入到虚拟和混合现实场景中。在本篇文章中,Varjo的技术工程师维尔蒂莫宁详细介绍了这项在Varjo XR-4焦点版中投入应用的技术。 对可变焦距光学系统的需求 目前所有其他XR头…

WPF之容器标签之Canvas布局标签

Canvas: 定义一个区域&#xff0c;可在其中使用相对于 Canvas 区域的坐标以显式方式来定位子元素。 实例 可以在子标签使用Canvas属性设置定位 <Canvas Width"500" Height"300"><StackPanel Width"100" Height"100"Backgro…

网页抓取之requests库的使用

Python网络数据采集利器 - Requests库的使用指南 简介 在Python网络爬虫领域,优秀的第三方库Requests可谓是必学的重要工具。它提供了相当人性化的API,让我们能够用极其简洁的代码发送HTTP/HTTPS请求,并且自动处理cookies、headers、编码等诸多繁琐细节,大大减轻了网页抓取的…

【pdb的使用方法】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、 pdb 是什么&#xff1f;二、基本用法1.启动 PDB 调试器&#xff1a;2.单步执行代码&#xff1a;3.查看变量值&#xff1a;4.退出调试器&#xff1a; 三、高级用…

指数分布的理解,推导与应用

指数分布的定义 在浙大版的教材中&#xff0c;指数分布的定义如下&#xff1a; 若连续型的随机变量 X X X的概率密度为&#xff1a; f ( x ) { 1 θ e − x θ , x>0 0 , 其他 f(x) \begin{cases} \frac{1}{\theta} e^{-\frac{x}{\theta}}, & \text{x>0}\\ 0, &a…

mvn编译所有单元测试报错OOM

org.mockito.exceptions.base.MockitoException: Cannot instantiate InjectMocks field named ‘productLogic’ of type ‘class .ProductLogic’. You haven’t provided the instance at field declaration so I tried to construct the instance. However the constructo…

Python正则表达式与Excel文件名批量匹配技术文章

目录 引言 正则表达式基础 Python中的re模块 Excel文件名批量匹配案例 常见问题与解决方案 结论 引言 在现代办公环境中&#xff0c;Excel文件几乎成为了数据分析和处理的标配工具。由于Excel文件可能包含大量的数据和信息&#xff0c;因此&#xff0c;对Excel文件的命名…

在aspNetCore中 使用System.Text.Json的定制功能, 将定制化的json返回给前端

C# 默认大写, 而大部分的前端默认小写, 这时候可以如此配置: builder.Services.AddControllers().AddJsonOptions((opt) > {opt.JsonSerializerOptions.PropertyNamingPolicy System.Text.Json.JsonNamingPolicy.CamelCase;opt.JsonSerializerOptions.WriteIndented true…

DSPF网络类型实验1

对R6配置 对R1配置 对R2 对R3 对R4 对R5 对R1R2R3R4R5加用户 环回处理 然后开始配置缺省 R1有两个下一跳 3&#xff0c;4&#xff0c;5同R2 然后对R1 dynamic动态 对R2 手写 把注册加上 register R3同R2处理

机柜里面的设备有哪些

一、服务器 服务器是机柜中最常见的设备之一。它们通常被用于存储和运行数据、应用程序和服务。不同的服务器通常使用不同的操作系统和处理器架构&#xff0c;以满足不同的需求。服务器可以使用冗余电源和冗余存储空间等措施&#xff0c;以确保数据安全和可靠性。 二、交换机 交…

删除链表的倒数第N个节点-力扣

第一种方法是使用前后指针&#xff0c;前指针先向前走n1步&#xff0c;然后前后指针同时向前&#xff0c;当前指针指向NULL时&#xff0c;后指针正好指向需要删除的节点的前一个节点&#xff0c;操作后指针删除即可。 代码如下&#xff1a; /*** Definition for singly-linked…

医学图像分割

论文&#xff1a;Medical Image Segmentation Using Deep Learning: A Survey 参考&#xff1a;[医学图像分割综述] Medical Image Segmentation Using Deep Learning: A Survey-CSDN博客 一、背景 特征表示的困难&#xff1a;模糊、噪声、对比度低--->CNN属于语义分割&a…

Web Server项目实战2-Linux上的五种IO模型

上一节内容的补充&#xff1a;I/O多路复用是同步的&#xff0c;只有调用某些API才是异步的 Unix/Linux上的五种IO模型 a.阻塞 blocking 调用者调用了某个函数&#xff0c;等待这个函数返回&#xff0c;期间什么也不做&#xff0c;不停地去检查这个函数有没有返回&#xff0c…

Offline RL : Beyond Reward: Offline Preference-guided Policy Optimization

ICML 2023 paper code preference based offline RL&#xff0c;基于HIM&#xff0c;不依靠额外学习奖励函数 Intro 本研究聚焦于离线偏好引导的强化学习&#xff08;Offline Preference-based Reinforcement Learning, PbRL&#xff09;&#xff0c;这是传统强化学习&#x…

轻量音乐网站程序源码,在线音乐免费听歌

这是一个高品质的音乐共享和流媒体平台&#xff0c;用户可以在这个网站上免费在线听歌。这个轻量级的音乐网站程序源码&#xff0c;是您创建自己的音乐流媒体网站的最佳选择&#xff01;它还支持制作插件&#xff0c;并且在更新后&#xff0c;您可以保留您的自定义设置。 下 载…

操作系统408考研-经典例题

什么是操作系统?答:操作系统,是计算机系统中最基本、最重要的系统软件,是其它软件 的***支撑***。控制和管理计算机系统的硬件和软件资源,合理的组织计算机工 作流程,并为用户使用计算机提供公共和基本的服务 2.多道程序 (multiprogrammming) 和多重处理 (multiprocessi…

Python基于PyQt6制作GUI界面——多选框

QCheckBox 是 PyQt6 中的一个复选框控件&#xff0c;它允许用户通过单击来选择或取消选择某个选项。与 QRadioButton 不同&#xff0c;QCheckBox 控件并不互斥&#xff0c;这意味着用户可以同时选择多个 QCheckBox。示例对应的制作的 ui文件 界面如下所示。 <?xml version…