PD Python 精粹 2-1运算符、表达式和数据操作

S盒+异或+循环密钥:Windows PE查表逆向实战详解 阅读详情

Python 数据操作

本书由电子工业出版社出版,这里仅是在阅读本书中的个人学习笔记,如果侵权,请联系本人删除。纸质书购买请转到这里,本书作者提供的主页请点击这里,作者非常厉害,也是《Python Cookbook, 3rd》的作者。

迭代操作

迭代是一个重要的 Python 特性,所有 Python 容器(列表、元组、字典等)、文件以及生成器函数。下表中的操作可以应用于任何可迭代对象。

操作描述
for vars in s:迭代
v1, v2, ... = s变量析构
x in s, x not in s成员检查
[a, *s, b], (a, *s, b), {a, *s, b}在列表、元组或集合字面量中展开

可迭代对象最基本的操作是 for 循环。这是迭代的方式逐一检查这些值。所有其他操作都以此为基础。

x in s 运算符测试对象 x 是否作为以下运算符生成的项之一出现可迭代对象 s 并返回 TrueFalsex not in s 运算符与 not (x in s) 。对于字符串,innot in 运算符接受子字符串。例如,"hello" in "hello world" 中产生 True。请注意, in 运算符不支持通配符或任何类型的模式匹配。

任何支持迭代的对象都可以将其值解包到一系列地址。

items = [3, 4, 5]
x, y, z = items

letters = "abc"
x, y, z = letters

左侧的地址不必是简单的变量名。任何可以出现在等号的左侧的有效地址是可以接受的。

items = [3, 4, 5]
d = {}
d["x"], d["y"], d["z"] = items

将值解包到位置时,左侧位置的数量必须恰好匹配右侧可迭代项中的项目数。对于嵌套数据结构,匹配位置和数据遵循相同的结构模式。

datetime = ((5, 9, 2008), (10, "30", "am"))
(month, day, year), (hour, minute, am_pm) = datetime

有时候,_ 变量在拆包时可用来表示一个被丢弃的值:

(_, day, _), (hour, _, _) = datetime

如果不知道要解构的项数量,可以使用扩展形式通过包含带星号的变量来解包

items = [1, 2, 3, 4, 5]
a, b, *extra = items
*extra, a, b = items
a, *extra, b = items

*extra 接收所有额外项目,它始终是一个列表。当解构一个可迭代对象时,最多只能使用一个带星号的变量。然而,当解构更复杂的包含不同可迭代对象的数据结构时,则可以使用多个星号变量:

(month, *_), (hour, *_) = datetime

在列出列表、元组和集合字面量时,任何可迭代对象都可以被展开。这也是使用星号(*)完成。

>>> items = [1, 2, 3]
>>> a = [10, *items, 11]
>>> b = (*items, 10, *items)
>>> c = {10, 11, *items}
>>> a
[10, 1, 2, 3, 11]
>>> b
(1, 2, 3, 10, 1, 2, 3)
>>> c
{1, 2, 3, 10, 11}
>>>

在这个例子中,items 的内容只是粘贴到列表、元组或集合中,就像在该位置键入内容一样。这种扩展称为“泼溅”。定义字面量时,可以根据需要包含任意数量的 * 扩展。但是,许多可迭代对象(例如文件或生成器)仅支持一次迭代。如果你使用 * 扩展,内容将被消耗,并且迭代器不会再产生任何内容后续迭代中的值。

各种内置函数都接受任何可迭代对象作为输入。下表列出了一些这些操作。

函数描述
list(s)从 s 创建一个列表
tuple(s)从 s 创建一个列表
set(s)从 s 创建一个 Set
min(s [,key])s 中的最小项
max(s [,key])s 中的最大想
any(s)如果 s 中的任一项为真,则返回 True
all(s)如果 s 中的所有项为真,则返回 True
sum(s [, initial])所有项的总和,带有一个可选的初始值
sorted(s [, key])创建一个排序列表

序列操作

序列是一个可迭代的容器,具有一定的大小,并允许通过从 0 开始的整数索引,比如说字符串、列表和元组。除了所有涉及迭代的运算,下表中的运算符可以应用于序列。

