Python 基础
第九章 · 有益的探索
配合机器学习系列课程
本章目录
1. 数据类型底层实现
列表的引用数组、字典的散列表、字符串的紧凑数组
浅拷贝 vs 深拷贝
2. 更简洁的语法
列表/字典推导式、三元表达式
lambda 匿名函数
3. 三大神器
map — 映射变换
filter — 条件过滤
reduce — 累积归约
列表的底层实现 — 引用数组
- Python 列表底层是一个
动态数组
,存储的是元素的
引用(内存地址)
- 列表本身存储连续,但元素对象可以分散在内存中
- 修改列表元素只需修改引用,不需要移动数据
- 列表扩容时,会申请更大的连续内存空间,将原数据复制过去
a = [1, 2, 3]
b = a
b[0] = 100
print(a)
print(a is b)
浅拷贝与深拷贝
浅拷贝
复制外层容器,但内部元素共享引用
方法:copy()、切片[:]
适用:单层列表
深拷贝
递归复制所有层级,完全独立
方法:copy.deepcopy()
适用:嵌套结构
import copy
matrix = [[1, 2], [3, 4]]
shallow = matrix.copy()
shallow[0][0] = 99
print(matrix)
deep = copy.deepcopy(matrix)
deep[0][0] = 100
print(matrix)
字典的散列表实现
- 字典底层基于
散列表(Hash Table)
实现
- 键必须是不可变类型(可哈希),值可以是任意类型
- 通过 hash() 函数将键映射到数组索引,实现 O(1) 查找
- 哈希冲突时采用开放寻址法解决
d = {"name": "Sarah", 42: "answer", (1, 2): "tuple key"}
print(hash("name"))
print(hash((1, 2)))
字符串的紧凑数组
- 字符串在 Python 内部以
紧凑数组
存储,字符数据连续存放
- 字符串是
不可变对象
,修改字符串会创建新对象
- Python 会对短字符串进行
驻留(Interning)
优化,复用相同字符串
- 字符串拼接不要用 +,用 join() 效率更高
s = "hello"
s = s + " world"
a = "python"
b = "python"
print(a is b)
words = ["I", "love", "Python"]
sentence = " ".join(words)
print(sentence)
列表推导式
- 列表推导式(List Comprehension)是一种
简洁创建列表
的方式
- 通常比 for 循环更快,代码更 Pythonic
- 支持嵌套和条件过滤
squares = []
for x in range(10):
squares.append(x ** 2)
squares = [x ** 2 for x in range(10)]
evens = [x for x in range(20) if x % 2 == 0]
matrix = [[1, 2], [3, 4], [5, 6]]
flat = [x for row in matrix for x in row]
print(flat)
字典推导式与三元表达式
字典推导式
用 {k:v for ...} 快速创建字典
集合推导式:{x for ...}
三元表达式
value = a if condition else b
替代简单的 if/else 赋值
names = ["Alice", "Bob", "Charlie"]
name_lengths = {name: len(name) for name in names}
print(name_lengths)
unique_lengths = {len(name) for name in names}
score = 75
grade = "及格" if score >= 60 else "不及格"
print(grade)
lambda 匿名函数
-
lambda
用于创建小型匿名函数,无需 def 定义
- 语法:
lambda 参数: 表达式
- 只能包含单个表达式,不能有多条语句
- 常用于排序 key、map/filter 等场景
square = lambda x: x ** 2
print(square(5))
students = [("Alice", 85), ("Bob", 92), ("Charlie", 78)]
students.sort(key=lambda x: x[1], reverse=True)
print(students)
nums = [1, 2, 3, 4, 5]
doubled = list(map(lambda x: x * 2, nums))
print(doubled)
map 与 filter
map(func, iterable)
将函数作用于每个元素
返回迭代器,需用 list() 转换
等价于 [func(x) for x in iterable]
filter(func, iterable)
保留使函数返回 True 的元素
返回迭代器,需用 list() 转换
等价于 [x for x in iterable if func(x)]
temps_c = [0, 10, 20, 30, 40]
temps_f = list(map(lambda c: c * 9 / 5 + 32, temps_c))
print(temps_f)
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
primes = list(filter(lambda x: x in {2, 3, 5, 7}, numbers))
print(primes)
reduce — 累积归约
-
reduce(func, iterable)
对序列进行累积计算
- 需要
from functools import reduce
- 过程:将前两个元素传给函数,结果再与下一个元素计算,依此类推
from functools import reduce
n = 5
factorial = reduce(lambda x, y: x * y, range(1, n + 1))
print(factorial)
nums = [3, 1, 4, 1, 5, 9, 2, 6]
max_val = reduce(lambda a, b: a if a > b else b, nums)
print(max_val)
words = ["I", " ", "love", " ", "Python"]
sentence = reduce(lambda x, y: x + y, words)
print(sentence)
本章总结
▸ 列表 = 引用数组,字典 = 散列表,字符串 = 紧凑数组(不可变)
▸ 浅拷贝 copy() 共享内部引用,深拷贝 deepcopy() 完全独立
▸ 列表/字典推导式让代码更简洁、更 Pythonic
▸ lambda 用于简单匿名函数,map/filter/reduce 是函数式编程利器