【Python数据魔术】:揭秘类型奥秘,赋能代码创造

简介: 【Python数据魔术】:揭秘类型奥秘,赋能代码创造

5021b4ef48d74a5e9996629e36e1edc6.png

🚀一.运算符

🌈1. 算术运算符

下面以a=10 ,b=20为例进行计算

运算符 描述 实例
+ 两个对象相加 a + b 输出结果 30
- 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200
/ x除以y b / a 输出结果 2
// 向下取整 返回商的整数部分 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0
% 取模(余) 返回除法的余数 b % a 输出结果 0
** 返回x的y次幂 a**b 为10的20次方, 输出结果 100000000000000000000


🌈2. 身份运算符
  • 身份运算符
运算符 描述 详解
is 同一性运算符 变量ID是否相同,ID即变量的唯一标识,变量值可能相同但ID不一定相同
is not 非同一性 判断两个变量的引用是否来之不同对象
  • 使用is注意python对于小整数使用对象池存贮问题(交互式模式或者说命令行模式)
"""
1.举个例子,在python命令行模式下:为什么同样值a,b与c,d的结果却不一样呢?
"""
>>> a = 1000
>>> b = 1000
>>> a is b
False
>>> c = 10
>>> d = 10
>>> c is d
True

# 注意,因为python对小整数在内存中直接创建了一份,不会回收,所有创建的小整数变量直接从对象池中引用即可。
# 但是注意Python仅仅对比较小的整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。
# 也就说只有在这个[-5,256]范围内创建的变量值使用is比较时候才会成立。

  • 而保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。即使整数超过256,使用is也是成立的。
  • 使用is注意python关于字符串的intern机制存储
# 注意: python中创建两个内容一样的变量时(变量名不一样),
#       一般都会在内存中分配两个内存地址(id地址)分别给这两个变量。
#       即两个变量的内容虽然一样,但是变量的引用地址不一样。
#       所以两个变量使用==比较成立,但是使用 is比较不成立。

# 但是在python中有两个意外情况:
# 1.使用python命令行时对于小整数[-5,256]区间内的整数,python会创建小整数对象池,这些对象一旦创建,
#     就不会回收,所有新创建的在这个范围的整数都是直接引用他即可。
#     所以造成在[-5,256]区间内的整数不同变量只要值相同,引用地址也相同。
#     此范围外的整数同样遵循新建一个变量赋予一个地址。

# 2.python中虽然字符串对象也是不可变对象,但python有个intern机制,
#     简单说就是维护一个字典,这个字典维护已经创建字符串(key)和它的字符串对象的地址(value),
#     每次创建字符串对象都会和这个字典比较,没有就创建,重复了就用指针进行引用就可以了。
#     相当于python对于字符串也是采用了对象池原理。
#     (但是注意:如果字符串(含有空格),不可修改,没开启intern机制,不共用对象。
#     比如"a b"和"a b",这种情况使用is不成立的形式 只有在命令行中可以。
#     使用pycharm同样是True,因为做了优化)
    

# 交互式模式(命令行模式)
>>> a ='abc'   #没有空格内容一样的两个变量,在命令行模式下is 结果True
>>> b = 'abc'
>>> a ==b
True
>>> a is b
True
>>> c ='a b '   #有空格内容一样的两个变量,在命令行模式下is 结果false
>>> d= 'a b '
>>> c ==d
True
>>> c is d
False

# pycharm自己实践
🌈3. 成员运算符
运算符 描述
in 如果在指定序列中找到值就返回True,否则返回False
not in 如果在指定序列中没有找到值就返回True,否则返回False
str1 = [1, 2, 3, '哈哈哈']

print(1 in str1)  # True
print(1 not in str1)  # False

⭐4. 增量运算符
运算符 实例
+= c += a 等效于 c = c + a
-= c -= a 等效于 c = c - a
*= c *= a 等效于 c = c * a
%= c %= a 等效于 c = c % a
**= c ** = a 等效于 c = c ** a
//= c //= a 等效于 c = c // a
a = 1

a += 1  # 展开形式:a = a + 1

print(a)  # 2

⭐5. 比较运算符
运算符 描述
== 比较两个对象的值是否相同,这里要与is区别出来,==是不识别ID的
!= 比较两个对象值是否不相同
> 大于
< 小于
>= 大于等于
<= 小于等于
print(2 > 1)  # True

