前言
本文是前十三个章节关键内容的梳理
3.python可迭代对象
3.12 双层列表推导式
vec
为二维列表[[1,2],[3,4]]
。- 表达式
[[row[i] for row in vec] for i in range(len(vec[0]))]
生成vec
中所有行的指定列索引i
的元素组成的列表。
3.13 集合比较
{1, 2, 3} < {3, 4, 5}
比较基于元素顺序,结果为True
。
3.14 list.count()
[1, 2, 3].count(4)
返回0
,因为4
不在列表中。
3.17 集合操作 keys()
和 -
x.keys() - y
返回{2}
,从字典x
的键中移除y
中存在的键。
3.18 dict.values()
不支持 -
操作
x.values() - y
会报错,因为dict.values()
返回的是视图,不支持集合操作。
3.19 列表方法返回值
.pop()
和.index()
返回非空值。
3.21 列表方法返回值
.insert()
、.clear()
和.extend()
返回None
;.count()
返回整数。
3.22 列表方法与内存首地址
.sort()
、.pop()
、.index()
和.reverse()
不影响列表的内存首地址。
3.25 列表方法返回 None
insert()
、remove()
和append()
返回None
。
3.26 整数下标访问
- 列表、元组和字符串支持整数下标访问。
3.27 下标运算
- 列表、元组、字符串和字典(通过键)支持下标运算。
3.28 随机整数统计
- 使用列表统计
random
生成的随机整数出现次数。
3.29 列表切片
- 使用切片获取用户指定下标范围内的子列表。
3.30 字典操作
- 检查用户输入的键是否存在于字典中,并相应输出值或提示信息。
3.31 列表排序
- 生成随机数列表,并对列表的不同部分进行升序和降序排序。
3.32 列表操作性能
- 尾部进行元素增加与删除操作比头部或中间更高效。
4.程序控制结构
4.2 zip()
和 enumerate()
zip((1,2,3), [4,5])
结合两个序列为一个迭代器,产出元组(1, 4)
和(2, 5)
。enumerate(...)
为迭代器中的每个元素添加索引,形成(index, (f, s))
。for
循环遍历,print(f, end=',')
打印f
值,用逗号作分隔。
4.4 寻找素数
- 使用
range(100, 1, -1)
从100递减至2。 - 内层
for
循环检查n
是否能被从2到n-1
的任何数整除。 - 使用
else
与break
结合,找到素数97
。
4.6 布尔上下文中的等价性
3+5
、{3}
和-3
在布尔上下文中等价于True
。[]
为空集合,在布尔上下文中等价于False
。
4.10 逻辑运算符 or
的短路求值特性
or
从左至右评估表达式。- 遇到第一个
True
表达式即停止求值。 - 可用于避免错误和提高效率。
4.11 判断闰年
- 输入年份,检查是否能被400整除,或被4整除且不被100整除。
4.12 删除列表中的所有奇数
- 生成随机整数列表,从末尾开始向前遍历,移除奇数。
4.13 对列表中偶数下标元素降序排列
- 生成随机整数列表,降序排列偶数下标元素。
4.14 因式分解
- 输入小于1880的整数,找出所有因数并输出乘积形式。
4.15 计算180以内所有奇数的和
- 方法一:直接迭代求和。
- 方法二:使用数学公式
n/2 * (first_odd + last_odd)
。 - 方法三:列表推导式生成奇数列表,用
sum()
求和。
4.16 输出由1、2、3、4组成的所有素数
- 生成排列组合,检查每个排列是否为素数。
5.函数
5.2 函数返回值
- 如果函数中没有
return
语句或return
不带值,返回值默认为None
。
5.7 列表参数修改
- 在函数中修改列表参数会直接影响原列表。
5.8 参数默认值
- 参数默认值在函数定义时确定,之后不会改变。
5.11 map
和operator
模块
map
函数将给定函数应用于序列的每个元素。operator.eq
用于比较两个值是否相等。
5.14 生成器函数
- 使用
yield
关键字定义生成器函数。 - 生成器函数在遇到
yield
时产生值并挂起,直到下一次迭代。
5.16 拉姆达表达式
- 一行代码定义函数,适用于简短或一次性函数实现。
5.17 functools.reduce
和operator.or_
reduce
函数将二元函数累积应用于序列,得到单一结果。or_
函数用于集合的合并。
5.18 functools.reduce
和operator.and_
- 使用
and_
函数进行集合交集操作。
5.19 可变参数
- 使用
*p
收集多余位置参数到元组。
5.22 类型注解
- 类型注解不会影响Python运行时行为,主要用于IDE提示和静态类型检查。
5.23 全局变量
- 使用
global
关键字声明函数内部的全局变量。
5.25 函数定义
- 函数定义可以用
def
、lambda
或类定义。
5.26 函数参数
- 参数按值传递,可变对象的修改会影响原对象。
5.27 变量作用域
- 在函数内声明局部变量会遮蔽外部全局变量。
5.28 生成器函数
- 生成器函数的调用结果是一个生成器对象,用于迭代产生值。
5.29 关键字参数
- 使用关键字参数调用函数时,不需要记住参数顺序。
5.35 lambda
匿名函数
- 通过变量名引用
lambda
创建的匿名函数。
5.39 自定义sum
函数
- 使用
max
和sum
实现自定义求和和最大值函数。
5.40 自定义sorted
函数
- 模拟内置
sorted
函数,返回排序后的列表。
5.41 自定义reversed
函数
- 模拟内置
reversed
函数,返回逆序列表的迭代器。
5.42 切片操作
- 使用切片
[::-1]
实现序列的逆序。
6.面向对象程序设计
1. 面向对象三要素
- 封装:隐藏对象的内部状态和实现细节。
- 继承:允许新创建的类继承现有类的属性和方法。
- 多态:允许不同类的对象对同一消息做出响应,但具体行为会有所不同。
2. Python中的双星号(**)和单星号(*)用法
2.1 解包操作
2.1.1 双星号(**)
-
字典解包:将字典转换为关键字参数。
my_func(**my_dict)
-
关键字参数解包:将关键字参数转换为字典。
print_kwargs(**kwargs)
2.1.2 单星号(*)
-
序列解包:将序列转换为位置参数。
func(*args)
2.2 特殊方法名
__pow__
:对应幂运算(使用双星号**)。__floordiv__
:对应地板除(使用//
)。
3. 强行改变类的私有成员
通过名称改写访问或修改私有成员。
obj._ClassName__private_attr
4. 类的构造方法 __init__
- Python 中构造方法名为
__init__
。 - 创建类的新实例时自动调用。
- 可以调用父类的构造方法以确保正确初始化。
5~10 特殊方法与运算符
特殊方法 | 运算符 | 英文含义 |
---|---|---|
__contains__ | in | contains |
__mul__ | * | multiply |
__eq__ | == | equal |
__gt__ | > | greater than |
__ne__ | != | not equal |
__ge__ | >= | greater or equal |
13 代码结果解释
展示了私有方法的名称改写和方法解析顺序。
15~17 重写特殊方法支持内置函数
实现特殊方法可以让类的对象支持内置函数。
18~20 实例成员方法、类方法和静态方法
- 实例成员方法:依赖实例状态,通过
self
访问。 - 类方法:操作类状态,通过
cls
访问,使用@classmethod
。 - 静态方法:完全独立,不涉及类或实例状态,使用
@staticmethod
。
21 __call__
方法
允许类的实例像函数那样被调用。
22~24 私有成员和继承
- 双下划线开头的成员名会进行名称改写,但仍然可以访问。
- Python 不提供真正的私有成员访问控制。
25~26 构造方法继承
- 派生类继承基类的构造方法,除非显式定义或调用。
27 实例方法的调用
实例方法的第一个参数 self
由 Python 在内部处理。
28 str.upper()
与 .upper()
两种方法调用 .upper()
的等价性。
29 生成器的 __next__
方法
与 next()
函数等价,用于获取生成器的下一个值。
30 函数与方法的区别
方法与对象关联,通常接受 self
作为第一个参数;函数独立于类存在。
31 命名约定
- 单下划线
_
:保护变量,外部可访问但不应使用。 - 双下划线
__
:命名改编,减少名称冲突可能性。 - 双下划线加下划线
___
:特殊方法,如__init__
。
7.字符串
字符串操作习题整理
7.1 max()
函数与字符串比较
max(x)
在字符串列表中,根据字典顺序返回最大值。- 字符串数字比较基于字符编码而非数值。
- 要比较数值,先转换字符串为数值类型。
7.2 max()
函数的 key
参数
key
参数指定一个函数,用于从元素中提取比较值。max(x, key=len)
基于字符串长度确定最大值。
7.3 格式化字符串字面量
'{:c}'.format(65)
格式化整数为字符,输出 ‘A’。str(65)
将整数转换为字符串,输出 ‘65’。
7.4 字符串 expandtabs()
方法
- 将制表符转换为相应数量的空格。
'abc\tdef'.expandtabs(8)
输出'abc def'
。
7.5 字符串 ljust()
方法
- 右侧填充空格至指定长度。
'Hello world!'.ljust(20)
输出'Hello world! '
。
7.6 字符串连接
- 使用
+
连接字符串:'a' + 'b'
输出'ab'
。
7.7 字符串编码长度
'字字字字字'.encode('utf-8')
长度为 15,每个中文字符占 3 个字节。
7.9 字符串连接与 len()
'::'.join(['a','b','c'])
输出'a::b::c'
。len('a::b::c')
的值为 7。
7.10 格式化字符串
'{:#<9d}'.format(666)
输出666######
。
7.11 format()
方法
'{},{}'.format(3, 5)
输出'3,5'
。
7.12 format()
方法的索引
'{1},{0}'.format(3, 5)
输出'5,3'
。
7.13 index()
方法错误用法
'Beautiful is better than ugly.'.index('beautiful')
会抛出ValueError
。
7.14 split()
方法与空字符串
'a,,b'.split(',')
输出['a', '', 'b']
。len('a,,b'.split(','))
的值为 3。
7.15 split()
方法默认分隔符
'a\t\t\tb'.split()
输出['a', 'b']
。len('a\t\t\tb'.split())
的值为 2。
7.16 upper()
方法对数字
'1234'.upper()
输出'1234'
。
7.17 rindex()
方法
'ababababa'.rindex('aba')
返回最后一次出现的索引,值为 6。
7.18 count()
方法
'ababababa'.count('aba')
计算非重叠出现次数,值为 2。
7.19 格式化字符串索引
'{:->5.4s}'.format('abcdefg')[0]
输出第一个字符'-'
。
7.20 translate()
方法
table=.maketrans('abc','ABC')
将小写转换为大写。'dong fuguo'.translate(table)
的结果为'dong fuguo'
。
9.文件内容操作
python-docx 库使用笔记
创建和编辑Word文档
python-docx
是一个Python库,它允许用户创建和编辑Word文档(.docx格式)。
安装
pip install python-docx
示例代码
from docx import Document
from docx.shared import Inches
# 创建Word文档
document = Document()
# 添加标题和段落
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
# 添加不同级别的标题
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')
# 添加列表
document.add_paragraph('first item in unordered list', style='List Bullet')
document.add_paragraph('first item in ordered list', style='List Number')
# 添加图片
document.add_picture('monty-truth.png', width=Inches(1.25))
# 添加表格
records = (
(3, '101', 'Spam'),
(7, '422', 'Eggs'),
(4, '631', 'Spam, spam, eggs, and spam')
)
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
row_cells = table.add_row().cells
row_cells[0].text = str(qty)
row_cells[1].text = id
row_cells[2].text = desc
# 添加分页符
document.add_page_break()
# 保存文档
document.save('demo.docx')
功能
- 创建新的Word文档。
- 向文档中添加标题、段落、列表、图片和表格。
- 设置文本格式,如加粗和斜体。
- 调整图片大小。
- 创建表格并填充数据。
- 插入分页符。
- 保存文档到硬盘。
注意事项
python-docx
不依赖于Microsoft Word应用程序。- 可以对现有文档进行读取和修改,也可以创建全新的文档。
10 文件和文件夹操作
Python os
和 os.path
模块笔记
文件和目录操作
- `os.listdir(pa
- th)`: 列出指定文件夹中的文件和子文件夹,返回名称列表。
os.mkdir(path)
: 创建一个新目录,如果已存在则抛出异常。os.path.exists(path)
: 检查指定文件或目录是否存在。os.path.isfile(path)
: 检查指定路径是否为文件。os.path.isdir(path)
: 检查指定路径是否为目录。os.path.splitext(path)
: 分割文件路径,返回(文件名,扩展名)元组。
路径操作
os.path.join(path, *paths)
: 连接多个路径组件,返回组合后的路径字符串。os.path.abspath(path)
: 返回路径的绝对路径。os.path.getsize(path)
: 返回指定文件的大小,单位为字节。os.remove(path)
: 删除指定的文件,如果文件只读则抛出异常。os.rmdir(path)
: 删除空目录,如果目录非空则抛出异常。os.walk(top, topdown=True, onerror=None, followlinks=False)
: 遍历目录树,返回每个目录的路径、子目录列表和文件列表。
当前工作目录操作
os.chdir(path)
: 修改当前工作目录到指定路径。os.getcwd()
: 获取当前工作目录的完整路径。
文件重命名和移动
os.rename(src, dst)
: 重命名文件或目录,也可以在同一文件系统中移动文件。
高级文件操作
shutil.move(src, dst)
: 移动文件或目录,可以跨文件系统或磁盘分区。
环境变量
os.getenv(key, default=None)
: 获取环境变量的值,如果不存在则返回默认值。
用户目录
os.path.expanduser(~)
: 展开用户主目录的简写~
为完整路径。
文件搜索
- 用户可以输入文件夹路径和文件名,使用
os.walk()
搜索文件夹及其子文件夹中是否存在该文件。
注意事项
os.listdir()
返回的是文件和文件夹的名称列表,不是完整路径。os.remove()
不能删除带有只读属性的文件,需要先更改权限。os.mkdir()
如果尝试创建已存在的目录,会抛出FileExistsError
。os.startfile()
是 Windows 特有的,用于打开文件关联的应用程序。os.walk()
可以遍历指定目录及其所有子目录,返回三元组(dirpath, dirnames, filenames)
。shutil.move()
可以先复制再删除以实现跨分区移动。
11.异常处理结构和单元测试
异常处理基础
1. 主动抛出异常
- 使用
raise
语句可以主动抛出一个异常,通常在检测到错误条件时使用以中断程序流程。if some_condition: raise ValueError("An error occurred")
2. try...except
结构中的 else
子句
else
块仅在try
块中没有抛出任何异常时执行。try: # 尝试执行的代码 except: # 异常处理代码 else: # 如果没有异常发生,执行这里的代码
3. try...except
结构中的 except
子句
except
子句用于捕获try
块中可能出现的特定类型的异常。try: # 尝试执行的代码 except SomeException: # 处理 SomeException 异常的代码
4. finally
子句
finally
块中的代码无论是否发生异常都会执行,常用于执行清理工作。try: # 尝试执行的代码 except: # 异常处理代码 finally: # 无论是否发生异常,都会执行这里的代码
5. 断言(assert
)
assert
用于设置检查点,确保某个条件为真。如果条件为假,则引发AssertionError
。assert 3 == 3, "3 does not equal 3"
异常与错误的区别
错误(Error)
- 指程序无法自行解决的问题,通常需要开发者介入。
- 编译时错误:语法错误或违反编程语言规则导致。
- 运行时错误:程序执行过程中发生,如非法索引、除以零等。
异常(Exception)
- 程序运行时的特殊事件,代表非正常控制流条件。
- 抛出(Raise):检测到异常条件时使用。
- 捕获(Catch):通过
try...except
块处理。 - 传播(Propagate):未被捕获的异常会向上传播。
常见异常类型
1. ZeroDivisionError
- 尝试除以零时引发。
2. TypeError
- 进行类型不兼容的操作时引发,如字符串与整数相加。
3. ValueError
- 传入不合法的值给某些函数时引发,如
int('3.14')
。
4. FileNotFoundError
- 尝试打开不存在的文件时引发。
特殊情况下的异常处理
1. 生成器异常处理
- 使用
StopIteration
异常处理生成器中的异常情况。
2. 断言禁用
- 通过
-O
选项或dis
模块禁用断言。
3. 表达式错误
- 如
3(4+5)
试图调用整数作为函数,引发TypeError
。
4. 列表和元组操作
- 列表和元组不支持相互加法操作,如
[1] + (2, 3)
会引发TypeError
。
5. assert
断言
- 如果条件为真,
assert
语句后的内容继续执行;否则,引发AssertionError
。
总结
- 错误是阻止程序正常执行的问题,需要外部干预。
- 异常是程序运行时可处理的错误,提供了一种结构化的错误处理机制。
- 通过
try...except...else...finally
结构,可以灵活地处理程序中的异常情况。
13.数据分析、科学计算与可视化
第13章版本1
1. NumPy 数组的 sum()
和元素乘法
- 表达式
sum(x*2)
计算数组x
每个元素乘以 2 后的总和。 - 示例中
x
是[1, 2, 3, 4, 5]
,乘以 2 后得到[2, 4, 6, 8, 10]
,总和为 30。
2. NumPy 的 random.randn()
和 .shape
np.random.randn(3)
生成一个形状为 (3,) 的一维数组,即有三个元素的数组。- 扩展:
np.random.randn(3, 4)
生成一个形状为 (3, 4) 的二维数组,即有三行四列的矩阵。
3. NumPy 的 argmax()
函数
np.argmax(x)
返回数组x
中最大元素的索引。- 在多维数组中,可以指定
axis
参数来找出特定轴上的最大值索引。 - 示例:对于数组
x = [3, 5, 1, 4, 2]
,np.argmax(x)
返回 1,因为元素 5 是最大值,其索引为 1。
4. Pandas 的 sort_values()
方法
- 用于根据一个或多个列的值对 DataFrame 进行排序。
- 支持升序或降序排序,可以通过
ascending
参数指定。 inplace=True
时,排序操作会原地修改原始 DataFrame。
5. Pandas 的 describe()
方法
- 自动计算数值型列的计数、平均值、标准差、最小值和最大值。
6. Pandas 的 head()
方法
- 查看 DataFrame 的前几行,默认为前 5 行。
- 可以通过
n
参数指定显示的行数。
7. Pandas 的 fillna()
方法和 inplace
参数
- 用于填充 DataFrame 中的缺失值。
inplace=True
时,填充操作会原地修改原始 DataFrame。
8. Pandas 的 groupby()
方法
- 允许根据一个或多个键对 DataFrame 进行分组。
- 分组后的对象支持多种聚合方法,如
sum()
、mean()
、max()
等。
9. Pandas 的 plot()
方法
- 用于绘制不同类型的图表,如折线图、柱状图、直方图等。
kind
参数用于指定图表的类型。
补充说明
reshape()
和resize()
是 NumPy 数组的方法,用于改变数组的形状。reshape()
不改变元素个数,仅改变形状。resize()
可以改变数组的元素个数,用np.nan
填充或截断数组。
第13章版本2
13.1 NumPy 数组操作
- 执行
import numpy as np
和x = np.array([1, 2, 3, 4, 5])
- 表达式
sum(x * 2)
的结果为 30 - 计算过程:
[1, 2, 3, 4, 5] * 2 = [2, 4, 6, 8, 10]
,求和得到 30
13.3 NumPy 矩阵形状
- 表达式
np.random.randn(3).shape
的值为(3,)
,表示一个一行三列的矩阵 - 扩展:一个三行四列的矩阵形状为
(3, 4)
13.6 NumPy argmax
函数
np.argmax(x)
用于找出数组x
中最大元素的索引位置- 在多维数组中,默认返回第一个最大元素的索引
- 语法:
np.argmax(array, axis=None, out=None)
array
: 输入数组axis
: 指定查找最大值的轴out
: 可选,用于存储结果的数组
示例代码
import numpy as np
# 一维数组示例
x = np.array([3, 5, 1, 4, 2])
index_of_max_value = np.argmax(x) # 返回 1
# 多维数组示例
x = np.array([[1, 2], [3, 4]])
index_of_max_value_along_axis = np.argmax(x, axis=1) # 返回 [1, 1]
13.7 Pandas sort_values()
方法
sort_values()
用于对DataFrame
进行排序- 支持一个或多个列的排序,可选择升序或降序
关键参数
by
: 用于排序的列名或列名列表axis
: 指定排序的轴,默认为 0(按列排序)ascending
: 指定排序方向,可为布尔值或布尔值列表inplace
: 是否在原始 DataFrame 上进行修改kind
: 指定排序算法类型
示例代码
import pandas as pd
# 创建 DataFrame
df = pd.DataFrame({
'Name': ['John', 'Anna', 'Peter', 'Linda'],
'Age': [45, 22, 36, 28],
'Salary': [70000, 35000, 48000, 59000]
})
# 升序排序
df_sorted_by_age = df.sort_values(by='Age')
# 降序排序 Salary,升序排序 Age
df_sorted_by_salary_and_age = df.sort_values(by=['Salary', 'Age'], ascending=[False, True])
# 原地排序
df.sort_values(by='Age', inplace=True)
13.8 Pandas describe()
方法
- 自动计算数值型列的统计数据:计数、平均值、标准差、最小值和最大值
- 非数值列不产生描述性统计
13.9 Pandas head()
方法
- 查看
DataFrame
的前几行,默认显示前 5 行
示例代码
import pandas as pd
# 创建 DataFrame
df = pd.DataFrame({
'Column1': [1, 2, 3, 4, 5, 6],
'Column2': ['A', 'B', 'C', 'D', 'E', 'F']
})
# 查看前 5 行
print(df.head())
# 查看前 3 行
print(df.head(3))
13.18 Pandas fillna()
方法
- 填充
DataFrame
中的缺失值 inplace
参数决定是否在原始 DataFrame 上修改
示例代码
import pandas as pd
# 创建包含缺失值的 DataFrame
df = pd.DataFrame({
'A': [1, 2, None, 4],
'B': [None, 2, 3, 4]
})
# 原地填充缺失值为 0
df.fillna(value=0, inplace=True)
13.11 Pandas groupby()
方法
- 对
DataFrame
进行分组操作 - 分组后可执行聚合计算,如
sum()
、mean()
等
示例代码
import pandas as pd
# 创建 DataFrame
df = pd.DataFrame({
'Employee': ['John', 'Anna', 'Peter', 'Linda'],
'Department': ['A', 'A', 'B', 'B'],
'Sales': [200, 380, 150, 210]
})
# 按部门分组计算平均销售额
grouped_by_department = df.groupby('Department')
average_sales_by_department = grouped_by_department['Sales'].mean()
# 执行多个聚合操作
agg_operations = grouped_by_department.agg({
'Sales': ['mean', 'sum', 'max']
})
13.12 Pandas plot()
方法
- 绘制图形进行可视化
kind
参数指定图形类型,如'line'
、'bar'
、'hist'
等
示例代码
import pandas as pd
# 创建 DataFrame
df = pd.DataFrame({
'Date': pd.date_range(start='2021-01-01', periods=5, freq='D'),
'Sales': [230, 410, 350, 280, 390]
})
# 绘制折线图
df.plot(kind='line', x='Date', y='Sales')
# 绘制柱状图
df.plot(kind='bar', x='Date', y='Sales')
注意事项
- 确保安装了
matplotlib
库以使用plot()
方法 plot()
方法接受多个参数,如x
、y
、figsize
等- 通过
matplotlib
的 API 可以进一步定制图形