Python 基础

第九章 · 有益的探索

配合机器学习系列课程

欢迎关注微信公众号

coder程 查令十街84号

本章目录

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(aisb) # True

浅拷贝与深拷贝

浅拷贝

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

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

适用:单层列表

深拷贝

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

方法:copy.deepcopy()

适用:嵌套结构

importcopy # 嵌套列表 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(aisb) # True — 同一对象 # 高效的字符串拼接 words=["I","love","Python"] sentence=" ". join(words) print(sentence) # "I love Python"

列表推导式

# 传统写法 vs 列表推导式 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) # [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) fornameinnames} print(name_lengths) # {'Alice': 5, 'Bob': 3, 'Charlie': 7} # 集合推导式 unique_lengths={len(name) fornameinnames} # 三元表达式 score=75 grade="及格" ifscore>=60 else"不及格" print(grade)

lambda 匿名函数

# lambda 基本用法 square=lambdax:x**2 print(square(5)) # 25 # 用于排序 students=[("Alice",85),("Bob",92),("Charlie",78)]students. sort(key=lambdax:x[1],reverse=True) print(students) # [('Bob', 92), ('Alice', 85), ('Charlie', 78)] # lambda 与 map 结合 nums=[1,2,3,4,5] doubled= list(map(lambdax: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(lambdac: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(lambdax:xin{2,3,5,7},numbers)) print(primes) # [2, 3, 5, 7]

reduce — 累积归约

fromfunctools importreduce # 求阶乘 n=5 factorial= reduce(lambdax,y:x*y,range(1,n+1)) print(factorial) # 120 # 求列表最大值 nums=[3,1,4,1,5,9,2,6] max_val= reduce(lambdaa,b:aifa>belseb,nums) print(max_val) # 9 # 字符串拼接 words=["I"," ","love"," ","Python"] sentence= reduce(lambdax,y:x+y,words) print(sentence) # "I love Python"

本章总结

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

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

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

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

下一章 ▶