文章目录

  • 1 迭代器与生成器
    • 1.1 迭代器
      • 1.1.1 基本使用
      • 1.1.2 手动迭代(带异常处理)
      • 1.1.3 自定义迭代器
    • 1.2 生成器
      • 1.2.1 工作原理
      • 1.2.2 斐波那契数列示例
    • 1.3 推导式
      • 1.3.1 列表推导式
      • 1.3.2 字典推导式
      • 1.3.3 集合推导式
      • 1.4.4 元组推导式(生成器表达式)
  • 2 with关键字
    • 2.1 基本语法
    • 2.2 常用场景
      • 2.2.1 文件操作(最典型)
      • 2.2.2 数据库连接
      • 2.2.3 线程锁
    • 2.3 工作原理:上下文管理协议
    • 2.4 自定义上下文管理器
      • 2.4.1 方式 1:类实现
      • 2.4.2 方式 2:使用 contextlib 模块
    • 2.5 最佳实践

1 迭代器与生成器

1.1 迭代器

  • 迭代器是可记住遍历位置的对象
  • 只能向前遍历,不能后退
  • 核心方法:iter() 创建迭代器,next() 获取下一个元素

1.1.1 基本使用

# 创建迭代器
list = [1, 2, 3, 4]
it = iter(list)  # 创建迭代器对象# 访问元素
print(next(it))  # 1
print(next(it))  # 2# 使用for循环遍历
for x in it:print(x, end=" ")  # 3 4

1.1.2 手动迭代(带异常处理)

import sysit = iter([1, 2, 3, 4])while True:try:print(next(it))except StopIteration:sys.exit()  # 迭代结束时退出

1.1.3 自定义迭代器

需实现两个方法:

  • __iter__(): 返回迭代器对象本身
  • __next__(): 返回下一个元素,迭代结束时抛出StopIteration
class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):if self.a <= 20:  # 限制迭代次数x = self.aself.a += 1return xelse:raise StopIteration  # 结束迭代# 使用自定义迭代器
myclass = MyNumbers()
for x in iter(myclass):print(x)  # 输出1到20

1.2 生成器

  • 使用yield关键字的函数称为生成器
  • 生成器是特殊的迭代器,可逐步产生值
  • 调用生成器函数返回的是迭代器对象

1.2.1 工作原理

  • 执行到yield时返回值并暂停
  • 下次调用时从暂停处继续执行
  • 适合处理大量数据或无限序列
def countdown(n):while n > 0:yield n  # 返回当前值并暂停n -= 1# 使用生成器
generator = countdown(5)
print(next(generator))  # 5
print(next(generator))  # 4# 用for循环迭代剩余值
for value in generator:print(value)  # 3 2 1

1.2.2 斐波那契数列示例

def fibonacci(n):a, b, counter = 0, 1, 0while True:if counter > n:returnyield a  # 返回当前斐波那契数a, b = b, a + bcounter += 1# 使用生成器
f = fibonacci(10)
for x in f:print(x, end=" ")  # 0 1 1 2 3 5 8 13 21 34 55

1.3 推导式

推导式是一种简洁的数据处理语法,可从一个序列构建新序列,支持列表、字典、集合和元组。

1.3.1 列表推导式

格式[表达式 for 变量 in 列表 if 条件]

实例 1:过滤并转换

names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names = [name.upper() for name in names if len(name) > 3]
# 结果: ['ALICE', 'JERRY', 'WENDY', 'SMITH']

实例 2:数值筛选

multiples = [i for i in range(30) if i % 3 == 0]
# 结果: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

1.3.2 字典推导式

格式{key表达式: value表达式 for 变量 in 集合 if 条件}

实例 1:字符串长度字典

listdemo = ['Google','Runoob', 'Taobao']
newdict = {key: len(key) for key in listdemo}
# 结果: {'Google': 6, 'Runoob': 6, 'Taobao': 6}

实例 2:数字平方字典

dic = {x: x**2 for x in (2, 4, 6)}
# 结果: {2: 4, 4: 16, 6: 36}

1.3.3 集合推导式