操作符描述
s + r连接
s * n, n * s将 s 赋值 n 次,其中 n 是整数
s[i]索引
s[i:j]切片
s[i:j:stride]拓展的切片
len(s)求长度

+ 运算符连接两个相同类型的序列。例如:

>>> a = [1, 2, 3]
>>> b = [4, 5]
>>> a + b
[1, 2, 3, 4, 5]
>>>

s * n 运算符制作序列的 n 个副本。然而,这些都是浅拷贝,仅通过引用复制元素。考虑以下代码:

>>> a = [3, 4, 5]
>>> b = [a]
>>> c = 4 * b
>>> c
[[3, 4, 5], [3, 4, 5], [3, 4, 5], [3, 4, 5]]
>>> a[0] = -7
>>> c
[[-7, 4, 5], [-7, 4, 5], [-7, 4, 5], [-7, 4, 5]]
>>>

请注意对 a 的更改如何修改列表 c 的每个元素。在本例中,对列表 a 的引用被放置在列表 b 中。复制 b 时,创建了四个对 a 的附加引用。最后,当 a 被修改时,此更改会传播到 a 的所有其他副本。这种序列乘法的行为通常不是程序员的意图。解决该问题的一种方法是通过复制 a 的内容来手动构建复制序
列。这是一个例子:

a = [3, 4, 5]
c = [list(a) for _ in range(4)]

负索引可用于从序列末尾获取字符。尝试访问超出范围的元素会导致 IndexError 异常。允许使用负索引,并假定为相对于序列的结尾。

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[2:5]
[2, 3, 4]
>>> a[:3]
[0, 1, 2]
>>> a[-3:]
[7, 8, 9]
>>> a[::2]
[0, 2, 4, 6, 8]
>>> a[::-2]
[9, 7, 5, 3, 1]
>>> a[0:5:2]
[0, 2, 4]
>>> a[5:0:-2]
[5, 3, 1]
>>> a[:5:1]
[0, 1, 2, 3, 4]
>>> a[:5:-1]
[9, 8, 7, 6]
>>> a[5::1]
[5, 6, 7, 8, 9]
>>> a[5::-1]
[5, 4, 3, 2, 1, 0]
>>> a[5:0:-1]
[5, 4, 3, 2, 1]
>>>

复杂的切片可能会导致代码在之后难以理解。切片可以使用 slice() 来命名。

>>> first_five = slice(0, 5)
>>> s = "hello world"
>>> print(s[first_five])
hello
>>>

可变序列操作

列表或其他可变序列可以使用下表中的运算符进行就地修改。

OperationDescription
s[i] = x索引赋值
s[i:j] = r切片赋值
s[i:j:stride] = r拓展切片赋值
del s[i]删除一个元素
del s[i:j]删除切片
del s[i:j:stride]删除切片拓展

s[i] = x 运算符更改序列的元素i以引用对象 x,增加 x 的引用计数。负索引相对于列表的末尾和尝试为超出范围的索引分配值会导致 IndexError 异常。切片赋值运算符 s[i:j] = r 将元素 k(其中 i <= k < j)替换为元素来自序列 r。索引与切片的含义相同。如有必要,序列可以扩大或缩小尺寸以容纳 r 中的所有元素。

>>> a = [1, 2, 3, 4, 5]
>>> a[1] = 6
>>> a
[1, 6, 3, 4, 5]
>>> a[2:4] = [10, 11]
>>> a
[1, 6, 10, 11, 5]
>>> a[3:4] = [-1, -2, -3]
>>> a
[1, 6, 10, -1, -2, -3, 5]
>>> a[2:] = [0]
>>> a
[1, 6, 0]
>>>

切片赋值可以提供可选的步长参数。但是,那行为会受到更多限制,因为右侧的参数必须完全具有与被替换的切片具有相同数量的元素。

>>> a = [1, 2, 3, 4, 5]
>>> a[1::2] = [10, 11]
>>> a[1::2] = [30, 40, 50]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 3 to extended slice of size 2
>>>

del s[i] 运算符从序列中删除元素 i,并减少其引用计数。del s[i:j] 删除切片中的所有元素。步长也可以提供,如 del s[i:j:stride] 中所示。

