环境
1 | Python 3.6.4 |
一、安装配置
1. pip包管理器
1.1. 安装
安装相应python的版本的pip
1 | sudo apt install python3-pip |
1.2. 配置pip源
1 | pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple |
1.3. 生成requirements.txt
1 | pip freeze > requirements.txt |
1.4. pip安装失败,无法再使用pip怎么办
1 | 修复本地的pip |
1.5. pip命令用法
1 | 安装指定版本软件 |
2. jupyter notebook
2.1. 安装
使用pip安装没有找到怎么命令行调用,使用apt可以直接命令行调用
1 | pip install notebook |
2.2. 配置远程访问
1 | ~|⇒ jupyter notebook --generate-config # 生成jupyter配置文件 |
编辑jupyter_notebook_config.py
,找到以下配置,改成这样
1 | c.NotebookApp.ip = '*' # 允许所有ip访问 |
2.3. 设置matplotlib的图像显示大小
1 | plt.rcParams["figure.figsize"] = (15.0, 12.0) |
3. pylint 代码风格检查配置
二、语法相关
1. 风格和编码
1.1. 指定编码格式
源文件第一行或第二行直接定义
1 | # coding=utf-8 |
或者
1 | # -*- coding:utf-8 -*- |
1.2. 代码风格
- 函数和变量使用下划线命名
- 全局常量使用大写字母
2. 变量
2.1. None
- None是一个特殊的常量。
- None和False不同。
- None不是0。
- None不是空字符串。
- None和任何其他的数据类型比较永远返回False。
- None有自己的数据类型NoneType。
- 你可以将None赋值给任何变量,但是你不能创建其他NoneType对象。
python中矩阵索引使用None表示此维度不切片,同样意味着此维度大小未知
2.2. del 删除一个变量释放空间
1 | del var |
3. 字符串操作
3.1. 替换字符串
1 | str = 'abc' |
3.2. 删除首位空格(包括换行符)
1 | str = str.dropip() |
3.3. 和ASCII码之间的转换
1 | # 转ASCII码,仅单个字符 |
3.4. 字符串格式化
(1) f'xxx'
格式
1 | a = 1 |
(2) format()
格式
- 指定位置
1 | >>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序 |
- 使用字典
1 | print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com")) |
- 使用格式
数字 | 格式 | 输出 | 描述 |
---|---|---|---|
11 | '{:b}'.format(11) | 1011 | 二进制 |
11 | '{:d}'.format(11) | 11 | 十进制 |
11 | '{:o}'.format(11) | 13 | 八进制 |
11 | '{:x}'.format(11) | b | 小写十六进制 |
11 | '{:X}'.format(11) | 0xb | 大写十六进制 |
11 | '{:#x}'.format(11) | 0Xb | 补 0x 小写十六进制 |
11 | '{:#X}'.format(11) | 0XB | 补 0X 大写写十六进制 |
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | +3.14 | 带符号保留小数点后两位 |
-1 | {:+.2f} | -1.00 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为 2) |
5 | {:x<4d} | 5xxx | 数字补 x (填充右边, 宽度为 4) |
10 | {:x<4d} | 10xx | 数字补 x (填充右边, 宽度为 4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指数记法 |
13 | {:>10d} | --------13 | 右对齐 (默认, 宽度为 10) |
13 | {:<10d} | 13-------- | 左对齐 (宽度为 10) |
13 | {:^10d} | ----13---- | 中间对齐 (宽度为 10) |
3.4. 二进制和字符串转换
- 使用
str.encode()
将字符串转成二进制 - 使用
str.decode()
将二进制转成字符串
1 | str = b'fW0v6MG1C3\n/UrT6bdQ==\n' |
3.5. 原始字符串
- 三个双引号可以保留换行,但是
\
还是会转义 - 加上r可以不转义
\
1 | str = """aaa |
1 | aaa |
- 使用r修饰可以不转义
\
1 | str = r"""aaa |
1 | aaa |
3.6. 字符串转数字
1 | num = int('123') |
4. list操作
4.1. 排序
1 | # 正向 |
4.2. 去重
- 使用set的特性去重
1 | 1, 1, 2, 2, 3, 3] a = [ |
4.3. 遍历
1 | listValues = list(xxx) |
- 普通的
for value in listValues:
无法修改list的值,list值修改只能用index的方式
4.4. 索引
- 没有冒号就是单纯找下标
1 | 1, 2, 3, 4, 5, 6] a = [ |
- 单冒号输出数组
1 | 1, 2, 3, 4, 5, 6] a = [ |
- 双冒号相当于在后面加了一个间隔
1 | 1, 2, 3, 4, 5, 6] a = [ |
4.5. 过滤
1 | data = [item for item in data if item > 10] |
4.6. 处理另一个list的某个值生成新的list
1 | data = [item["key"] for item in arr] |
4. 类
4.1. 类的几个特殊函数
1. 构造函数
1 | class Test(object): |
2. 字符串输出
- 将类作为字符串时,会自动调用此函数输出
1 | class Test(object): |
4.2. 多态
1. 虚函数
1 | from abc import abstractmethod |
5. set 集合
5.1. 基本操作
1 | ########## 初始化 ########## |
6. 函数
6.1. lambda 匿名函数
1 | lambda arg1, arg2, ...argN : expression using arguments |
注意
- lambda 函数不能包含命令,包含的表达式不能超过一个。不要试图向 lambda 函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。
- 就lambda而言,它并没有给程序带来性能上的提升,它带来的是代码的简洁。
6.2. 不定参数
7. try 异常处理
try-except-else
1 | try: |
try-finally
1 | try: |
raise触发异常
形式
1 | raise [Exception [, args [, traceback]]] |
实例
1 | #!/usr/bin/python |
输出
1 | 1 Invalid level! |
用户自定义异常
通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。
1 | class Networkerror(RuntimeError): |
8. with 上下文
with是什么
with处理相当于try-finally
1 | file = open("/tmp/foo.txt") |
with怎么工作
基本思想是with所求值的对象必须有一个__enter__()
方法,一个__exit__()
方法。
紧跟with后面的语句被求值后,返回对象的__enter__()
方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()
方法。
实例
1 | #!/usr/bin/env python |
输出
1 | In __enter__() |
9. print 打印操作
9.1. 一些基本操作
\r
: 将光标定位到行首\b
: 光标前移一个字符end=""
: 参数end控制结束符
10. import 导入模块
- 导入会先找脚本所在同级目录,再去找系统path下
10.1. 使用字符串导入
1 | mod_name = "json" |
11. 文件操作
11.1. 文件读取
- 读取成字符串,使用
r
- 读取成二进制,使用
rb
(1) read()方法
- 返回string到变量中,会读取所有内容
- 比较占用内存
1 | with open('aa', 'r') as f: |
(2) readline()方法
- 每次只读一行
- 比较慢
1 | with open('aa', 'r') as f: |
(3) readlines()方法
- 一次全部读取,按照换行返回list
1 | with open('aa', 'r') as f: |
(4) 直接对f进行遍历
1 | with open('aa', 'r') as f: |
12. 内置函数
(1) 进制转换
10进制转其他进制
1 | hex(446) |
其他进制转10进制
1 | int('0x1be', 16) |
或者
1 | 0x1be a= |
(2) locals() 获取本地变量dict
判断变量是否定义
1 | if 'aaa' in locals().keys(): |
(3) isinstance() 类型比较函数
- pylint不建议使用
type(xxx) == type("")
的格式判断特定的类型
1 | if isinstance("aaa", str): |
13. dict操作
1) dict合并
1 | dict1 = {"a": 1, "b": 2} |
2) 遍历
1 | for key, value in dict1.items(): |
14. bytes 字节序列
14.1. 和str相互转化
1 | with open('base64data.txt', 'rb') as f: |
1 | b'1234' |
三、系统内置module介绍
1. 操作系统组件 os
1.1. 路径相关操作
(1) 获取当前路径
1 | import os |
(2) 改变当前路径
1 | import os |
(3) 遍历目录
此命令会遍历目录下的所有文件包括子文件
1 | import os |
1.2. 调用可执行文件
(1) 获取输出结果
1 | import os |
(2) 获取返回值
1 | import os |
2. 系统组件 sys
内置常量
1 | import sys |
3. json
3.1. json.loads() 字符串转dict
1 | import json |
3.2. json.dumps() dict转json
原型
1 | def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, |
实例
1 | import json |
4. 加载C/C++的so库 ctypes
4.1. 基本操作
1 |
5. 时间库 time
5.1. 当前时间操作
1 | import time |
5.2. struct_time操作
1 | import time |
5.3. sleep 睡眠
1 | # 睡眠1.5s |
6. math 数学库
6.1. 取整
1 | import math |
7. hashlib hash算法库
7.1. sha256
(1) 计算文件的sha256值
1 | import hashlib |
8. functools 内置的一些函数
8.1. reduce
- 就是python2的reduce
- 第一个x和y为前两个元素,计算结果作为下一个x,下一个元素作为y
1 | import functools |
9. base64 库
9.1. base64编码解码
1 | import base64 |
10. shutil
10.1. 拷贝文件
1 | shutil.copy('./aaa.txt', './aaa_copy.txt') |
10.2. 重命名/移动
1 | shutil.move('./aaa.txt', './aaa_move.txt') |
10.3. 删除文件
1 | # 删除空目录,非空会报错 |
四、好用的module推荐
module对应pack
module | pack |
---|---|
cv2 | opencv-python |
PIL | pillow |
dns | dnspython |
1. 数据处理
数据处理相关(pandas、numpy等)的在另一篇博客详解
2. 压缩
2.1. zip格式
1) 创建压缩
1 | import zipfile |
压缩目录下的所有文件带路径
1 | import zipfile |
2) 读取压缩包
1 | import zipfile |
3) 解压
1 | import zipfile |
3. 汉字转拼音 xpinyin
简单用例
1 | import xpinyin |
4. 参数解析器 argparse
很方便的管理命令行参数,支持选项添加
5. 文件、文件夹对比 filecmp
一个开源比较好的文件夹对比仓库: https://github.com/Pixinn/compare_folders
6. git操作 gitpython
7. url请求操作 requests
7.1. 请求基本操作
1 | import requests |
7.2. 下载文件
1 | import requests |
8. 接口测试框架 robot framework
8.1. 命令使用
1 | 执行tag为xxx的用例 |
9. 浏览器自动化操作 selenium
10. pdf编辑 PyPDF2
10.1. 删除一页pdf
1 | from PyPDF2 import PdfFileWriter, PdfFileReader |
11. pymysql mysql操作库
1 | import pymysql |
12. pyotp 谷歌totp令牌
1 | import pyotp |
13. PIL 图片处理库
13.1. 按照像素修改颜色
1 | from PIL import Image |
五、jupyter notebook
1. 清空当前输出
1 | from IPython.display import clear_output |
小技巧和踩坑记
1. 判断文件是否为二进制
1 | import codecs |
2. 动态添加PYTHONPATH
1 | import sys |
3. 跨平台文件操作需要确定编码
- windows的默认编码是gbk,如果是写文件,确定是utf8的一定要在open的时候确定是utf8编码
4. pip升级后运行失败
apt安装的pip一般只有8.1版本,而最新已经有19.1版本了,所以安装后使用pip自己更新自己
1 | pip install -U pip |
更新后执行pip -V
会报错,因为老的pip文件api和新的没对上,需要修改/usr/bin/pip
如下,主要是main
需要换成__main__
1 | #!/usr/bin/python3 |