Python 基础
第九章 · 有益的探索
配合机器学习系列课程
本章目录
1. 数据类型底层实现
列表的引用数组、字典的散列表、字符串的紧凑数组
浅拷贝 vs 深拷贝
2. 更简洁的语法
列表/字典推导式、三元表达式
lambda 匿名函数
3. 三大神器
map — 映射变换
filter — 条件过滤
reduce — 累积归约
列表的底层实现 — 引用数组
- Python 列表底层是一个
动态数组
,存储的是元素的
引用(内存地址)
- 列表本身存储连续,但元素对象可以分散在内存中
- 修改列表元素只需修改引用,不需要移动数据
- 列表扩容时,会申请更大的连续内存空间,将原数据复制过去
a=[1,2,3]
b=a
b[0]=100
print(a)
print(aisb)
浅拷贝与深拷贝
浅拷贝
复制外层容器,但内部元素共享引用
方法:copy()、切片[:]
适用:单层列表
深拷贝
递归复制所有层级,完全独立
方法:copy.deepcopy()
适用:嵌套结构
importcopy
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(aisb)
words=["I","love","Python"]
sentence=" ".
join(words)
print(sentence)
列表推导式
- 列表推导式(List Comprehension)是一种
简洁创建列表
的方式
- 通常比 for 循环更快,代码更 Pythonic
- 支持嵌套和条件过滤
squares=[]
forxinrange(10):
squares.
append(x**2)
squares=[x**2
forxinrange(10)]
evens=[xforxinrange(20)ifx%2==0]
matrix=[[1,2],[3,4],[5,6]]
flat=[xforrowinmatrixforxinrow]
print(flat)
字典推导式与三元表达式
字典推导式
用 {k:v for ...} 快速创建字典
集合推导式:{x for ...}
三元表达式
value = a if condition else b
替代简单的 if/else 赋值
names=["Alice","Bob","Charlie"]
name_lengths={name:len(name)
fornameinnames}
print(name_lengths)
unique_lengths={len(name)
fornameinnames}
score=75
grade="及格"
ifscore>=60
else"不及格"
print(grade)
lambda 匿名函数
-
lambda
用于创建小型匿名函数,无需 def 定义
- 语法:
lambda 参数: 表达式
- 只能包含单个表达式,不能有多条语句
- 常用于排序 key、map/filter 等场景
square=lambdax:x**2
print(square(5))
students=[("Alice",85),("Bob",92),("Charlie",78)]students.
sort(key=lambdax:x[1],reverse=True)
print(students)
nums=[1,2,3,4,5]
doubled=
list(map(lambdax: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(lambdac:c*9/5+32,temps_c))
print(temps_f)
numbers=[1,2,3,4,5,6,7,8,9,10]
primes=
list(filter(lambdax:xin{2,3,5,7},numbers))
print(primes)
reduce — 累积归约
-
reduce(func, iterable)
对序列进行累积计算
- 需要
from functools import reduce
- 过程:将前两个元素传给函数,结果再与下一个元素计算,依此类推
fromfunctools
importreduce
n=5
factorial=
reduce(lambdax,y:x*y,range(1,n+1))
print(factorial)
nums=[3,1,4,1,5,9,2,6]
max_val=
reduce(lambdaa,b:aifa>belseb,nums)
print(max_val)
words=["I"," ","love"," ","Python"]
sentence=
reduce(lambdax,y:x+y,words)
print(sentence)
本章总结
▸ 列表 = 引用数组,字典 = 散列表,字符串 = 紧凑数组(不可变)
▸ 浅拷贝 copy() 共享内部引用,深拷贝 deepcopy() 完全独立
▸ 列表/字典推导式让代码更简洁、更 Pythonic
▸ lambda 用于简单匿名函数,map/filter/reduce 是函数式编程利器