此处描述的语义适用于内置列表类型。涉及序列切片是第三方包中可供定制的丰富领域。你可能会发现非列表对象上的切片在重新分配、删除和删除方面有不同的规则对象共享。例如,流行的 numpy 包具有不同的切片语义比 Python 列表。

Set 操作

Set 是唯一值的无序集合。下表的操作可以在 Set 上执行:

OperationDescription
s | ts 和 t 的并集
s & ts 和 t 的交集
s – ts 和 t 的差集
s ^ t对称差(并集-交集)
len(s)集合中的项数
item in s, item not in s成员检查
s.add(item)添加一个项
s.remove(item)如果存在项,则移除,否则报错
s.discard(item)删除一个存在的项
>>> a = {"a", "b", "c"}
>>> b = {"c", "d"}
>>> a | b
{'a', 'b', 'c', 'd'}
>>> a & b
{'c'}
>>> a - b
{'a', 'b'}
>>> b - a
{'d'}
>>> a ^ b
{'a', 'b', 'd'}
>>>

集合操作也适用于字典的键视图和项目视图对象。例如,为了要找出两个字典有哪些共同的键,请执行以下操作:

>>> a = {"x": 1, "y": 2, "z": 3}
>>> b = {"z": 3, "w": 4, "q": 5}
>>> a.keys() & b.keys()
{'z'}
>>>

映射操作

映射是键和值之间的关联。内置的 dict 类型就是一个例子。下表中的操作可以应用于映射。

OperationDescription
x = m[k]通过键来索引
m[k] = x通过键来赋值
del m[k]通过键来删除一项
k in m成员检查
len(m)映射的项目数
m.keys()返回键的视图
m.values()返回值的视图
m.items()返回键值对的视图

键值可以是任何不可变的对象,例如字符串、数字和元组。当使用元组作为键,可以省略括号并写入逗号分隔的值:

>>> d = {}
>>> d[1, 2, 3] = "foo"
>>> d[1, 0, 3] = "bar"
>>> d
{(1, 2, 3): 'foo', (1, 0, 3): 'bar'}
>>>

使用元组作为键是创建组合键的常用技术。

05 从零搭建 GPT 模型:LayerNorm、GELU 与解码器堆叠 本文介绍从零搭建GPT模型的关键组件:LayerNorm对特征维归一化,GELU平滑激活,前馈网络扩展收缩,残差连接缓解梯度消失。随后组装TransformerBlock(多头注意力+前馈,Pre-LN),最终构建GPTModel并实现文本生成,附参数量核算。 阅读详情

相关推荐

Python Class 参数传递完全指南

Python Class 参数传递完全指南:1.1 实例方法(最常用)1.2 类方法(@classmethod)1.3 静态方法(@staticmethod)2. 嵌套函数(def 内嵌 def)的 4 种传参方式2.1 闭包捕获(读取外层)2.2 显式传递(推荐用于灵活传参)2.3 nonlocal 修改外层2.4 使用 self 传递(共享状态)3. 继承中的参数传递(super())4. 灵活传参:*args 与 **kwargs5. 嵌套层级过深时的最佳实践(工程建议)

m0_54652313的博客 30

pandas中dataframe如何取特定行/列

按列取、按索引/行取、按特定行列取 import numpy as np from pandas import DataFrame import pandas as pd df=DataFrame(np.arange(12).reshape((3,4)),index=['one','two','thr'],columns=list('abcd')) df['a']#取a列 df[['a','b']]#取a、b列 #ix可以用数字索引,也可以用indexcolumn索引 df.ix[0]#取第0行

JSSQSC的博客 1万+

Python函数进阶:可变参数、匿名函数与作用域

本文深入探讨了Python函数的高级特性,主要包括: 可变参数:详细介绍了*args(收集位置参数为元组)**kwargs(收集关键字参数为字典)的用法,以及参数解包技巧。 匿名函数(lambda):讲解lambda语法、特点及典型应用场景,如排序、map/filter操作等,同时提醒不要过度使用。 函数式编程工具:介绍map、filter、reduce三大工具及其与列表推导式的对比。 作用域规则:深入解析LEGB查找顺序,globalnonlocal关键字的使用,以及闭包的实际应用。 实战案例:展示了

