【Python】迭代器、生成器、表达式


列表推导式

列表推导式是Python中快速生成列表的一种方法,它允许你使用可迭代对象快速生成一个列表,可以替代简单的循环语句。

基本结构:[expression for item in iterable if condition]

  • expression:基于迭代变量,可以是任何Python表达式,如元组,集合等。
  • item:迭代器返回的项目。
  • iterable:Python中可迭代对象,包括有内置的五个数据结构,文件对象,生成器,以及其他内置迭代器(如,range,zip,map,filter等),还有自定义迭代器,外部库中的可迭代对象等
  • condition:可选的条件语句。
# 包含条件的列表推导式
even_squares = [x*x for x in range(10) if x % 2 == 0]
print(even_squares)  # 输出: [0, 4, 16, 36, 64]# 等价下列程序(可根据这个理解)
even_squares = []
for x in range(10):if x % 2 == 0:even_squares.append(x*x)print(even_squares)  # 输出: [0, 4, 16, 36, 64]# 使用元组表达式
even_squares = [(x, x*x) for x in range(10) if x % 2 == 0]
print(even_squares)  # 输出: [(0, 0), (2, 4), (4, 16), (6, 36), (8, 64)]

除了基本的列表推导式,Python还支持嵌套列表推导式

你可以在列表推导式中使用多个循环,实现更复杂的迭代逻辑。

# 使用嵌套列表推导式处理二维数组
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)  # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]# 它也可以进行拆分理解

迭代器

迭代器是Python中一个实现了迭代器协议的对象,这包括__iter__()__next__()两个方法。迭代器允许程序员在容器(如列表或字典)上进行遍历。

迭代器的工作原理:

  • __iter__()方法返回迭代器对象本身。
  • __next__()方法返回容器的下一个项目。当容器中没有更多元素时,__next__()应该抛出一个StopIteration异常。

创建自定义迭代器的示例:

class Countdown:def __init__(self, start):self.current = startdef __iter__(self):return selfdef __next__(self):if self.current <= 0:raise StopIterationelse:num = self.currentself.current -= 1return num# 使用迭代器
counter = Countdown(5)
for num in counter:print(num)

生成器

生成器是一种特殊类型的迭代器,它通过一个包含yield语句的函数定义。当生成器函数被调用时,它不会立即执行,而是返回一个生成器对象。这个对象在迭代时才真正执行函数内的代码。

每次调用next()方法(或在for循环中迭代)时,my_generator函数执行到下一个yield语句并暂停执行,返回yield后的值。当再次被调用时,从上次离开的地方继续执行。

def my_generator():yield 'a'yield 'b'yield 'c'gen = my_generator()
for value in gen:print(value)

生成器使用迭代来处理数据,这意味着在任何时候内存中只有一个数据项被处理,这个特点使他成为处理大型数据集时的理想选择,例如大型文件或网络流。

def read_large_file(file_name):with open(file_name, 'r') as file:for line in file:yield line.strip()log_lines = read_large_file('large_log_file.log')
for line in log_lines:if "ERROR" in line:print(line)

生成器yield与return之间的比较:

1. return

return语句用于从函数返回一个值,结束函数的执行。当一个函数执行到return语句时,函数的局部变量的生命周期结束,控制流返回到函数被调用的地方。

  • 终结执行:执行到return语句时,函数的执行立即结束。
  • 返回值:可以返回一个值或None(如果没有指定返回值)。
  • 单次使用:函数中可以有多个return语句,但只有一个return语句会被执行。
def sum_two_numbers(a, b):return a + breturn a - bresult = sum_two_numbers(5, 3)
print(result)  # 输出: 8

2. yield

yield语句用于从一个函数返回一个值,并暂停函数的执行,即函数的状态被冻结,包括所有变量的值和指令指针的位置。yield通常用于创建生成器。

  • 暂停执行yield返回一个值后,函数的执行被暂停,保留当前所有变量的状态,直到再次调用时从上次离开的地方继续执行。
  • 多次使用:函数可以包含多个yield语句。每次通过迭代器请求值时,函数执行到下一个yield语句并再次暂停。
  • 不终结执行:使用yield的函数在提供值后,并未完全结束,而是等待下一次迭代。
