1. Python 包管理

官网地址:https://pypi.org/project/pip/

pip 是 Python 中常用的软件包管理工具(安装,升级,卸载等),跟 CentOS 中 yum 类似。Python2.7.9+ 或 Python3.4+ 以上版本都自带 pip 工具。

1.1 常用命令

命令 功能
pip –version/-V 显示当前 pip 版本
pip help [install] 查看 install 命令的帮助手册
pip install xxx yyy 安装软件包,可以指定版本进行安装
pip download xxx 下载软件包
pip uninstall xxx 卸载软件包
pip list 查看当前系统上已经安装的软件包
pip list -o 查看可升级的软件包
pip install –upgrade/-U pip 对 pip 进行升级操作
pip show xxx 显示安装包信息

1.2 常用的国内镜像源

命令 功能
阿里云 https://mirrors.aliyun.com/pypi/simple/
豆瓣 http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
华中科技大学 http://pypi.hustunique.com/

命令行下载

我们可以通过在 pip install 后面加上镜像源地址来提升下载速度,例如我从阿里云的镜像源来下载 django:

1
pip install -i https://mirrors.aliyun.com/pypi/simple/ django

将以上的 替换为你的包名即可,注意指定私有源时别忘了加上 simple,否则找不到版本。

默认配置

如果不想每次下载都加上地址的话,则可以设置永久的镜像源:

  • 在 linux 和 mac 下,需要在 ~/.pip 路径下找到 pip.conf 文件
  • 在 windows 下,需要在用户目录下的 pip 文件夹中找到 pip.ini 文件

然后在文件中修改镜像源地址,例如下面我修改成清华大学的镜像源。

1
2
3
4
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn

或

1
2
3
4
5
6
7
8
9
10
11
12
[global]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple/
extra-index-url=
http://pypi.douban.com/simple
http://mirrors.aliyun.com/pypi/simple/
http://pypi.mirrors.ustc.edu.cn/simple/
[install]
trusted-host=
pypi.douban.com
mirrors.aliyun.com
pypi.tuna.tsinghua.edu.cn
pypi.mirrors.ustc.edu.cn

另外,也可以通过 pip config get global.index-url 命令查看当前使用的镜像源地址,然后可以通过 pip config set global.index-url xxx 命令直接进行设置。

1.3 导出依赖包

如果我们想保存当前虚拟环境所依赖的包然后复制到其它虚拟环境使用的话,则可以使用如下命令:

1
pip freeze > requirements.txt

这样我们就可以在目录下获得到一个 requirements.txt 文件,里面存放着该虚拟环境用到的依赖包。

我们可以复制这个 requirements.txt 文件到其它虚拟环境中的目录下,然后执行下面的命令:

1
pip install -r requirements.txt

这样其它的虚拟环境也可以复制我当前虚拟环境用到的依赖包,从而快速配置好所需的开发环境。

2. 编码规范工具

2.1 知名规范

  • PEP 8

文档地址:https://www.python.org/dev/peps/pep-0008/

如何参照 PEP 8 编写漂亮的 Python 代码:https://realpython.com/python-pep8/

PEP 8 可以算是 Python 官方的标准编码规范,它是用于规范 Python 主发行版中的标准库的代码,所以这个编码规范是值得一看。

  • Google 的 Python 风格指南

文档地址:https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/

Google 的 Python 风格也是遵循 PEP 8 规范。

  • Pocoo 风格指南

文档地址:http://m.phperz.com/article/15/0824/150978.html

Pocoo 团队编码风格指南严格遵循了 PEP 8 的要求,但略有一些不同之处,并进行了一定的扩展延伸。

2.2 PEP 8

  • PyCharm IDE 内置 PEP 8 检测器

PyCharm 已经内置了 PEP 8 规范检测器,它会自动对编码不规范的地方进行检查,然后指出错误,并推荐修改方式。

  • 安装第三方 PEP 8 工具

Autopep8 是一个将 Python 代码自动排版为 PEP 8 风格的小工具,它使用 PEP 8 工具来决定代码中的哪部分需要被排版。

打开终端,使用 pip 命令安装 Autopep8:

Autopep8 是一个命令行工具,可以对某个文件进行代码格式化,命令如下:

2.3 PyCharm IDE 配置集成 Autopep8

PyCharm 配置 Autopep8 方法如下。

