1 2 3

我的 Python 不可能这么可爱

Python 学习笔记,如有错误,欢迎指正

GitHub项目地址:python-tips

本文从 2019 年 11 月一路更新到了 2020 年 11 月,我也从实习转向了正式工作。一年前,我尚未将 Python 视作主力编程语言。但今天,它毫无疑问已经是我最熟稔的伙伴之一了。

Python 有许多缺点,但是它在机器学习、科学计算、可视化、网络编程等方面的优势,几乎无可匹敌。它的身影在一些不追求高性能的、离线低频次的场景下频繁出现。在诸如数据分析、算法预研、仿真建模等领域,都将 Python 作为首选语言。

但是,入门 Python 并不容易。因为除了学习使用 Python 写代码,你还要学习关于这门语言自身的知识。例如,Python 有将文件视作模块 (module) 的机制。如果你要具体地理解这件事,你还需要深究 importif __name__ == "__main__"__init__.py 的含义。

Python 语言就像一棵枝叶繁茂的树。如果你找不到枝干,就会被无数琐碎细节淹没,无从入手。《大学》云,知所先后则近道矣,正有其意。我衷心希望本文能成为学习你 Python 的“枝干”和“抓手”。

书目推荐

  • 入门:《Python编程从入门到实践》 [豆瓣链接]
  • 初级:《Python学习手册》(英文名 Learning Python) [豆瓣链接]
  • 中级:《流畅的Python》[豆瓣链接]

PS: 针对每个阶段,我推荐的是我认为最好的那本书。

语言基础

列表

本文从以下几个方面介绍列表:

  1. 创建
  2. 获取
  3. 修改
  4. 添加
  5. 插入
  6. 删除
  7. 排序
  8. 逆序
  9. 索引
  10. 循环
  11. 列表推导
  12. 切片
  13. 复制
  14. 去重
  15. 计数
  16. 查找

字典

鉴于 JSON 在数据处理中的大量使用,字典的重要性也不言而喻。

本文从以下几个方面介绍字典:

  1. 创建
  2. 获取
  3. 更新
  4. 遍历
  5. 排序
  6. 删除
  7. 字典与JSON
  8. collections.defaultdict()
  9. setdefault()

字符串

除了列表和字典,字符串也是 Python 中一种非常重要的数据类型。

  1. 基本操作
  2. 格式化
  3. 字符串方法

函数

本文目录:

  1. 形参和实参
  2. 位置实参
  3. 关键字实参
  4. 默认值
  5. 位置实参和关键字实参的混用
  6. 默认值、位置实参和关键字实参的混用
  7. 传递任意数量的位置实参
  8. 传递任意数量的关键字实参
  9. 由字符串函数名生成可调用的函数

异常

程序会发生异常,比如试图在计算中除0。Python 提供了强大的异常处理机制。

  1. 引发异常
  2. 捕捉异常
  3. 捕捉多种异常
  4. 捕捉所有异常
  5. 输出异常
  6. 使用 else
  7. 手动触发异常
  8. 使用 finally

闭包

Actually, a closure is a function with an extended scope that encompasses nonglobal variables referenced in the body of the function but not defined there. It does not matter whether the function is anonymous or not; what matters is that it can access nonglobal variables that are defined outside of its body. (Fluent Python)

上面这段话告诉我们,闭包是一个有延伸作用域的函数。该延伸作用域包含非全局变量,这个非全局变量在闭包内引用,但不在闭包内定义。

这听起来挺抽象的。

简而言之,闭包本质上是嵌套函数的内层函数。但是嵌套函数的内层函数要成为闭包,还需要满足:

  1. 有延伸作用域;
  2. 该延伸作用域内包含非全局变量;
  3. 该非全局变量在闭包内引用,但不在闭包内定义。

依旧抽象,直接上例子。

 …………

生成器

Every generator is an iterator: generators fully implement the iterator interface. But an iterator—as defined in the GoF book— retrieves items from a collection, while a generator can produce items “out of thin air.” That’s why the Fibonacci sequence gener‐ ator is a common example: an infinite series of numbers cannot be stored in a collection. – Fluent Pyton

《流畅的Python》这本书中告诉我们:每个生成器都是一个迭代器。为什么这么说?因为生成器完全实现了迭代器的接口。但是一个迭代器需要从集合中取出元素,而生成器却可以无中生有。

本文目录:

  1. 可迭代对象
  2. 可迭代对象与迭代器的对比
  3. 典型的迭代器
  4. Sentence 类第3版: 生成器函数
  5. Sentence 类第4版: 惰性实现
  6. Sentence类第5版: 生成器表达式
  7. 等差数列生成器
  8. 标准库中的生成器函数
  9. Python 3.3 中新出现的句法: yield from
  10. 可迭代的归约函数
  11. 深入分析iter函数

装饰器

本代码基于博文: 《Finally understanding decorators in Python》

一个带装饰器的函数看起来是这样的:

def decorator_name(func):
    def f():
        rv = func()
        return rv
    return f

@decorator_name
def func_name():
    pass

在上面这段代码中,@decorator_name 就是装饰器。

顾名思义,装饰器是用来装饰东西的。用来装饰什么东西呢?

它是用来装饰函数的。从作用上来说,就是把函数捉出来“装饰”一番,然后放回去。

下面通过一些例子说明装饰器的用法和意义……

本文目录:

  1. 装饰器基础
  2. 一个小练习
  3. 使用 *args**kwargs
  4. 高阶装饰器
  5. @functools.lru_cache()

内置函数

Python 是一门实用主义的语言,很多常用的功能都已经封装在内置函数里了。学习一些常用的内置函数,能提高我们使用 Python 的效率。

