前言
在上一篇《Python环境搭建及PyCharm破解使用技巧》中,我们介绍了:
- Python介绍:简介、优缺点、使用场景
- Python安装与配置:Windows、Mac、Linux下安装与环境变量配置
- PyCharm破解及使用:PyCharm破解步骤、PyCharm常见使用配置技巧
- Python多版本多环境解决方案:pyenv与venv创建虚拟环境
本篇文章将重点介绍Python的包管理规范以及如何编写优雅的PythonIC代码。
统一的编程规范为什么重要?
统一的编程规范能提高开发效率。而开发效率,关乎三类对象: 阅读者、编程者和机器。
优先级是阅读者的体验 >> 编程者的体验 >> 机器的体验。
一、Python包管理工具-pip
pip官网: https://pypi.org/project/pip/
1.pip常用命令
pip--version/-V查看pip版本pipinstallxxx安装xxx包,默认下载最新版本,pipinstallxxx==2.0.0下载安装指定版本pipdownloadxxx下载安装包,不安装pipuninstallxxx卸载包piplist查看当前系统所有已安装的包piplist-o查看已安装的包中可以升级的包列表pipsearchxxx搜索下载源中是否存在指定的包pipshowxxx查看包信息,如版本、依赖信息pipinstall--upgradepip升级pip
2.pip更改安装镜像源
pip常用的国内镜像源
- 清华:https://pypi.tuna.tsinghua.edu.cn/simple
- 阿里云:http://mirrors.aliyun.com/pypi/simple/
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
- 华中理工大学:http://pypi.hustunique.com/
- 山东理工大学:http://pypi.sdutlinux.org/
- 豆瓣:http://pypi.douban.com/simple/
pip指定临时下载源
pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simple(镜像地址) pyspider(模块名称)
pip永久指定下载源
方法一:通过本地文件方式
编辑本地pip.ini文件,填写如下内容:
方法二:通过命令行方式
pipconfigsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple/
执行完上述命令,其实也是往pip.ini文件中插入了方式一种的配置内容。
3.pip配置相关
查看镜像源配置
pipconfiglist# 查看镜像源
查看详细配置
pipconfiglist-v# 查看详细配置
在命令行通过调用记事本方式快速打开pip配置文件
pipconfigedit--editornotepad
键入命令后会自动打开记事本
4.pip包管理
查看已安装包列表
piplistinstalled
快速导出当前python环境下所有已安装的依赖包列表到指定文件
pipfreeze>requirements.txttyperequirements.txt# 查看文件内容,类似于cat命令
指定文件,批量下载到当前目录
pipdownload-rrequirements.txt-d .
查看下载后的本地文件
二、Python常用编码规范
1.Python常用编码规范类型
PEP 8
PEP 8 可以算是 Python 官方的标准编码规范。它是用于规范 Python 主发行版中的标准库的代码。所以这个编码规范是值得一看。
文档地址:https://www.python.org/dev/peps/pep-0008/
如何参照 PEP 8 编写漂亮的 Python 代码:https://realpython.com/python-pep8/
Google 的 Python 风格指南
Google 的 Python 风格也是遵循 PEP8 规范。
文档地址:http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/
Pocoo 风格指南
Pocoo 团队编码风格指南严格遵循了 PEP8 的要求,但略有一些不同之处,并进行了一定的扩展延伸。
文档地址:http://dormousehole.readthedocs.io/en/latest/styleguide.html
2.PEP 8 规范
使用pycharm内置的PEP 8
使用pycharm内置的PEP8检测器,能够自动对编码不规范的地方进行检查、指出错误,并推荐修改方式。具体位置见:Settings-Editor-Inspections-Python
使用第三方PEP8工具Autopep8
autopep8是一个命令行小工具,可以对某个文件进行代码格式化。
① 安装
pipinstallautopep8
② 代码格式化
autopep8--in-place--aggressive--aggressive<filename>
执行通过上述命令后,会自动对指定文件的编码风格进行格式化。
导入第三方工具autopep8到pycharm
① 导入autopep8到pycharm
Settings-Tools-External Tools,点击+号新创建一个tool,按照如下进行填写,其中:
- Name:工具名称,任意,取名autopep8即可;
- Group:所属组织,保持默认;
- Description:工具描述,任意;
- Program:autopep8的文件路径,在使用pip安装了autopep8后,文件路径为当前环境的Scripts/autopep8.exe,打开右边的文件夹选择autopep8.exe文件即可;
- Arguments:参数,填写:--in-place --aggressive --aggressive $FilePath$
- Working directory:工作目录,填写:$ProjectFileDir$
导入完成后:
② 格式化代码
pycharm中编码后,使用导入的autopep8工具对代码进行格式化
③ 格式化前后的内容对比
# 格式化前a=1b=3c='python'# 格式化后a=1b=3c='python'
三、代码整洁之道:编写PythonIC代码
1.python之禅:19条指导原则
- 优美胜于丑陋;
- 明了胜于晦涩;
- 简单胜于复杂;
- 复杂胜于晦涩;
- 扁平胜于嵌套;
- 间隔胜于紧凑;
- 可读性很重要;
- 特例不足以特殊到违背这些原则;
- 实用性胜过纯粹;
- 永远不要默默地忽视错误;
- 除非需要明确需要这样做;
- 面对模棱两可,拒绝猜测;
- 解决问题最直接的方法应该有一种,最好只有一种;
- 当然这是没法一蹴而就的,除非你是荷兰人;
- 做也许好过不做;
- 但不想就做还不如不做;
- 如果方案难以描述明白,那么一定是个糟糕的方案;
- 如果实现容易描述,那可能是个好方案;
- 命名空间是一种绝妙的理念,多加利用!
通过python命令行import this查看Pythonic(python之禅)
优美胜于丑陋
Python 具有语法简单、代码可读性强和命令类似英语等特点,这让编写 Python 代码比使用其他编程语言更容易、更高效。如下使用or and和|| &&构建语义相同的表达式:
示例:
# &&, ||ifa==0&&b==1||c==True: # and, orifa==0andb==1orc==True: # 这两个逻辑表达式在 Python 中是相同的# 从语义的角度来看,可以使用选择操作符来构造完全相同的表达式。
明了胜于晦涩
在 Python 中,良好的命名约定能让你的代码更清晰明了。一般来说,避免使用以下名称:
✓ 太宽泛,如my_list;
✓ 太冗长,如list_of_machine_learning_data_set;
✓ 太模糊,如“1”、“I”、“o”、“O”。
✓ Python包、模块名应该全部小写。
✓ 当需要使用多个单词时,使用下划线分割它们。
✓ 类名应遵循 UpperCaseCamelCase规范
✓ 变量、方法、函数应该采用小写(如果需要,用下划线分割)
✓ 常量名必须全大写(如果需要,用下划线分割)
简单胜于复杂
很多时候,在处理迭代器时,我们还需要保存迭代计数,Python 通过提供一个名为enumerate()的内置函数简化这一任务。以下是一种不成熟的方法和推荐方法:
示例:
words= ['A', 'B', 'C'] # 不成熟的方法index=0forwordinwords: print(index, word) index+=1# 推荐方法forindex, wordinenumerate(words): print(index, word)
2.Python常用编码规范说明
编码
◆ 如无特殊情况, 文件一律使用 UTF-8 编码
◆ 如无特殊情况, 文件头部必须加入#-*-coding:utf-8-*-标识
缩进
◆ 统一使用 4 个空格进行缩进,不建议使用TAB, 更不要TAB和空格混用。
引号
◆ 自然语言使用双引号,例如:u"你好世界"
◆ 机器标识使用单引号,例如dict里的key。
◆ 正则表达式 使用原生的双引号 r"..."
◆ 文档字符串 (docstring) 使用三个双引号 """......"""
空行
◆ 编码格式声明、模块导入、常量和全局变量声明、顶级定义和执行代码之间空两行
◆ 顶级定义之间空两行,方法定义之间空一行
◆ 在函数或方法内部,可以在必要的地方空一行以增强节奏感,但应避免连续空行
文档编排
模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
◆ 不要在一句import中多个库,比如import os, sys不推荐。
命名规范
✓ 模块尽量使用小写命名,首字母保持小写,尽量不要用下划线
✓ 类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
✓ 函数名一律小写,如有多个单词,用下划线隔开
✓ 私有函数可用一个下划线开头
✓ 变量名尽量小写, 如有多个单词,用下划线隔开
✓ 常量采用全大写,如有多个单词,使用下划线隔开
变量
使用小写字母命名函数和变量,并用下划线分隔单词,提高代码可读性。
示例:
◆ name = "Python" #变量名
◆ job_title = "Software Engineer" #带有下划线的变量名
◆ populated_countries_list = [] #带有下划线的变量名
◆ _books = {} # 变量名私有化
◆ __dict = [] # 防止python内置库中的名称混淆
函数
函数的声明和变量一样也是通过小写字母和单下划线进行连接,对于函数私有化也是和声明变量类似。
defget_data(): pass函数的开头使用单下划线,将其进行私有化def_get_data(): pass对于使用Pyton中的关键字来进行命名的函数要使用双下划线。def__path(): pass
类的命名规范
类的名称应该像大多数其他语言一样使用驼峰大小写。
classUserInformation: defget_user(id): db=get_db_connection() user=execute_query_for_user(id) returnuser
常量的命名规范
通常应该用大写字母定义常量名称
◆ TOTAL = 56
◆ TIMOUT = 6
◆ MAX_OVERFLOW = 7
代码编排
✓ 缩进。4个空格的缩进(编辑器都可以完成此功能),不要使用TAB,更不能混合使用TAB和空格。
✓ 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
✓ 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
空格的使用
◆ 总体原则,避免不必要的空格,
◆ 各种右括号前不要加空格。
◆ 逗号、冒号、分号前不要加空格。
◆ 函数的左括号前不要加空格。如Func(1)。
◆ 序列的左括号前不要加空格。如list[2]。
◆ 操作符左右各加一个空格,不要为了对齐增加空格。
◆ 函数默认参数的赋值符左右省略空格。
◆ 不要将多句语句写在同一行,尽管使用‘;’允许。
◆ if/for/while语句中,即使执行语句只有一句,也必须另起一行。
注释及文档字符串
总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。
◆ 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。
◆ 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x,但是这种方式尽量少使用。
3.Docstrings的使用
Docstrings可以在 Python 中声明代码的功能的,通常在方法,类和模块的开头使用,并且docstring是该对象的
__doc__特殊属性,一般采用“三重双引号”,下面列举在 Python 代码中编写 docstrings 的一些最佳实践 。
方法中使用docstring
defget_prime_number(): """Get list of prime numbers between 1 to 100.""""
✓ 即使字符串只有一行,也使用三重引号。
✓ 三重引号中的字符串前后不应有任何空行
✓ 使用句点(.)结束docstring中的语句
多行的docstring
defcall_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 来简要描述模块的使用,这些注释应该放在在导包之前,模块文档字符串应该表明模块的使用方法和功能。
"""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.NetworkNotFound exception if network not found."""importurllib3importjson
类级别的docstring
类docstring主要用于简要描述类的使用及其总体功能,下面列举如何编写类文档字符串。
单行类docstring
classStudent: """This class handle actions performed by a student."""def__init__(self): pass
多行类docstring
classStudent: """Student class information. This class handle actions performed by a student. This class provides information about student full name, age, roll-number and other information. Usage: import student student = student.Student() student.get_name() """def__init__(self): pass
小结
以上就是本篇文章的全部内容,下面作一个简单总结:
- Python包管理工具pip使用:更改镜像源、配置相关、批量导出/安装包;
- Python常用编码规范:常见编码规范类型、PEP8规范以及如何使用pycharm内置的PEP8、pycharm中导入第三方PEP8工具autopep8;
- 编写PythonIC代码:Python之禅的19条指导原则、常用编码规范说明(编码&缩进&引号&空行等的使用,以及变量&函数&类&常量等的命名规范)