第一步:”Settings” -> “Tools” -> “External Tools” -> 点击加号添加工具,然后输入下列信息:

  • Name:autopep8
  • Tools settings:
    • Programs:autopep8(如果不行,就输入程序安装路径全名比如 /Users/venv/bin/autopep8)
    • Parameters:–in-place –aggressive –aggressive $FilePath$
    • Working directory:$ProjectFileDir$

      第二步:在想要进行代码格式化的文件中鼠标右键,在 “External Tools” 选项下找到刚刚配置好的 “autopep8” 工具。

3. 编码规范

3.1 Python 之禅:19 条指导原则

  1. 优美胜于丑陋;
  2. 明了胜于晦涩;
  3. 简单胜于复杂;
  4. 复杂胜于晦涩;
  5. 扁平胜于嵌套;
  6. 间隔胜于紧凑;
  7. 可读性很重要;
  8. 特例不足以特殊到违背这些原则;
  9. 实用性胜过纯粹;
  10. 永远不要默默地忽视错误;
  11. 除非明确需要这样做;
  12. 面对模棱两可,拒绝猜测;
  13. 解决问题最直接的方法应该有一种,最好只有一种;
  14. 当然这是没法一蹴而就的,除非你是荷兰人;
  15. 做也许好过不做;
  16. 但不想就做还不如不做;
  17. 如果方案难以描述明白,那么一定是个糟糕的方案;
  18. 如果实现容易描述,那可能是个好方案;
  19. 命名空间是一种绝妙的理念,多加利用!

优美胜于丑陋

Python 具有语法简单、代码可读性强和命令类似英语等特点,这让编写 Python 代码比使用其他编程语言更容易、更高效。

重构前:

1
2
3
if a:
if b:
return c

重构后:

1
2
if a and b:
return c

明了胜于晦涩

在 Python 中,良好的命名约定能让你的代码更清晰明了。

一般来说,避免使用以下名称:

  • 太宽泛,如 my_list

  • 太冗长,如 list_of_machine_learning_data_set

  • 太模糊,如 “1”、”I”、”o”、”O”

  • Python 包、模块名应该全部小写

  • 当需要使用多个单词时,使用下划线分割它们

  • 类名应遵循 UpperCaseCamelCase 规范

  • 变量、方法、函数应该采用小写(如果需要,用下划线分割)

  • 常量名必须全大写(如果需要,用下划线分割)

    **一切都必须清晰易懂。

简单胜于复杂

重构前:

1
2
3
4
5
6
if sold > DISCOUNT_AMOUNT:
total = sold + DISCOUNT_PRICE
label = f'Total: {total}'
else:
total = sold * PRICE
label = f'Total: {total}'

重构后:

1
2
3
4
5
if sold > DISCOUNT_AMOUNT:
total = sold + DISCOUNT_PRICE
else:
total = sold * PRICE
label = f'Total: {total}'

重构前:

1
2
3
4
5
6
7
def process_payment(payment):
if payment.currency == 'USD':
process_standard_payment(payment)
elif payment.currency == 'EUR':
process_standard_payment(payment)
else:
process_international_payment(payment)

重构后:

1
2
3
4
5
def process_payment(payment):
if payment.currency == 'USD' or payment.currency == 'EUR':
process_standard_payment(payment)
else:
process_international_payment(payment)

3.2 常用编码规范

  1. 编码

    • 如无特殊情况,文件一律使用 UTF-8 编码
    • 如无特殊情况,文件头部必须加入 #-*-coding:utf-8-*- 标识
  2. 缩进

    • 统一使用 4 个空格进行缩进,不建议使用 TAB,更不要 TAB 和空格混用。
  3. 引号

    • 自然语言使用双引号,例如:u” 你好世界 “
    • 机器标识使用单引号,例如:dict 里的 key,即 dict[‘key’] = value
    • 正则表达式使用原生的双引号 r”…”
    • 文档字符串(docstring)使用三个双引号 “””……”””
  4. 空行

    • 编码格式声明、模块导入、常量和全局变量声明、顶级定义和执行代码之间空两行
    • 顶级定义之间空两行,方法定义之间空一行
    • 在函数或方法内部,可以在必要的地方空一行以增强节奏感,但应避免连续空行
  5. 文档编排

    模块内容的顺序:模块说明和 docstring - import - globals (全局变量) & constants (常量) - 其他定义。其中 import 部分,又按标准库(内置库)、第三方库(扩展库)和自己编写顺序依次排放,之间空一行。

    • 不要在一句 import 多个库,比如 import os,sys 不推荐。
  6. 命名规范

    • 模块尽量使用小写命名,首字母保持小写;包名尽量不要用下划线分隔
    • 类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
    • 函数名一律小写,如有多个单词,用下划线隔开
    • 私有函数可用一个下划线开头
    • 变量名尽量小写,如有多个单词,用下划线隔开
    • 常量采用全大写,如有多个单词,使用下划线隔开

