教程地址: https://www.liaoxuefeng.com/wiki/1016959663602400
生成器和迭代器
1 | # 构建生成器 |
装饰器
1 | def metric(name): |
wrapper: 包装纸
decorator: 装潢师;裝修工;粉刷匠
偏函数
1 | def max_number(*numbers): |
Private 变量
1 | class Student(object): |
类型判断
1 | import types |
获取对象所有属性和方法
1 | dir('ABC') |
限定 dict 绑定的字段
1 | form types import MethodType |
@property @score.setter
1 | class Student(object): |
多重继承
1 | class Dog(Mammal, Runnable): |
类属性
__str__
__init__
__repr__
__iter__
__next__
__getitem__
1 | class Fib(object): |
__getattr__
1 | class Student(object): |
__call__
1 | class Student(object): |
枚举
遍历成员
1 | for name, member in Month.__members__.items(): |
1 |
|
动态创建类
1 | Hello = type('Hello', (object,), dict(hello=fn)) # 创建 Hello class |
- class 的名称;
- 继承的父类集合,注意 Python 支持多重继承,如果只有一个父类,别忘了 tuple 的单元素写法;
- class的方法名称与函数绑定,这里我们把函数
fn
绑定到方法名hello
上。
metaclass
1 | # metaclass是类的模板,所以必须从`type`类型派生: |
__new__()
方法接收到的参数依次是:
- 当前准备创建的类的对象;
- 类的名字;
- 类继承的父类集合;
- 类的方法集合。
StringIO ,BytesIO
1 | from io import StringIO, BytesIO |
os
1 | import os |
序列化
1 | import pickle |
多进程
fork
1 | import os |
multiprocessing
跨平台,支持 Windows
1 | from multiprocessing import Process |
multiprocessing.Pool
1 | from multiprocessing import Pool |
subprocess
1 | import subprocess |
communicate()
1 | import subprocess |
Queue
1 | from multiprocessing import Process, Queue |
1 | from multiprocessing import Process, Queue |
多线程
1 | import time, threading |
- threading.curent_thread()
- Tread()
- start()
- join()
线程锁
1 | import threading |
GIL 全局锁
多线程最多只能利用一个进程。
GIL 全局锁相当于给所有线程上锁。导致线程运行需要获取锁。
线程变量
- 线程变量只有线程可以看到访问
- 全局变量修改必须加锁,否则会被不同的线程同时修改
- 通过设置全局变量 dict[threading.current_thread()] 来实现线程与变量对象的绑定
1 | import threading |
进程和线程对比
区别:
进程 | 线程 | |
---|---|---|
共享内存 | 不支持 | 支持 |
性能 | 相对较好 | 相对较差 |
稳定性 | 挂掉不影响主进程 | 挂掉之后影响当前线程所在的主进程 |
创建成本 | 较高,且系统支持的进程数有限 | 一个进程可以创建融甘线程,创建成本较低 |
总结:
- 对于 python 这种运行性能较差的脚本语言,一般不建议作为计算密集型服务
- 而对于 IO 密集型服务,多线程 / 进程可以解决进程等待问题,但不可避免导致在线程切换的情况造成性能损耗。
- 异步 IO 是解决问题的趋势
分布式进程
1 | # task_master.py |
1 | # task_worker.py |
內建模块
datetime
1 | from datetime import datetime, timedelta, timezone |
collections
namedtuple
定义名称、字段和个数的元组
1 | Point = namedtuple("Point", ["x", "y"]) |
deque
队列,快速插入和删除元素
1 | q = deque(["a", "b", "c"]) |
defaultdict
默认值
1 | from collections import defaultdict |
OrderedDict
字段 key 有序。(按照插入顺序)。
ChainMap
链接多个 dict,并按照优先级返回
Counter
计数器
1 | c = Counter() |
argparse
参数解析
1 | # backup.py |
base64
1 | import base64 |
struct
字节处理
hashlib
1 | import hashlib |
hmac
1 | import hmac |
itertools
迭代对象工具
1 | # 无限迭代器 |
contextlib
封装支持 with 函数的方法
1 |
|
urllib
1 | from urllib import request |
模拟微博登录
1 | from urllib import request, parse |
XML
pass
HTMLParser
1 | class MyHTMLParser(HTMLParser): |
第三方模块
Pillow
1 | from PIL import Image, ImageFilter |
requests
1 | import request |
chardet
编码检测
1 | data = '离离原上草,一岁一枯荣'.encode('gbk') |
psutil
系统信息获取
1 | import psutil |
venv
python 虚拟机环境之一
1 | mkdir venv && cd venv |
图形界面
pass
网络编程
pass
电子邮件
SMTP 发送邮件
1 | from email.mime.text import MIMEText |
Message 对象分层
1 | Message |
POP3 协议接受邮件
1 | import poplib |
数据库访问
SQLite
1 | import sqlite3 |
MySQL
使用 mysql-connector-python 插件
1 | import mysql.connector |
使用 mysql-connector 插件
1 | import mysql.connector |
mysql-connector-python 和 mysql-connector 使用上的区别
- mysql-connector-python 支持
with xxx as conn
而 mysql-connector 不支持 - mysql-connector 默认使用
caching_sha2_password
进行链接 (MySQL 8 默认 auth 方式),如果使用 native_password ,需要在 connect 参数上增加auth_plugin='mysql_native_password'
SQLAlchemy
pass
Web 开发
Flask
1 | from flask import Flask |
异步 IO
协程
asyncio
Python 3.4 引入
1 | import threading |
yield from 本质意义和在 Nodejs 里的 yield 甚至 await 是同个作用。
区别在于 python 最外层不支持,所以需要封装一层。
async / await
Python 3.5 支持
em………….
1 | async def hello(): |