Python 数据类型完全指南 - 前端开发者视角
📌 前言
作为前端开发者,你已经熟悉了 JavaScript 的数据类型。Python 的数据类型既有相似之处,也有独特的设计哲学。本文将从前端视角深入解析 Python 的核心数据类型。
1️⃣ 数字类型 (Numeric Types)
Python 提供了三种主要的数字类型:
int - 整数类型
python
# Python 的 int 没有大小限制(JS 有 Number.MAX_SAFE_INTEGER)
age = 25
big_number = 999999999999999999999999999999 # Python 可以处理任意大的整数
# 不同进制表示
binary = 0b1010 # 二进制:10
octal = 0o12 # 八进制:10
hexadecimal = 0xa # 十六进制:10
float - 浮点数类型
python
# 类似 JS 的 Number
price = 19.99
scientific = 1.5e-3 # 0.0015
# 注意浮点数精度问题(和 JS 一样)
print(0.1 + 0.2) # 0.30000000000000004
complex - 复数类型
python
# JS 没有原生复数支持
z = 3 + 4j
print(z.real) # 3.0
print(z.imag) # 4.0
与 JS 对比:
- JS 只有一个
Number
类型(内部是 64 位浮点数) - Python 区分
int
和float
,且int
无大小限制 - Python 原生支持复数运算
2️⃣ 文本类型 (Text Type)
str - 字符串类型
python
# 三种定义方式
single = 'Hello'
double = "World"
multi_line = """
这是多行
字符串
"""
# 字符串是不可变的(immutable)- 和 JS 一样
text = "Python"
# text[0] = 'J' # ❌ 报错!
# 常用方法
s = " hello world "
print(s.strip()) # "hello world" - 去除首尾空白
print(s.upper()) # " HELLO WORLD "
print(s.replace("o", "0")) # " hell0 w0rld "
print(s.split()) # ['hello', 'world']
# 格式化字符串
name = "张三"
age = 25
# f-string (推荐,类似 JS 模板字符串)
print(f"{name} 今年 {age} 岁")
# format 方法
print("{} 今年 {} 岁".format(name, age))
与 JS 对比:
- Python 的三引号字符串更方便处理多行文本
- Python 没有模板字符串 `````,但有 f-string
- 字符串方法名称有差异(如
split()
vssplit()
)
3️⃣ 序列类型 (Sequence Types) ⭐
这是本文的重点!Python 有三种核心序列类型。
📋 List - 列表(可变序列)
类比: 最接近 JS 的数组 Array
python
# 创建列表
fruits = ['apple', 'banana', 'cherry']
mixed = [1, "two", 3.0, [4, 5]] # 可以混合类型
empty = []
range_list = list(range(5)) # [0, 1, 2, 3, 4]
# 访问元素
print(fruits[0]) # 'apple'
print(fruits[-1]) # 'cherry' - 负索引从末尾开始
print(fruits[0:2]) # ['apple', 'banana'] - 切片
# 修改元素(可变!)
fruits[1] = 'blueberry'
print(fruits) # ['apple', 'blueberry', 'cherry']
🔥 List 常用方法详解
1. 添加元素
python
fruits = ['apple', 'banana']
# append() - 在末尾添加一个元素(类似 JS push)
fruits.append('cherry')
print(fruits) # ['apple', 'banana', 'cherry']
# insert() - 在指定位置插入元素
fruits.insert(1, 'blueberry')
print(fruits) # ['apple', 'blueberry', 'banana', 'cherry']
# extend() - 合并另一个列表(类似 JS concat,但会修改原列表)
fruits.extend(['date', 'elderberry'])
print(fruits) # ['apple', 'blueberry', 'banana', 'cherry', 'date', 'elderberry']
# + 运算符 - 连接列表(不修改原列表,类似 JS concat)
new_fruits = fruits + ['fig', 'grape']
2. 删除元素
python
fruits = ['apple', 'banana', 'cherry', 'banana']
# remove() - 删除第一个匹配的值
fruits.remove('banana')
print(fruits) # ['apple', 'cherry', 'banana']
# pop() - 删除并返回指定索引的元素(默认最后一个)
last = fruits.pop() # 'banana'
first = fruits.pop(0) # 'apple'
print(fruits) # ['cherry']
# del - 删除指定索引或切片
fruits = ['a', 'b', 'c', 'd']
del fruits[1] # ['a', 'c', 'd']
del fruits[0:2] # ['d']
# clear() - 清空列表
fruits.clear()
print(fruits) # []
3. 查找和计数
python
numbers = [1, 2, 3, 2, 4, 2, 5]
# index() - 查找元素首次出现的索引(类似 JS indexOf)
print(numbers.index(2)) # 1
print(numbers.index(2, 2)) # 从索引2开始查找:3
# count() - 统计元素出现次数
print(numbers.count(2)) # 3
# in 运算符 - 检查元素是否存在(类似 JS includes)
print(2 in numbers) # True
print(10 in numbers) # False
4. 排序和反转
python
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# sort() - 就地排序(修改原列表)
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
numbers.sort(reverse=True)
print(numbers) # [9, 6, 5, 4, 3, 2, 1, 1]
# sorted() - 返回新的排序列表(不修改原列表)
original = [3, 1, 4]
new_sorted = sorted(original)
print(original) # [3, 1, 4]
print(new_sorted) # [1, 3, 4]
# reverse() - 反转列表
numbers = [1, 2, 3]
numbers.reverse()
print(numbers) # [3, 2, 1]
5. 列表推导式(List Comprehension)⭐
python
# 这是 Python 的杀手级特性!类似 JS 的 map + filter 组合
# 基础用法
squares = [x**2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件过滤
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]
# 多层嵌套
matrix = [[i*j for j in range(3)] for i in range(3)]
# [[0, 0, 0], [0, 1, 2], [0, 2, 4]]
# JS 对比:
# const squares = Array.from({length: 10}, (_, i) => i**2);
# const evenSquares = [...Array(10).keys()].filter(x => x%2===0).map(x => x**2);
6. 其他实用方法
python
# len() - 获取长度(类似 JS .length)
print(len([1, 2, 3])) # 3
# sum() - 求和(JS 需要 reduce)
print(sum([1, 2, 3, 4])) # 10
# min() / max() - 最小值/最大值
print(min([3, 1, 4])) # 1
print(max([3, 1, 4])) # 4
# 列表拷贝
original = [1, 2, 3]
shallow_copy = original.copy() # 或 original[:]
import copy
deep_copy = copy.deepcopy(original)
🎯 List vs JS Array 核心差异
特性 | Python List | JS Array |
---|---|---|
索引 | 支持负索引 -1 表示最后一个 |
只支持正索引 |
切片 | arr[1:3] 原生支持 |
需要 arr.slice(1, 3) |
修改方法 | 大多直接修改原列表 | 部分返回新数组 |
推导式 | 列表推导式 [x*2 for x in arr] |
map/filter 链式调用 |
多维数组 | 需要嵌套列表 | 同样嵌套 |
🔒 Tuple - 元组(不可变序列)
类比: JS 没有直接对应物,可以理解为"只读数组"
python
# 创建元组
coordinates = (3, 4)
single = (1,) # 单元素元组需要逗号
empty = ()
no_parentheses = 1, 2, 3 # 也是元组
# 访问元素
print(coordinates[0]) # 3
print(coordinates[-1]) # 4
# 不可修改!
# coordinates[0] = 5 # ❌ TypeError
# 解包(Unpacking)
x, y = coordinates
print(x, y) # 3 4
# 元组常用于函数返回多个值
def get_user_info():
return "张三", 25, "北京"
name, age, city = get_user_info()
使用场景:
- 保护数据不被修改(如配置、常量)
- 字典的键(list 不能作为键)
- 函数返回多个值
- 性能优于 list(占用内存更小)
📏 Range - 范围对象
类比: 类似 JS 的 Array.from({length: n}, (_, i) => i)
或新的数组填充方法
python
# 创建 range
r1 = range(5) # 0, 1, 2, 3, 4
r2 = range(2, 8) # 2, 3, 4, 5, 6, 7
r3 = range(0, 10, 2) # 0, 2, 4, 6, 8(步长为2)
r4 = range(10, 0, -1) # 10, 9, 8, ..., 1(倒序)
# range 是惰性求值,不占用内存
for i in range(1000000):
pass # 不会创建100万个数字的列表
# 转换为列表
numbers = list(range(5)) # [0, 1, 2, 3, 4]
# 常用于循环
for i in range(3):
print(f"第 {i+1} 次循环")
与 JS 对比:
javascript
// JS 创建数字序列的几种方式
Array.from({length: 5}, (_, i) => i) // [0,1,2,3,4]
[...Array(5).keys()] // [0,1,2,3,4]
Array(5).fill(0).map((_, i) => i) // [0,1,2,3,4]
// Python 更简洁
list(range(5)) # [0, 1, 2, 3, 4]
关键区别:
range
是生成器,不占内存(JS 会立即创建数组)range
只能生成整数序列- Python 的
range
更高效,适合大规模循环
4️⃣ 映射类型 (Mapping Type)
🗺️ Dict - 字典
类比: 等同于 JS 的 Object
或 Map
python
# 创建字典
user = {
'name': '张三',
'age': 25,
'email': 'zhangsan@example.com'
}
# 访问元素
print(user['name']) # '张三'
print(user.get('phone')) # None(不存在时不报错)
print(user.get('phone', '无')) # '无'(提供默认值)
# 修改和添加
user['age'] = 26
user['phone'] = '13800138000'
# 删除
del user['email']
removed = user.pop('phone') # 删除并返回值
# 遍历
for key in user:
print(f"{key}: {user[key]}")
for key, value in user.items():
print(f"{key}: {value}")
# 检查键是否存在
if 'name' in user:
print("存在")
# 常用方法
print(user.keys()) # dict_keys(['name', 'age'])
print(user.values()) # dict_values(['张三', 26])
print(user.items()) # dict_items([('name', '张三'), ('age', 26)])
与 JS 对比:
javascript
// JS Object
const user = { name: '张三', age: 25 }
user.name // 或 user['name']
// JS Map(更接近 Python dict)
const map = new Map([
['name', '张三'],
['age', 25],
])
map.get('name')
5️⃣ 集合类型 (Set Types)
📦 Set - 集合
类比: 等同于 JS 的 Set
python
# 创建集合(自动去重)
numbers = {1, 2, 3, 2, 1}
print(numbers) # {1, 2, 3}
# 集合运算
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b) # 并集:{1, 2, 3, 4, 5, 6}
print(a & b) # 交集:{3, 4}
print(a - b) # 差集:{1, 2}
print(a ^ b) # 对称差:{1, 2, 5, 6}
# 添加和删除
a.add(5)
a.remove(1)
a.discard(10) # 不存在也不报错
6️⃣ 布尔类型 (Boolean Type)
python
# True / False(注意大写)
is_active = True
is_deleted = False
# 真值测试(和 JS 类似但有差异)
# 假值:False, None, 0, 0.0, '', [], {}, ()
if []:
print("不会执行")
# 布尔运算
print(True and False) # False(JS 用 &&)
print(True or False) # True(JS 用 ||)
print(not True) # False(JS 用 !)
7️⃣ 空值类型
python
# None(相当于 JS 的 null)
result = None
if result is None:
print("result 是 None")
# 注意:用 is 而不是 ==
# Python 区分 None 和 0、False、空字符串
📊 数据类型总结对照表
Python 类型 | JS 对应 | 可变性 | 主要用途 |
---|---|---|---|
int |
Number |
不可变 | 整数运算 |
float |
Number |
不可变 | 浮点运算 |
str |
String |
不可变 | 文本处理 |
list |
Array |
可变 | 动态数据集合 |
tuple |
无 | 不可变 | 固定数据集合 |
dict |
Object/Map |
可变 | 键值对映射 |
set |
Set |
可变 | 去重、集合运算 |
bool |
Boolean |
不可变 | 逻辑判断 |
None |
null/undefined |
不可变 | 表示空值 |
🎯 最佳实践建议
1. 选择合适的数据类型
python
# ✅ 使用元组表示固定数据
RGB_RED = (255, 0, 0)
# ✅ 使用列表表示动态数据
shopping_cart = ['apple', 'banana']
shopping_cart.append('cherry')
# ✅ 使用集合去重
unique_ids = set([1, 2, 2, 3]) # {1, 2, 3}
# ✅ 使用字典表示结构化数据
user = {'id': 1, 'name': '张三'}
2. 列表推导式优于循环
python
# ❌ 不推荐
squares = []
for x in range(10):
squares.append(x**2)
# ✅ 推荐
squares = [x**2 for x in range(10)]
3. 使用 get()
安全访问字典
python
# ❌ 可能报 KeyError
value = user['phone']
# ✅ 安全访问
value = user.get('phone', '未设置')
4. 利用解包简化代码
python
# ✅ 元组解包
x, y = (3, 4)
# ✅ 列表解包
first, *rest = [1, 2, 3, 4] # first=1, rest=[2,3,4]
# ✅ 字典解包
user = {**default_user, **custom_user}
🚀 进阶主题
1. 深拷贝 vs 浅拷贝
python
import copy
original = [[1, 2], [3, 4]]
shallow = original.copy()
deep = copy.deepcopy(original)
original[0][0] = 999
print(shallow) # [[999, 2], [3, 4]] - 受影响
print(deep) # [[1, 2], [3, 4]] - 不受影响
2. 字典推导式
python
# 类似列表推导式
squares_dict = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
3. 链式比较
python
# Python 特有
x = 5
if 0 < x < 10: # 相当于 0 < x and x < 10
print("x 在 0 到 10 之间")
📚 总结
作为前端开发者学习 Python,重点掌握以下几点:
- List(列表) 是最常用的数据结构,类似 JS 数组但更强大
- Tuple(元组) 用于不可变数据,JS 中没有直接对应
- Dict(字典) 等同于 JS 对象/Map,但语法略有不同
- Range 是惰性求值的数字序列,比 JS 数组生成更高效
- 列表推导式 是 Python 的杀手级特性,比 JS 的 map/filter 更简洁
掌握这些数据类型,你就能流畅地编写 Python 代码了!🎉
🔗 延伸阅读
本文档最后更新:2025 年 10 月 23 日