格式{表达式 for 变量 in 序列 if 条件}

实例 1:计算平方

setnew = {i**2 for i in (1, 2, 3)}
# 结果: {1, 4, 9}

实例 2:字符筛选

a = {x for x in 'abracadabra' if x not in 'abc'}
# 结果: {'d', 'r'}

1.4.4 元组推导式(生成器表达式)

格式(表达式 for 变量 in 序列 if 条件)
注意:返回生成器对象,需用tuple()转换

实例:生成数字元组

a = (x for x in range(1, 10))  # 生成器对象
print(tuple(a))  # 转换为元组
# 结果: (1, 2, 3, 4, 5, 6, 7, 8, 9)

2 with关键字

with 关键字用于上下文管理,简化资源(如文件、数据库连接)的获取与释放,确保资源使用后被正确清理。

对比传统资源管理方式:

传统方式(try-finally)with 语句
需手动调用 close()自动释放资源
代码冗长简洁直观
易遗漏关闭操作异常安全

传统文件操作示例

file = open('test.txt', 'r')
try:content = file.read()
finally:file.close()  # 必须手动关闭

2.1 基本语法

with 表达式 [as 变量]:# 代码块(使用资源)
  • 表达式返回上下文管理器对象
  • as 变量:可选,将对象赋值给变量
  • 代码块执行完毕后,自动触发资源清理

2.2 常用场景

2.2.1 文件操作(最典型)

# 读取文件
with open('example.txt', 'r') as file:content = file.read()print(content)
# 退出代码块后,文件自动关闭# 同时操作多个文件
with open('in.txt', 'r') as infile, open('out.txt', 'w') as outfile:outfile.write(infile.read().upper())  # 转换为大写并写入

2.2.2 数据库连接

import sqlite3with sqlite3.connect('mydb.db') as conn:cursor = conn.cursor()cursor.execute('SELECT * FROM users')print(cursor.fetchall())
# 连接自动关闭,无需手动调用 close()

2.2.3 线程锁

import threadinglock = threading.Lock()with lock:# 临界区代码(自动加锁/解锁)print("线程安全的操作")

2.3 工作原理:上下文管理协议

支持 with 的对象需实现两个方法:

  • __enter__():进入上下文时调用,返回值赋给 as 后的变量
  • __exit__():退出上下文时调用,负责资源清理

执行流程

  1. 执行表达式,获取上下文管理器
  2. 调用 __enter__() 方法,进入上下文
  3. 执行代码块
  4. 无论是否发生异常,都调用 __exit__() 方法

异常处理机制

__exit__() 方法接收三个参数:exc_type(异常类型)、exc_val(异常值)、exc_tb(追踪信息)

  • 返回 True:表示异常已处理,不再传播
  • 返回 False/None:异常继续向外传播

2.4 自定义上下文管理器

2.4.1 方式 1:类实现

class Timer:def __enter__(self):import timeself.start = time.time()return self  # 可通过 as 接收def __exit__(self, exc_type, exc_val, exc_tb):import timeprint(f"耗时: {time.time() - self.start:.2f}秒")return False  # 不抑制异常# 使用
with Timer() as t:sum(range(10000000))  # 执行耗时操作

2.4.2 方式 2:使用 contextlib 模块

from contextlib import contextmanager@contextmanager
def tag(name):print(f"<{name}>")  # __enter__ 部分yield  # 暂停,执行代码块print(f"</{name}>")  # __exit__ 部分# 使用
with tag("h1"):print("这是标题内容")# 输出:
# <h1>
# 这是标题内容
# </h1>

2.5 最佳实践

  1. 优先使用 with:处理文件、网络连接、锁等资源时,必用 with
  2. 精简代码块with 内只写与资源相关的操作
  3. 多资源管理:一个 with 可同时管理多个资源(用逗号分隔)
  4. 异常处理:自定义上下文时,明确是否需要抑制异常

with 语句通过自动化资源管理,大幅提升了代码的可读性和可靠性,是 Python 中处理资源的首选方式。

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

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

相关文章

C++——C++重点知识点复习2(详细复习模板,继承)