PHTR1的博客 155

Python pandas中的cumsumcumprod的用法及实际用途

       累加cumsum累乘cumprod主要是用来看数据的变化趋势.       累加是通过流量得到存量,比如每天销售量的多少,得到今年的销售量总量;       累乘是通过变化率来得到存量,比如有每天的数据变动趋势,通过累乘来得到当前的数据;       累加的用法:       通过df.cumsum()   来求df的累计次数;        ...

成功唯有积累,没有奇迹。 2万+

Python Pandas基础运算

重新修改索引 s = pd.Series([1, 3, 5, 6, 8], index=list('acefh')) print(s.reindex(list('abcdefgh'))) a 1.0 b NaN c 3.0 d NaN e 5.0 f 6.0 g NaN h 8.0 把默认数字填充为0 print(s.reindex(list('...

qq_41782791的博客 320

python基础复习之算术运算符

#算术运算符 a=3 b=10 jia=a+b jian=a-b cheng=a*b chu=b/a qzc=b//a qy=b%a zs=b**a print("加 +:两个对象相加,结果为%d"%jia) print("减 -:两个对象相减,结果为%d"%jian) print("乘 *:两个对象相乘,结果为%d"%cheng) print("除 /:两个对象相除,结果为%d"%chu) p...

pdstar的博客 580

Agent 记忆压缩通常有哪些方法?

在传统软件中,状态可以通过关系型数据库做毫秒级精准存取;而在 AI Agent 架构中,大模型本身是无状态的概率推理引擎。为了维持多轮交互的连续性,开发者必须将历史记忆注入到上下文(Context)中。上下文爆炸与成本失控:多轮对话与工具调用轨迹(Tool Traces)包含海量冗余 Token,每次 API 请求都需要对全量历史重复计费,成本呈二次方上升。推理延迟(Latency)恶化:超长上下文会导致 GPU 在 Prefill 阶段的计算耗时大幅拉长,严重破坏实时交互体验。

2603_96126046的博客 313

22-DataCenter报文序列化

(put在循环后),解析侧遇到时continue不影响store循环——顺序无关但习惯上收尾。

yuhou25的博客 227

可以做年龄编辑的gan对抗网络(SAGAN)

把这 10 张(或更多年龄段)图片按顺序拼接,用 OpenCV 或 FFmpeg 导出为 MP4,就能看到“一个人”的年龄变化过程。:模型只学了 10 个离散年龄段(0~9),直接切换标签会导致五官突然“跳变”,无法生成 18岁→18.5岁 这种细腻变化。如果连续年龄回归,会更加的丝滑,接下来我们将修改一版连续年龄回归的代码,还是在这个的基础之上进行!,比如用预训练的 ArcFace 提取人脸特征,约束不同年龄帧的特征向量尽量接近。,会生成固定噪声下不同年龄的人脸图片,实现“编辑年龄”的效果。

有的话没说出来之前,你是他的主人,一旦说出来你就成了他的奴隶||想要干好事,别太把自己当人,别把别人太不当人||认识这个人就是开了一扇窗户,就能看到不一样的东西,听到不一样的声音,能让你思考、觉悟,这已经够了 219

基于Python的爱奇艺视频数据可视化分析系统

长视频平台剧集、评分、热度与评论数据体量大、维度多,手工汇总难以快速把握类型结构、口碑分布与主演导演影响力。系统采用 B/S 架构,后端入口为app.py,运行端口8060;数据库使用 MySQL(库名iqiyi),经 PyMySQL 访问。前台基于 Bootstrap 5、本地中的 ECharts 5 与 echarts-wordcloud,配合主题。业务表包括usersdramascommentsfavorites。数据可通过导入,或经/ 相关脚本补充样本。分析层在。

qq_35928134的博客 236

2026科学实验能力大赛真题:护林飞行闯关解析

2026 首届全国青少年科学实验能力大赛决赛已于 8 月 20—22 日在济南收官,9 月起各赛区成绩陆续公布。这场白名单赛事鼓励青少年用"做中学"的方式呈现科学探究过程,而图形化编程正是把科普内容变成可交互作品的好工具。今天我们用一道原创项目题「护林飞行闯关」,带大家用 Scratch 做一个科普护林小游戏,把六大考点串成能玩的作品。

IT_Scratch的博客 207

Java深入解析篇二十之JavaStream API详解

Stream(流)是引入的数据处理抽象,位于包。它表示从数据源产生的元素序列,并支持对其进行函数式、聚合式操作。不是集合:流不存储数据,只描述对数据的计算;不是 IO 流:与无关;惰性管道:中间操作只是登记,终端操作才触发实际计算。// 命令式写法(对照) // List<String> r = new ArrayList<>();

萧瑟余晖的博客 347

Django的手机数据分析与可视化

Django的手机数据分析与可视化系统 摘 要 本系统基于Django框架、HTMLMySQL数据库技术,构建了一个全面的手机数据分析与可视化平台。大屏内容丰富,包括品牌市场份额分布、手机价格区间分布、各维度评分分布、热门机型Top10、内存容量分布以及品牌评分与价格分析等多个模块。通过这些模块,用户可以直观地了解手机市场的整体趋势、各品牌的市场表现、手机价格分布情况、用户评分分布以及热门机型的详细信息。系统采用了先进的可视化技术,将复杂的数据以图表的形式呈现,使得数据更加易于理解分析。 在管理功能方

weixin_41915110的博客 775

Pixhawk 6C — Mission Planner 烧录 & 全套校准教程

适用于自行编译的 ArduPilot 固件。

2301_76633800的博客 300

Python 并发编程】线程、进程、协程、同步/异步一次说清

同步是"等结果",异步是"结果来找我";异步的核心收益是等待期间能干别的活。进程开销大但真并行,线程轻量但被 GIL 限制,协程极轻量但只适合 IO 等待。IO 密集:并发量小用线程池,量大用 asyncio;CPU 密集:用进程池。这一条能解决 90% 的选型问题。多线程的坑在共享变量加锁异常被吞;多进程的坑在 if __name__ == '__main__'保护序列化成本;协程的坑在误用同步阻塞调用卡死整个事件循环。

zy123456nn的博客 328

《模型不玄学》前言 - 小白的模型算法实战手册

这是一本给算法小白的算法模型实战手册。能够深入浅出的理解如何利用数据训练一个成熟的模型。这本小册子想做的,就是把“从数据到能用的模型”这个过程,用讲透。

月华的博客 190

03Numpy基础(中)

参数解释:第一个参数是要分裂的向量,第二个参数是分裂的起始位置终止位置,第三个参数是轴。上述代码中输出结果并不为整数型,而是浮点型,笔者猜测这是为了避免插入的浮点数被截断。上述代码中,切片结果改变,原数组也会发生改变,这样就不会造成大量内存的浪费。形式:arr[0:1,0:1] arr[::2,::1]=0指的是设置按照哪个轴(方向)进行拼接,一般默认是轴0。两个矩阵可以按照不同的维度拼接,但拼接的时候。此外,提取列的时候出来的结果是列向量。矩阵的分裂依旧要设定分裂的维度。向量的分裂:将得到更短的向量。

qq_64775230的博客 208

GLM-5.3-NVFP4 部署实战系列[四]问题深拆①:sm80 没有稀疏 MLA 注意力后端怎么办

GLM-5.3 的 DSA 稀疏注意力在 A800 上无路可走:vLLM v0.28.0 的稀疏 MLA 后端全部要求 SM90+。修通路径:移植社区 PR #47629,vendor 三个文件加两处注册,连环修掉 metadata 计数断言等小坑。最大的坑:0.28.0 把 indexer 重写为 C++ op,内部直调仅支持 SM90+ 的 deep_gemm——采用最小化改法:调用点门控回退 Triton 内核(LUT 解码 fp8),sm90+ 路径零影响。

缘友一世的博客 338
上一篇: 算法交易库的 zipline 安装
__Py4Fi__
博客等级 码龄2年 69粉丝 6原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值