# 比较结果为布尔值(True, False)
⭐6. 逻辑运算符
运算符 逻辑表达式 描述
and x and y 同时满足x和y两个条件返回True,否则返回False
or x or y 只需要满足x或y中的任意一个条件就返回True,两个都不满足时返回False
not not x 满足条件x时返回False,不满足条件x时返回True
  • 优先级: not and or
a = 1
b = 1
c = 2

# and 两边为真则为真,其余情况为假
print(a > 0 and a < c)  # True
print(a > 1 and a < c)  # False

# or 两边为假则为假, 其余情况为真
print(a > 0 and a < b)  # False
print(a == 1 and a < c)  # True

# not: 取反
print(not c < a)  # True

# 优先级: not and or
a = 1
b = 1
c = 2

print(a > 1 and c < 3 or not a == 1) # False

🚀二.可变与不可变

  • 不可变(immutable):数值类型(int, bool, float,complex), 字符串(str),元组(tuple)
  • 可变(mutable):列表(list), 集合(set),字 典(dict)

🚀三.字符串转义

# 字符前存在\,在特定情况下字符就不再表示本身的意思
• 1

常见:

符号 解释 案例
\n 换行符 print(‘s\nd’)
\t 水平制表符 print('ss\t’dd)
\b 退格(删除一格) print(‘帅 \b 不帅’)
\r 当前位置移到本行开头 print(‘d\rhahahs’)
\\ 反斜杠 print(‘\\’)
\‘’ 一个双引号
\0 一个空格符
\a 系统提示音(交互界面)

字符串前面加上r就可以防止转义

# --- 交互界面 ---
>>> print('a\000c')
a c
>>> print('a\0c')
a c

🚀四.编码与解码

💥1. 基础使用
统一码(Unicode),也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。
统一码是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

encode() 和 decode() 是常用的字符串编码和解码方法,用于将 Unicode 字符串按照指定的编码格式转换为二进制数据,并将二进制数据按照指定的编码格式解析为 Unicode 字符串。

下面是两个方法的详细说明:


1.encode([encoding='utf-8', errors='strict'])


该方法用于将 Unicode 字符串进行编码,生成一个包含了字符编码后的字节串对象。其中,可选参数 encoding 表示指定的字符集,如果不指定则默认采用 utf-8 编码;errors 参数用于设置错误处理方式,取值范围为 'strict'、'ignore' 和 'replace'。


示例代码如下:

s = "Hello, 你好"
b = s.encode(encoding="utf-8", errors="strict")
print(b)    # 输出: b'Hello, \xe4\xbd\xa0\xe5\xa5\xbd'

  1. decode([encoding='utf-8', errors='strict'])

该方法用于将已经编码的二进制数据解码为 Unicode 字符串。其中,可选参数 encoding 表示待解码的字符编码,如果不指定,则默认采用 utf-8 解码;errors 参数用于设置错误处理方式,取值范围为 'strict'、'ignore' 和 'replace'。

示例代码如下:

b = b'Hello, \xe4\xbd\xa0\xe5\xa5\xbd'
s = b.decode(encoding="utf-8", errors="strict")
print(s)    # 输出:Hello, 你好

需要注意的是,字符串编码和解码涉及到多种字符编码方式和错误处理方式,如果不正确地进行设置和使用,可能会导致字符集转换错误、乱码等问题。因此,

🚀五.进制转化

💥1.python进制转化

在 Python 中,可以使用内置的 bin()、oct()、hex() 函数将十进制数转化为二进制、八进制和十六进制字符串。在实际开发中,应


示例代码如下:

dec = 255

# 十进制转二进制
bin_str = bin(dec)
print(bin_str)   # 输出 '0b11111111'

# 十进制转八进制
oct_str = oct(dec)
print(oct_str)   # 输出 '0o377'

# 十进制转十六进制
hex_str = hex(dec)
print(hex_str)   # 输出 '0xff'

ee2c95b61f359414844cd5a6747d9a57_5788f34fdc644f5b8d2591709a195e6a.png

需要注意的是,这些函数返回的结果都是字符串类型,并且带有对应进制的前缀,即 '0b' 表示二进制,'0o' 表示八进制,'0x' 表示十六进制。如果需要去除前缀并获取整数值,可以使用 int() 函数。

以下是一个示例代码:

# 字符串转整数(删除前缀 -- 通过切片处理)
int_val = int(bin_str[2:], 2)
print(int_val)   # 输出 255

int_val = int(oct_str[2:], 8)
print(int_val)   # 输出 255

int_val = int(hex_str[2:], 16)
print(int_val)   # 输出 255

如上所示,使用 int() 函数时可以指定第二个参数 base 来指定进制,例如 base=2 表示二进制,base=8 表示八进制,base=16 表示十六进制。在实际应用中,可以根据需要选择合适的函数和参数来进行进制转换。

# ord() 是 Python 内置函数之一,用于将ASCII字符转换为对应的 Unicode 码点。具体而言,ord() 接受一个字符串参数,表示要转换为码点的字符,然后返回该字符所对应的 Unicode 码点。
# 将字符转换为 Unicode 编码
print(ord('A'))    # 输出 65
print(ord('a'))    # 输出 97
print(ord('€'))   # 输出 8364

# chr() 是 Python 内置函数之一,用于将 Unicode 码点转换为对应的ASCII字符。具体而言,chr() 接受一个整数参数,表示 Unicode 码点(介于 0 到 0x10ffff 之间),并返回与该码点相对应的字符。
# 将 Unicode 编码转换为字符
print(chr(65))    # 输出 'A'
print(chr(97))    # 输出 'a'
print(chr(8364))  # 输出 '€'

🚀六.深浅拷贝(复制)

❤️1. 浅拷贝

外层不受影响,内层会受影响

l1 = [1234, 5678, 910]

l2 = ['a', l1]

l3 = l2.copy()

l1.append('帅')

>>> id(l1)
1750917116360
>>> id(l2)
1750917140744
>>> id(l2[1])
1750917116360
# 内层id地址相同

print(id(l2))  # 2429073232384
print(id(l2[1]))  # 2104199485056
print(id(l3))  # 2429073240128
print(id(l3[1]))  # 2104199485056

# 浅复制 外层不同,内层id相同
❤️2. 深拷贝

内外层都不影响

import copy
l1 = [1234, 5678, 910]

l2 = ['a', l1]

l4 = copy.deepcopy(l2)

l1.append('帅')

print(id(l1))  # 1633334532096
print(id(l2))  # 1633334532352
print(id(l4))  # 1633334448384
print(id(l2[1]))  # 1633334532096

print(id(l2[0]))  # 1633303890928
print(id(l4[0]))  # 1633303890928
print(id(l4[1]))  # 1633334532672

l2[0] = 1234
print(id(l4[0]))  # 外层地址不同
print(id(l2[0]))  

# 内外层都不同

🚀七.运算升级

运算符 Python 表达式 结果 描述 支持的数据类型
+ [1, 2] + [3, 4] [1, 2, 3, 4] 合并 字符串、列表、元组
* ‘Hi!’ * 4 [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] 复制 字符串、列表、元组
in 3 in (1, 2, 3) True 元素是否存在 字符串、列表、元组、字典
not in 4 not in (1, 2, 3) True 元素是否不存在 字符串、列表、元组、字典


注意,in在对字典操作时,判断的是字典的键而不是值


🚀八.常用方法

函数名 描述
sum(item) 计算容器中元素值的和
len(item) 计算容器中元素个数
max(item) 返回容器中元素最大值
min(item) 返回容器中元素最小值
del(item) 删除变量
# 当然还有 id,type这些常见方法

# isinstance(x, A_tuple) --- 判断 x 是否是 A_tuple类型;注意A_tuple也可以是元组包多个,案例如下:

print(isinstance('a', list)) # False

# isinstance(x, (A, B, ...))  相当于isinstance(x, A) or isinstance(x, B) or ...


🚀九.操作扩展

链式赋值

a = b = c = [1, 2, 3, 4]
# 其id相同,引用的同一组数据
# 改变其中一组, 另外一组也会改变

序列解包

a = [1, 2]
b, c = a
# a--1   b--2

# 注意: 常规解包, 多少个元素就需要多少变量去解


demo = [1, 2, 3, 4]
data, *lets = demo

# data -- 1   lets -- [2, 3, 4]

# 注意: 这里利用了不定长参数中的 * , 不限接收数据多少

交换变量

a = 1
b = 2
b, a = a, b
# a -- 2    b -- 1


相关文章
|
27天前
|
数据采集 机器学习/深度学习 编解码
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
本文详细介绍了一个简化版 Veo 3 文本到视频生成模型的构建过程。首先进行了数据预处理,涵盖了去重、不安全内容过滤、质量合规性检查以及数据标注等环节。
119 5
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
|
1月前
|
机器学习/深度学习 算法 PyTorch
从零开始200行python代码实现LLM
本文从零开始用Python实现了一个极简但完整的大语言模型,帮助读者理解LLM的工作原理。首先通过传统方法构建了一个诗词生成器,利用字符间的概率关系递归生成文本。接着引入PyTorch框架,逐步重构代码,实现了一个真正的Bigram模型。文中详细解释了词汇表(tokenizer)、张量(Tensor)、反向传播、梯度下降等关键概念,并展示了如何用Embedding层和线性层搭建模型。最终实现了babyGPT_v1.py,一个能生成类似诗词的简单语言模型。下一篇文章将在此基础上实现自注意力机制和完整的GPT模型。
146 14
从零开始200行python代码实现LLM
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
200行python代码实现从Bigram模型到LLM
本文从零基础出发,逐步实现了一个类似GPT的Transformer模型。首先通过Bigram模型生成诗词,接着加入Positional Encoding实现位置信息编码,再引入Single Head Self-Attention机制计算token间的关系,并扩展到Multi-Head Self-Attention以增强表现力。随后添加FeedForward、Block结构、残差连接(Residual Connection)、投影(Projection)、层归一化(Layer Normalization)及Dropout等组件,最终调整超参数完成一个6层、6头、384维度的“0.0155B”模型
129 11
200行python代码实现从Bigram模型到LLM
|
2月前
|
人工智能 数据可视化 Python
在Python中对数据点进行标签化
本文介绍了如何在Python中使用Matplotlib和Seaborn对数据点进行标签化,提升数据可视化的信息量与可读性。通过散点图示例,展示了添加数据点标签的具体方法。标签化在标识数据点、分类数据可视化及趋势分析中具有重要作用。文章强调了根据需求选择合适工具,并保持图表清晰美观的重要性。
64 15
|
1月前
|
数据采集 Web App开发 JavaScript
Python爬虫解析动态网页:从渲染到数据提取
Python爬虫解析动态网页:从渲染到数据提取
|
2月前
|
人工智能 安全 IDE
Python 的类型安全是如何实现的?
本文探讨了 Python 的类型安全实现方式。从 3.5 版本起,Python 引入类型提示(Type Hints),结合静态检查工具(如 mypy)和运行时验证库(如 pydantic),增强类型安全性。类型提示仅用于开发阶段的静态分析,不影响运行时行为,支持渐进式类型化,保留动态语言灵活性。泛型机制进一步提升通用代码的类型安全性。总结而言,Python 的类型系统是动态且可选的,兼顾灵活性与安全性,符合“显式优于隐式”的设计哲学。
|
2月前
|
机器学习/深度学习 算法 测试技术
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
本文探讨了基于图的重排序方法在信息检索领域的应用与前景。传统两阶段检索架构中,初始检索速度快但结果可能含噪声,重排序阶段通过强大语言模型提升精度,但仍面临复杂需求挑战
89 0
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
|
2月前
|
存储 机器学习/深度学习 人工智能
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
本文探讨了多模态RAG系统的最优实现方案,通过模态特定处理与后期融合技术,在性能、准确性和复杂度间达成平衡。系统包含文档分割、内容提取、HTML转换、语义分块及向量化存储五大模块,有效保留结构和关系信息。相比传统方法,该方案显著提升了复杂查询的检索精度(+23%),并支持灵活升级。文章还介绍了查询处理机制与优势对比,为构建高效多模态RAG系统提供了实践指导。
484 0
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
|
1月前
|
NoSQL MongoDB 开发者
Python与MongoDB的亲密接触:从入门到实战的代码指南
本文详细介绍了Python与MongoDB结合使用的实战技巧,涵盖环境搭建、连接管理、CRUD操作、高级查询、索引优化、事务处理及性能调优等内容。通过15个代码片段,从基础到进阶逐步解析,帮助开发者掌握这对黄金组合的核心技能。内容包括文档结构设计、批量操作优化、聚合管道应用等实用场景,适合希望高效处理非结构化数据的开发者学习参考。
69 0
|
4月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。

推荐镜像

更多