3.3 常用规范示例

  • 变量和函数

使用小写字母命名函数和变量,并用下划线分隔单词,提高代码可读性。

示例:

1
2
3
name = "Python" #变量名
job_title = "Software Engineer" #带有下划线的变量名
populated_countries_list = [] #带有下划线的变量名
  • 下划线定义
    在 Python 中,有以下几种方式来定义变量:
    • xx:公有变量
    • _xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import * 禁止导入
    • __xx:双前置下划线,私有化属性或方法,无法在外部直接访问
    • __xx__:双前后下划线,系统定义名字,例如 __init__
    • xx_:单后置下划线,用于避免与 Python 关键词的冲突
  • 函数

函数的声明和变量一样也是通过小写字母和单下划线进行连接,对于函数私有化也是和声明变量类似。

1
2
def get_data():
pass

函数的开头使用单下划线,将其进行私有化。

1
2
def get_data():
pass
  • 类的命名规范

类的名称应该像大多数其他语言一样使用驼峰大小写。

1
2
3
4
5
class UserInformation:
def get_user(id):
db = get_db_connection()
user = execute_query_for_user(id)
return user
  • 常量的命名规范

通常应该用大写字母定义常量名称。

1
2
3
TOTAL = 56
TIMOUT = 6
MAX_OVERFLOW = 7
  • 空格的使用

    • 总体原则,避免不必要的空格
    • 各种右括号前不要加空格
    • 逗号、冒号、分号前不要加空格
    • 函数的左括号前不要加空格,如 Func (1)
    • 数组的左括号前不要加空格,如 list [2]
    • 函数默认参数的赋值符左右省略空格
  • 注释及文档字符串

    总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符。

    • 块注释,在一段代码前增加的注释,在 # 后加一空格。
    • 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x,但是这种方式尽量少使用。

3.4 代码整洁之道:编写 Pythonic 代码

docstrings 文档字符串通常在方法,类和模块的开头使用,并且 docstring 是该对象的 __doc__ 特殊属性,一般采用 “ 三重双引号 “,下面列举在 Python 代码中编写 docstrings 的一些最佳实践。

  • 单行 docstring
    • 即使字符串只有一行,也使用三重引号
    • 三重引号中的字符串前后不应有任何空行
    • 使用句点 (.) 结束 docstring 中的语句
1
2
def get_prime_number():
"""Get list of prime numbers between 1 to 100.""""
  • 多行的 docstring
    • 第一行是函数或类的简要描述
    • 每一行语句的末尾有一个句号
    • 文档字符串中的简要描述和摘要之间有一行空白
1
2
3
4
5
6
7
8
9
10
11
12
def call_weather_api(url,location):
"""
Get the weather of specific location.

Calling weather api to check for weather by using weather api and location. Make sure you provide city name only, country and county names won't be accepted and will throw exception if not found the city name.

:param url:URL of the api to get weather.
:type url: str
:param location:Location of the city to get the weather.
:type location: str
:return: Give the weather information of given location.
:rtype: str"""
  • 模块级别的 docstring

一般在文件的顶部放置一个模块级的 docstring 来简要描述模块的使用,这些注释应该放在在导包之前,模块文档字符串应该表明模块的使用方法和功能。

1
2
3
4
5
6
7
8
9
10
11
12
"""
This module contains all of the network related requests.
This module will check for all the exceptions while making the network
calls and raise exceptions for any unknown exception.
Make sure that when you use this module,
you handle these exceptions in client code as:
NetworkError exception for network calls.
NetworkNot Found exception if network not found.
"""

import urllib3
import json
  • 类级别的 docstring

类 docstring 主要用于简要描述类的使用及其总体功能,下面列举如问编写类文档字符串。

单行类 docstring

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Student:
"""
Student class information.

This class handle actions performed by a student.
This class provides information about student full name, agoe,
roll-number and other information,
Usage:
import student
student = student.Student()
student.get_name()
"""
def __init__(self):
pass

多行类 docstring

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Student:
"""
Student class information.

This class handle actions performed by a student.
This class provides information about student full name, agoe,
roll-number and other information,
Usage:
import student
student = student.Student()
student.get_name()
"""
def __init__(self):
pass

统一的编程规范能提高开发效率。而开发效率,关乎三类对象:阅读者、编程者和机器。

优先级是:阅读者的体验 >> 编程者的体验 >> 机器的体验。