def count_down(start):while start > 0:yield startstart -= 1for number in count_down(5):print(number)
# 输出:
# 5
# 4
# 3
# 2
# 1

生成器表达式

生成器表达式提供了一种语法更为紧凑的方式来创建生成器,它们的语法和列表推导式非常相似,但使用圆括号而不是方括号。生成器表达式适用于快速生成数据而不需要存储全部数据的情况。

基本结构:(expression for item in iterable if condition)

  • expression:基于迭代变量,可以是任何Python表达式,如元组,集合等。
  • item:迭代器返回的项目。
  • iterable:Python中可迭代对象,包括有内置的五个数据结构,文件对象,生成器,以及其他内置迭代器(如,range,zip,map,filter等),还有自定义迭代器,外部库中的可迭代对象等
  • condition:可选的条件语句。
squares = (x*x for x in range(10))
for square in squares:print(square, end=" ")
# 0 1 4 9 16 25 36 49 64 81

列表推导式与生成表达式的比较:

# 列表推导式
square_list = [x*x for x in range(10)]
# 生成器表达式
square_gen = (x*x for x in range(10))
  • 当你使用列表推导式时,Python会立即执行其中的表达式,生成列表中的所有元素,并将这些元素存储在内存中。这使得列表推导式非常快,因为它立即提供了一个完整的列表,但这种方法也可能消耗大量内存,特别是当列表非常大时。
  • 生成表达式则是返回一个生成器对象,该对象按需生成元素。这意味着元素只有在迭代时才被计算的,而不是在生成器表达式被定义时。这种方法可以显著降低内存使用,因为在任何时刻,只有一个元素被存储在内存中。

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

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

相关文章

机器学习:预测评估8类指标

机器学习&#xff1a;8类预测评估指标 R方值、平均值绝对误差值MAE、均方误差MSE、均方误差根EMSE、中位数绝对误差MAD、平均绝对百分误差MAPE、可解释方差分EVS、均方根对数误差MLSE。 一、R方值 1、说明&#xff1a; R方值&#xff0c;也称为确定系数或拟合优度&#xff…

多语言模型(Multilingual Models)用于推理(Inference)

在深入探讨多语言模型&#xff08;Multilingual Models&#xff09;用于推理&#xff08;Inference&#xff09;的详细内容时&#xff0c;我们需要首先理解多语言模型的基本概念、它们如何工作、为什么它们在现代自然语言处理&#xff08;NLP&#xff09;中变得如此重要&#x…

excel PivotTable 透视表

开发数据导出excel功能&#xff0c;设置导出透视表 数据源&#xff1a; 透视表&#xff1a; 使用插件EPPlus 数据源&#xff1a; IF OBJECT_ID(tempdb..#temptable) IS NOT NULLDROP TABLE #temptable; CREATE TABLE #temptable ( [PROJECT] varchar(50), [PRODUCT_CODE] var…

springboot双学位招生管理系统-计算机毕业设计源码93054

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码&#xff0c;我们用到的是tianai-captcha。 文档地址&#xff1a;http://doc.captcha.tianai.cloud/ 源码地址&#xff1a;https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…

从游戏到营销:抽卡机小程序的多维度应用探索

在数字化时代&#xff0c;小程序作为一种轻量级、即用即走的应用形态&#xff0c;正逐步渗透到人们生活的方方面面。其中&#xff0c;抽卡机小程序以其独特的趣味性和互动性&#xff0c;不仅在游戏领域大放异彩&#xff0c;更在营销领域展现出广阔的应用前景。本文将从游戏起源…

ELFK简介

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

vtk跨节点并行渲染

