修订历史:
- 2024/09/19 完成 python 常用内置数据类型、运算符、以及 eval 函数的笔记
1 数据类型和操作
1.1 常用内置数据类型 (Builtin Types)
- 数字类型(Numeric Types):
- 整数(Integer):
int,比如 3,-3 - 浮点数(float):
float, 比如 3.14,-3.14 - 复数(complex number):
complex,比如 3+4j
- 整数(Integer):
- 布尔类型(Boolean Types):例如 True 和 False
- 文本序列类型(Text Sequence Type):字符串类型(String Types)。字符串是由 Unicode 码位构成的不可变序列。示例:'spam', "eggs"等
- 序列类型(Sequence Types):
- 列表:
list - 元组:
tuple range对象:range类型表示不可变的数字序列。
- 列表:
- 集合类型(Set Types):
set - 映射类型(Mapping Types):字典(
dict) - 其他内置类型:
- 函数(Function Types)
- 模块类型(Module Types)
- 方法(Method Types)
- 代码对象(Code Types)
- 类型对象:
type - 类与类实例(Class and Instance Types)
- 空对象:None类型(None Types)
# 数字类型: 整数类型
print(type(3)) # <class 'int'>
print(type(-3)) # <class 'int'>
# 1 数字类型:浮点数类型
print(type(3.14)) # <class 'float'>
print(type(-3.14)) # <class 'float'>
# 1 数字类型: 复数类型
print(type(3+4j)) # <class 'complex'>
# 2 布尔类型
print(8 < 10) # True
# 3 文本序列类型:字符串
print(type("Hello")) # <class 'str'>
# 4 序列类型:列表
print(type([1, 2, 3])) # <class 'list'>
# 4 序列类型:元组
print(type((1, 2, 3))) # <class 'tuple'>
# 4 序列类型:range
print(type(range(5))) # <class 'range'>
# 5 集合类型:集合
print(type({1, 2, 3})) # <class 'set'>
# 6 映射类型:字典
print(type({"name": "John", "age": 25})) # <class 'dict'>
# 7 其他类型
print(type(None)) # <class 'NoneType'>
print(type(type(1))) # <class 'type'>
import math
print(type(math)) # <class 'module'>
1.2 常用内置常数(Biltin Constants)
python 内置常数有:
None:表示一个空对象,用于表示一个未定义的值。True和False:布尔值,用于表示真和假。Ellipsis:表示一个省略号,用于表示一个未指定的对象。NotImplemented:表示一个未实现的对象。__debug__:表示一个布尔值,用于表示是否启用调试模式。__import__:用于动态导入模块。__name__:表示当前模块的名称。
math 库中的一些数学常量
pi:圆周率,约等于 3.14159。e:自然对数底数,约等于 2.71828。tau:圆周长,约等于 6.28318。inf:正无穷大。nan:非数字,表示一个无效的数值。
import math
## python 常用内置常数
print(True) # True
print(False) # False
print(None) # None
# math库内置数学常数
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
print(math.inf) # inf
print(-math.inf) # -inf
print(math.nan) # nan
1.3 常用内置运算符(Builtin Operators)
- 算术运算符:
+,-,*,@,/,//,**,%(模运算或余数运算符),-(一元算符),+(一元算符) - 关系运算符:
<,<=,>=,>,==,!= - 赋值:
+=,-=,*=,/=,//=,**=,%= - 逻辑运算符:
and,or,not
1.4 type() 和 isinstance()
在 Python 中,isinstance() 和 type() 都可以用来检查一个对象的类型。但两者存在一些区别,
- 类型检查的性能:type() 在性能上与 isinstance() 有差异,因为 type() 直接比较对象的内存地址,而 isinstance() 需要查询继承链。
import timeit
# 测试 type() 的性能
type_performance = timeit.timeit("type(1) is int", number=10000000)
# 测试 isinstance() 的性能
isinstance_performance = timeit.timeit("isinstance(1, int)", number=10000000)
print(f"type() 性能: {type_performance}") # type() 性能: 0.7724234889901709
print(f"isinstance() 性能: {isinstance_performance}") # isinstance() 性能: 0.7347535559965763
- 检查类型的不同层次:type() 检查的是对象的最顶层类型,而 isinstance() 可以检查类型继承链中的任何层次。例如,使用一个模拟的类层次结构:
首先,我们定义一个简单的类层次结构,包括一个父类 A 和一个继承自 A 的子类 B:
# 定义一个简单的类层次结构,包括一个父类 `A` 和一个继承自 `A` 的子类 `B`:
class A:
pass
class B(A):
pass
# 创建 B 类的一个实例
obj = B()
# 使用 type() 检查对象的直接类型
print("type(obj):", type(obj)) # 输出: <class '__main__.B'>
# 使用 isinstance() 检查对象是否是 A 的实例
print("isinstance(obj, A):", isinstance(obj, A)) # 输出: True
# 使用 isinstance() 检查对象是否是 B 的实例
print("isinstance(obj, B):", isinstance(obj, B)) # 输出: True
- 检查抽象基类(ABCs):isinstance() 可以用来检查一个对象是否实现了特定的抽象基类(ABC),而 type() 则不可以。例如,使用 collections.abc 模块中的抽象基类.
from collections.abc import Sequence
class MyList(list):
pass
my_list = MyList()
isinstance(my_list, Sequence) # 返回 True,因为 MyList 是 list 的子类,而 list 实现了 Sequence
type(my_list) is Sequence # 返回 False,因为 MyList 的直接类型不是 Sequence
- 应用场景
isinstance()函数用于判断一个对象是否属于某个类型,而type()函数用于返回对象的类型。isinstance()函数可以判断一个对象是否属于某个类,而type()函数只能判断一个对象是否属于某个具体的类型。isinstance()函数可以判断一个对象是否属于某个类的子类,而type()函数只能判断一个对象是否属于某个具体的类型。isinstance()函数可以判断一个对象是否属于多个类,而type()函数只能判断一个对象是否属于一个具体的类型。
2 补充
eval 函数
eval() 是 python 内置函数,用于执行一个字符串表达式,并返回表达式的值。 语法格式:
eval(expression, globals=None, locals=None)
- expression:要执行的表达式,可以是字符串,也可以是 Python 表达式。
- globals:一个字典,用于指定全局变量。默认为 None,表示使用当前作用域的全局变量。
- locals:一个字典,用于指定局部变量。默认为 None,表示使用当前作用域的局部变量。
例如:
# 使用 eval() 执行一个字符串表达式
eval("1 + 2") # 返回 3
# 使用 eval() 执行一个 Python 表达式
eval("print('Hello, World!')") # 打印 "Hello, World!"
# 将字符串转换为字典,列表,元组
eval("{'name': 'John', 'age': 25}") # 返回 {'name': 'John', 'age': 25}
eval("[1, 2, 3]") # 返回 [1, 2, 3]
eval("(1, 2, 3)") # 返回 (1, 2, 3)
备注:
- eval() 因为可以执行任意代码,故为了避免注入恶意代码,可以考虑更安全的替代方案,比如
ast.literal_eval()。