Python 基础

第九章 · 有益的探索

配合机器学习系列课程

欢迎关注微信公众号

coder程

本章目录

1. 数据类型底层实现

列表的引用数组、字典的散列表、字符串的紧凑数组

浅拷贝 vs 深拷贝

2. 更简洁的语法

列表/字典推导式、三元表达式

lambda 匿名函数

3. 三大神器

map — 映射变换

filter — 条件过滤

reduce — 累积归约

列表的底层实现 — 引用数组

# 列表存储的是引用,不是值本身 a = [1, 2, 3] b = a # b 和 a 指向同一个列表对象 b[0] = 100 # 修改 b 也会影响 a print(a) # [100, 2, 3] # 验证:a 和 b 是同一个对象 print(a is b) # True

浅拷贝与深拷贝

浅拷贝

复制外层容器,但内部元素共享引用

方法:copy()、切片[:]

适用:单层列表

深拷贝

递归复制所有层级,完全独立

方法:copy.deepcopy()

适用:嵌套结构

import copy # 嵌套列表 matrix = [[1, 2], [3, 4]] # 浅拷贝:外层独立,内层共享 shallow = matrix.copy() shallow[0][0] = 99 print(matrix) # [[99, 2], [3, 4]] — 原数据被修改! # 深拷贝:完全独立 deep = copy.deepcopy(matrix) deep[0][0] = 100 print(matrix) # [[99, 2], [3, 4]] — 原数据不受影响

字典的散列表实现

# 字典的键必须可哈希 d = {"name": "Sarah", 42: "answer", (1, 2): "tuple key"} # 查看哈希值 print(hash("name")) print(hash((1, 2))) # 列表不可哈希,不能作为键 # d[[1,2]] = "fail" # TypeError: unhashable type: 'list'

字符串的紧凑数组

# 字符串不可变 s = "hello" s = s + " world" # 创建了新的字符串对象 # 字符串驻留优化 a = "python" b = "python" print(a is b) # True — 同一对象 # 高效的字符串拼接 words = ["I", "love", "Python"] sentence = " ".join(words) print(sentence) # "I love Python"

列表推导式

# 传统写法 vs 列表推导式 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) # [1, 2, 3, 4, 5, 6]

字典推导式与三元表达式

字典推导式

用 {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) # {'Alice': 5, 'Bob': 3, 'Charlie': 7} # 集合推导式 unique_lengths = {len(name) for name in names} # 三元表达式 score = 75 grade = "及格" if score >= 60 else "不及格" print(grade)

lambda 匿名函数

# lambda 基本用法 square = lambda x: x ** 2 print(square(5)) # 25 # 用于排序 students = [("Alice", 85), ("Bob", 92), ("Charlie", 78)] students.sort(key=lambda x: x[1], reverse=True) print(students) # [('Bob', 92), ('Alice', 85), ('Charlie', 78)] # lambda 与 map 结合 nums = [1, 2, 3, 4, 5] doubled = list(map(lambda x: x * 2, nums)) print(doubled) # [2, 4, 6, 8, 10]

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)]

# map 示例 temps_c = [0, 10, 20, 30, 40] temps_f = list(map(lambda c: c * 9 / 5 + 32, temps_c)) print(temps_f) # [32.0, 50.0, 68.0, 86.0, 104.0] # filter 示例 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) # [2, 3, 5, 7]

reduce — 累积归约

from functools import reduce # 求阶乘 n = 5 factorial = reduce(lambda x, y: x * y, range(1, n + 1)) print(factorial) # 120 # 求列表最大值 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) # 9 # 字符串拼接 words = ["I", " ", "love", " ", "Python"] sentence = reduce(lambda x, y: x + y, words) print(sentence) # "I love Python"

本章总结

▸ 列表 = 引用数组,字典 = 散列表,字符串 = 紧凑数组(不可变)

▸ 浅拷贝 copy() 共享内部引用,深拷贝 deepcopy() 完全独立

▸ 列表/字典推导式让代码更简洁、更 Pythonic

▸ lambda 用于简单匿名函数,map/filter/reduce 是函数式编程利器

下一章 ▶