本文提及的内置函数包括:

  • abs()
  • hash()
  • divmod()

    ……

  • open()

  • pow()

  • join()

多线程

善用多线程,能提高程序的运行速度。

本节内容包括:

  1. 多线程的首次尝试
  2. 利用 for loop 创建多线程
  3. 带参数的线程

常用库

NumPy

NumPy 是用于科学计算的库。

本文的内容包括:

  1. ndarray
    • 初始化
    • 索引
    • 转置
  2. 通用函数
    • 一元ufunc
    • 二元ufunc
    • 用于聚合计算的函数
    • 排序
    • 去重
    • 成员资格
  3. 数组文件
  4. 线性代数
    • 点乘
    • 求逆
    • qr分解

pandas

pandas 是用于数据分析的库。

本文的内容包括:

  1. 基本数据类型
    • Series
    • DataFrame
  2. 基本功能
    • 重新索引
    • 丢弃指定轴上的项
    • 索引
    • 算术运算
    • 算术方法
    • DataFrame 和 Series 之间的运算
    • 函数
    • 排序
    • 排名
    • 带有重复值的索引
  3. 统计描述
    • 求和
    • 取到最大值时的索引值
    • 累计求和
    • 均值
    • 汇总统计
    • 相关系数
    • 协方差
    • 去重
    • 值计数
    • 成员资格
  4. 缺失数据
    • 处理缺失数据
    • 过滤缺失数据
    • 填充缺失数据
  5. 层次化索引
    • 构建层次化索引的 Series
    • 选取数据子集
    • stack 和 unstack
    • 构建层次化索引的 DataFrame
    • 调整某条轴上索引级别的顺序
    • 根据级别进行汇总统计
    • 将 DataFrame 的列作为索引
  6. 整数索引
  7. 合并
    • 默认合并方式
    • 显式指定作为键的列名
    • 连接方式
    • 多对多的合并

datetime

datetime 模块用于操作日期和时间。

本文目录:

  1. timedelta 对象
    • 构造函数
    • 支持的操作
  2. date 对象
    • 构造函数
    • 类方法
    • 类属性
    • 支持的操作
    • 实例方法
  3. datetime 对象
    • 构造函数
    • 类方法
    • 类属性
    • 实例属性
    • 支持的操作
    • 实例方法
  4. time 对象
    • 构造函数
    • 类方法
    • 类属性
    • 实例方法
  5. tzinfo 对象
  6. timezone 对象
    • 构造函数
    • 实例方法

logging

logging 是用于打印日志的 Python 内置库。

logging 和普通的 print 函数的区别在于,使用 logging 一般是为了报告代码运行的状态,而非输出结果。logging 提供了一系列功能,使打印日志更加方便快捷,比如使用 formatter 可以轻松定制日志的打印格式。

本文目录:

  1. 简单使用
  2. 在单个脚本中使用
    • 威胁等级 - level
    • 日志打印格式 - format
  3. 涉及多个模块的使用
    • 无法被重写
    • Logger

argparse

本文目录:

  1. help 参数
  2. add_argument
    • 位置参数
    • 可选参数
    • 同时使用位置参数与可选参数
    • 具有flag功能的参数
    • 更具普适性的方法:const 和 default 的组合
    • 重命名

代码模版

画图

MatplotlibSeaborn 是 Python 环境下比较常用的两个画图库。本例展示了用 Matplotlib 绘制条形图、饼图、折线图和用 Seaborn 绘制复杂折线图的方法。下图展示了本例中实现的图像类型。

Note: 这里专门提一下 Seaborn 的一个坑。

Seaborn 的 lineplot() 方法会将横轴标签按 String 的默认方法进行排序。例如,你要画一副横轴标签是 1 - 12 月份的函数图像,那么在 lineplot() 画出的图像里,横轴的实际排序将变成:1月,10月,11月,12月,2月,… 这完全打乱了我们希望图像展现的月份间的趋势变化。

为了避免 lineplot() 对横轴标签进行默认排序,需要在函数内添加 sort 参数,并设置 sort=False

下图展示了默认情况下,Seaborn 对中文横轴标签的迷之排序。

读写 CSV

CSV 是数据表的常用存储方式。除第一行外,每行表示一条信息,行内各字段用英文逗号分隔开。

本例介绍了从读取 CSV 文件,修改 CSV 文件,到重新写入 CSV 文件的一般流程。

本文目录:

  1. 读取 CSV 文件
  2. 用 DataFrame 展示数据
  3. 处理数据
  4. 导出数据到 CSV 文件
  5. 用 pandas 读 CSV 文件
  6. 用 pandas 随机读取 CSV 文件

玩转 Python

词云

本文目录:

  1. 最简单的词云
  2. 几何形状的词云
  3. 以 png 图片作遮罩的词云
  4. 中文词云

图像处理

本文主要介绍 Python 图像处理的常用库和函数。

  1. PIL
    • 颜色转换
    • 转换图像格式
    • 创建缩略图
    • 裁剪
    • 调整尺寸
    • 旋转
    • 粘贴
  2. Matplotlib
    • 绘制图像、点和线
    • 图像中的像素点
    • 图像轮廓
    • 直方图
  3. Numpy
    • 像素数组
    • 灰度变换
    • 直方图均衡化
    • 图像平均
    • 图像的主成分分析
    • 使用pickle模块
  4. SciPy
    • 图像模糊
    • 图像导数
    • 形态学:对象计数
    • 图像去噪
  5. GIF图像处理
    • 将 GIF 图像拆分为图片
    • 制作逆序gif图像