目录 模板 函数模板 类模板 非类型模板参数 模板的特化 函数模板特化 类模板的特化 为什么普通函数可以分离&#xff1f; 继承 继承概念 基类和派生类对象赋值转换&#xff08;切割&#xff0c;切片&#xff09; 隐藏 派生类的默认成员函数 .复杂的菱形继承及菱形…

python 项目编号 2025821 有关于中英文数据的收集、处理

python专栏记录&#xff1a;前言 批量读取单词 JSON 文件 → 解析出单词、释义、例句、短语 → 数据清洗&#xff08;去掉特殊符号&#xff09; → 同步更新到 MySQL 数据库。 内容 import json import pymysql import re import time from pymysql.converters import escape_s…

Document Solutions .NET Bundle 8.2.0

Document Solutions .NET Bundle 8.2.0MESCIUS 的 Document Solutions .NET Bundle 是一套完整的 API 和查看工具&#xff0c;可增强文档处理并提高效率。它包含 Excel、Word、PDF 和图像文档&#xff0c;以及 PDF 查看器、数据查看器和图像查看器的标准许可证。它将强大的 .NE…

在职老D渗透日记day20:sqli-labs靶场通关(第27关)get报错注入 过滤select和union ‘闭合

5.27.第27关 get报错注入 过滤select和union 闭合function blacklist($id) { $id preg_replace(/[\/\*]/,"", $id); //strip out /* $id preg_replace(/[--]/,"", $id); //Strip out --. $id preg_replace(/[#]/,"", $id); //Strip out #. $…

Go 并发编程-channel

channel 文章目录channel简介基本概念类型表示法值表示法操作的特性初始化通道接收元素值Happens before发送值例1核心组件关键执行顺序输出示例&#xff08;可能顺序&#xff09;设计要点例2例3关闭通道长度与容量单向通道主要用途增强代码表达性和安全性&#xff08;最重要的…

开源和免费一样吗?以商城系统为例为您分析~

开源和免费并不完全一样&#xff0c;二者在核心定义、权利范围和实际应用中存在显著区别&#xff0c;具体可以从以下几个方面理解&#xff1a; 1. 核心定义不同开源&#xff08;Open Source&#xff09;&#xff1a; 指软件的源代码是公开可获取的&#xff0c;任何人都可以查看…

CMOS知识点 MOS管饱和区电流公式

知识点16&#xff1a;同上篇一样&#xff0c;MOS管主要有3个工作区域&#xff1a;截止区&#xff08;Cut-off Region&#xff09;&#xff1a; < &#xff0c;没有沟道形成&#xff0c;几乎没有电流。线性区/三极管区&#xff08;Triode Region&#xff09;&#xff1a; &g…

【集合框架LinkedList底层添加元素机制】

在 Java 集合框架中&#xff0c;LinkedList 与 ArrayList 是两种截然不同的线性表实现。如果说 ArrayList 像一个可以伸缩的“盒子阵列”&#xff0c;那么 LinkedList 就像一条由“节点”串联而成的“双向链条”。今天&#xff0c;我们将深入 LinkedList 的源码&#xff0c;一步…

《P2700 逐个击破》

题目背景三大战役的平津战场上&#xff0c;傅作义集团在以北平、天津为中心&#xff0c;东起唐山西至张家口的铁路线上摆起了一字长蛇阵&#xff0c;并企图在溃败时从海上南逃或向西逃窜。为了就地歼敌不让其逃走&#xff0c;指挥官制定了先切断敌人东西两头退路然后再逐个歼灭…

C6.0:晶体管放大器的原理与应用(基极偏置篇)

将晶体管Q点偏置在负载线中点附近后&#xff0c;如果将一个小的交流信号耦合到基极上&#xff0c;便会产生一个交流的集电极电压&#xff0c;交流集电极电压与交流基极电压波形相似&#xff0c;但是幅度要大了很多&#xff0c;即交流集电极电压是对交流基极电压的放大。本篇学习…

Oracle: cannot decrease column length because some value is too big

1.背景今天项目上查不到数据,查库发现默认20位的字段被改为了200,用的还是char类型&#xff0c;填充了一堆空格 2.知识LENGTH() 函数用于计算字符串字段 长度TRIM() 函数用于去除字符串字段 column 前后的空格&#xff08;默认&#xff09;或指定字符&#xff1a;SUBSTR() 用于…

Elasticsearch 写入全链路:从单机到集群

0. 先把术语摆正 Index&#xff08;索引&#xff09;&#xff1a;逻辑数据集合&#xff0c;≈ MySQL 的库。Document&#xff08;文档&#xff09;&#xff1a;一条 JSON 数据&#xff0c;≈ MySQL 的行。Field&#xff08;字段&#xff09;&#xff1a;文档里的键值&#xff0…

Java多线程编程——基础篇

目录 前言 一、进程与线程 1、进程 2、线程 二、并发与并行 1、并发 2、并行 三、线程调度 1、CPU时间片 2、调度方式 ①时间片轮转 ②抢占式调度 四、线程实现方式 1、继承 Thread 类 Thread的多种构造函数&#xff1a; 2、实现 Runnable 接口 五、线程的核心方法 1、start() …

阿里云的centos8 服务器安装MySQL 8.0

在 CentOS 8 上安装 MySQL 8.0 可以通过添加 MySQL 官方 YUM 仓库并使用 dnf 命令安装。以下是具体步骤&#xff1a; 步骤如下&#xff1a; 下载并添加 MySQL 官方 YUM 仓库 运行以下命令下载 MySQL 8.0 的 YUM 仓库配置文件&#xff1a; sudo dnf install https://dev.mysql.…

【运维进阶】Linux 正则表达式

Linux 正则表达式定义&#xff1a;正则表达式是一种pattern&#xff08;模式&#xff09;&#xff0c;用于与待搜索字符串匹配&#xff0c;以查找一个或多个目标字符串。组成&#xff1a;自成体系&#xff0c;由两类字符构成普通字符&#xff1a;未被显式指定为元字符的所有可打…

STM32输入捕获相位差测量技术详解(基于TIM1复位模式)

本文将深入解析基于STM32定时器输入捕获功能的方波相位差测量技术&#xff0c;通过复位模式实现高精度相位检测。以下是完整的代码实现与详细原理分析。一、相位差测量原理相位差测量基于两个同频方波信号下降沿时间差计算。核心原理&#xff1a;​复位模式​&#xff1a;将TIM…

什么是股指期货可转移阿尔法策略?

阿尔法&#xff08;Alpha&#xff09;是投资领域的一个术语&#xff0c;用来衡量投资组合的超额收益。简单来说&#xff0c;阿尔法就是你在市场上赚的比平均水平多出来的那部分钱。比如&#xff0c;市场平均收益率是5%&#xff0c;但你的投资组合收益率是10%&#xff0c;那你的…

AXI GPIO S——ZYNQ学习笔记10

AXI GPIO 同意通道混合输入输出中断控制#KEY set_property IOSTANDARD LVCMOS18 [get_ports {AXI_GPIO_KEY_tri_io[0]}] set_property PACKAGE_PIN J13 [get_ports {AXI_GPIO_KEY_tri_io[0]}] set_property IOSTANDARD LVCMOS18 [get_ports {AXI_GPIO_KEY_tri_io[1]}] set_pro…

如何通过传感器选型优化,为设备寿命 “续航”?

在当今竞争激烈的工业领域&#xff0c;企业就像在一场没有硝烟的战争中角逐&#xff0c;设备便是企业的“秘密武器”。设备的使用寿命&#xff0c;如同武器的耐用程度&#xff0c;直接决定了企业在生产战场上的“战斗力”。延长设备寿命&#xff0c;已然成为众多企业降低生产成…

WebSocket连接的例子

// 初始化WebSocket连接 const initWebSocket () > {console.log("初始化链接中...")const websocketUrl ws://61.54.84.16:9090/;// WebSocket服务器地址websocket new WebSocket(websocketUrl)//使用真实的webscket// websocket new MockWebSocket(websocket…