VTK&#xff08;Visualization Toolkit&#xff09;是一个用于科学计算可视化的开源库。在处理大型数据集时&#xff0c;通常需要进行跨节点&#xff08;分布式处理&#xff09;并行处理以提升性能。VTK支持使用MPI&#xff08;Message Passing Interface&#xff09;库进行并行…

.net core Redis 使用有序集合实现延迟队列

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的&#xf…

Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作

章节内容 上一节我们完成了&#xff1a; MapReduce的介绍Hadoop序列化介绍Mapper编写规范Reducer编写规范Driver编写规范WordCount功能开发WordCount本地测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学…

文件扫描pdf怎么弄?5个简易高效的文件扫描方法

在繁忙的工作中&#xff0c;我们常常需要将纸质文件快速转换为电子文档&#xff0c;以便于编辑、存储或分享。 无论是合同、报告还是笔记&#xff0c;将这些纸质文件转换为Word格式&#xff0c;不仅能提高工作效率&#xff0c;还能确保信息的安全备份。然而&#xff0c;面对市…

前端领域创作者纪念日:回顾与展望

引言 在2048天前&#xff0c;我加入了CSDN。本文将带您回顾前端技术的发展历程&#xff0c;探索前端创作者的贡献&#xff0c;并展望未来的发展方向。 前端技术的发展历程 前端技术的发展可以追溯到互联网的早期时代。最初的网页主要是静态的HTML文档&#xff0c;内容简单&…

57、Flink 的项目配置概述

1&#xff09;概览 1.开始 要开始使用 Flink 应用程序&#xff0c;请使用以下命令、脚本和模板来创建 Flink 项目。 可以使用如下的 Maven 命令或快速启动脚本&#xff0c;基于原型创建一个项目。 a&#xff09;Maven 命令 mvn archetype:generate \-Darch…

开源大模型的中流砥柱——LLaMA

元宇宙平台公司在近年来大力发展人工智能技术,尤其在大规模语言模型(LLM)领域取得了显著进展。其代表性作品LLaMA(Large Language Model)及其后续版本LLaMA 2和LLaMA 3,成为了业界关注的焦点。 LLaMA模型的发布与许可 LLaMA模型的发布标志着在自然语言处理(NLP)领域的…

使用 Spring Security 配置 HTTPS

引言 为了保护敏感数据免受网络攻击&#xff0c;在 Web 应用中使用 HTTPS 是必不可少的。HTTPS 提供了数据传输的加密&#xff0c;确保数据在客户端和服务器之间传输时的安全性。Spring Security 提供了简单的配置方式来实现 HTTPS。本文将详细介绍如何在 Spring Boot 项目中配…

wordpress建站用付费模板还是免费模板

在WordPress建站时&#xff0c;选择模板是一个重要的决策。我们可以看到免费和付费模板各有优缺点。 免费模板的主要优点是成本效益。对于预算有限的个人或小企业来说&#xff0c;免费模板是一个理想的选择&#xff0c;因为它们不需要任何费用。此外&#xff0c;免费模板通常与…

Redis 7.x 系列【16】持久化机制之 AOF

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 执行原理2.1 Redis 6.x2.1.1 直接写2.1.2 重写 2.2 Redis 7.x2.2.1 Redis 6…

Spring Ioc学习

第二章 Spring IOC 章节内容 Spring IOC技术实现Spring IOC设值注入Spring IOC构造注入 章节目标 掌握Spring IOC技术实现掌握Spring IOC设置注入掌握Spring IOC构造注入 第一节 Spring简介 1. Spring 简介 Spring 是目前主流的 Java 开发框架&#xff0c;是 Java 世界最…

基于Springboot+Vue+mysql仓库管理系统仓库进销存管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Vue 父子页面使用指南

Vue3父子页面使用指南 Vue3作为一种现代化的前端框架&#xff0c;提供了强大的组件化功能&#xff0c;使得页面开发更加模块化和可维护。本文将深入探讨Vue3中父子页面的使用方法&#xff0c;包括如何传递参数、父组件如何调用子组件的方法&#xff0c;以及父子页面的加载原理…