Python基础02 | 数据类型和操作

94 阅读5分钟

修订历史:

  • 2024/09/19 完成 python 常用内置数据类型、运算符、以及 eval 函数的笔记

1 数据类型和操作

1.1 常用内置数据类型 (Builtin Types)

  1. 数字类型(Numeric Types):
    • 整数(Integer):int,比如 3,-3
    • 浮点数(float):float, 比如 3.14,-3.14
    • 复数(complex number):complex,比如 3+4j
  2. 布尔类型(Boolean Types):例如 True 和 False
  3. 文本序列类型(Text Sequence Type):字符串类型(String Types)。字符串是由 Unicode 码位构成的不可变序列。示例:'spam', "eggs"等
  4. 序列类型(Sequence Types):
    • 列表:list
    • 元组:tuple
    • range对象:range 类型表示不可变的数字序列。
  5. 集合类型(Set Types):set
  6. 映射类型(Mapping Types):字典(dict
  7. 其他内置类型:
    • 函数(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 内置常数有:

  1. None:表示一个空对象,用于表示一个未定义的值。
  2. TrueFalse:布尔值,用于表示真和假。
  3. Ellipsis:表示一个省略号,用于表示一个未指定的对象。
  4. NotImplemented:表示一个未实现的对象。
  5. __debug__:表示一个布尔值,用于表示是否启用调试模式。
  6. __import__:用于动态导入模块。
  7. __name__:表示当前模块的名称。

math 库中的一些数学常量

  1. pi:圆周率,约等于 3.14159。
  2. e:自然对数底数,约等于 2.71828。
  3. tau:圆周长,约等于 6.28318。
  4. inf:正无穷大。
  5. 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() 都可以用来检查一个对象的类型。但两者存在一些区别,

  1. 类型检查的性能: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
  1. 检查类型的不同层次: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
  1. 检查抽象基类(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
  1. 应用场景
    • 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()

参考资料