第一章:用Pythonic方式来思考(Ⅰ)

网友投稿 264 2022-08-27


第一章:用Pythonic方式来思考(Ⅰ)

这篇文章是基于《Effective Python——编写高质量Python代码的59个有效方法》[美] 布雷特·斯拉特金 著 爱飞翔 译 这本书中的内容,写写自己在某方面的感悟,并摘录一些作为读书笔记供今后鞭策。侵删。

第 1 条:确认自己所用的Python版本

如果你现在想入手Python学习,那么就选择python3。

$ python --versionPython 2.7.8

流行的Python运行环境:CPython、Jython、IronPython、PyPy。

memo

选择什么版本Python下载?

按照我的经验来看,最好不要选择最新版本的型号,因为会有一些包并没有匹配最新版本的,可以试试3.5/3.6。

解释器的问题 我们在编写python代码时,会得到一个以.py结尾的文件,而我们需要使用解释器去执行我们的.py文件。

第 2 条:遵循PEP 8 风格指南

​​Python官方关于PEP8的规范​​

空白

使用space来表示缩进,不要使用tab。每行字符数不应该超过79。对于占据多行的长表达式来说,除了首行之外的其余各行都应该在通常的缩进级别上再加4个空格。在同一个类中,各方法之间应该用一个空行隔开。文件中的函数与类之间应该用两个空行隔开。为变量赋值的时候,在等号两边添加一个空格,其余条件下等号两边能不加空格就不要加。

memo

python中的空格和tab键不能混用 否则的话则会报类似如下的错误:

IndentationError: unindent does not match any outer indentation level

安装autopep8

pip install autopep8

本文使用的Pycharm版本如下

PyCharm 2019.3.1 (Community Edition)Build #PC-193.5662.61, built on December 19, 2019Runtime version: 11.0.5+10-b520.17 amd64VM: OpenJDK 64-Bit Server VM by JetBrains s.r.oWindows 10 10.0GC: ParNew, ConcurrentMarkSweepMemory: 974MCores: 4Registry: Non-Bundled Plugins: izhangzhihao.rainbow.brackets

File - Settings - Tools - External Tools 上图的内容如下:

Name:autoPep8Program:autopep8Arguments: --in-place --aggressive --aggressive $FilePath$Working directory: $ProjectFileDir$Output filters: $FILE_PATH$\:$LINE$\:$COLUMN$\:.*

这是未经规范化的代码:

# coding: utf-8# !/usr/bin/python"""@File : useNewTemplate.py@Author : jiaming@Modify Time: 2019/11/29 21:30@Contact : @Version : 1.0@Desciption : None"""import osimport randomimport pysnooperclass Tree(object): """ xxx. """ def __init__(self, left,right): """ 构造函数 :param left: 左节点 :param right: 右节点 """ self.left = left self.right=right pass def print_array(self): pass@pysnooper.snoop()def main(): """ 主函数 :return: """ passif __name__ == "__main__": main()

# coding: utf-8# !/usr/bin/python"""@File : useNewTemplate.py@Author : jiaming@Modify Time: 2019/11/29 21:30@Contact : @Version : 1.0@Desciption : None"""import osimport randomimport pysnooperclass Tree(object): """ xxx. """ def __init__(self, left, right): """ 构造函数 :param left: 左节点 :param right: 右节点 """ self.left = left self.right = right pass def print_array(self): pass@pysnooper.snoop()def main(): """ 主函数 :return: """ passif __name__ == "__main__": main()

命名

函数、类属性、变量:小写字母+下划线 (lowercase_underscore)受保护的类属性:以单个下划线开头 (_leading_underscore)私有的类属性:应该以两个下划线开头 (__double_leading_underscore)类与异常:采用驼峰命名法。​​百度百科:驼峰命名法​​模块级常量:大写+下划线分隔类中实例方法首个参数:默认为self就好类中的类方法的首个参数:默认为cls就好

表达式语句

判断是否为空值或是非空值,不应该采用长度判断法,应该使用条件判断,比如:

>>> l = []>>> l is NoneFalse>>> len(l) == 0True>>> l.append(1)>>> l is NoneFalse

可以参考我的这篇博文,探究None和False的区别None和False

将单行的if、while、for、except的复合语句拆分成多行完成。import语句总是应该在文件开头引入模块时采用 from…import…as…格式将引入模块按照顺序引入:标准库模块,第三方模块,自用模块。每一部分的模块均按照字母顺序排列。

第 3 条:了解bytes、str与unicode的区别

Python 3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。把Unicode字符表示为二进制数据有许多种方法,最常见的编码方式是UTF-8。 要想把Unicode字符转化成为二进制数据,就必须使用encode方法,要想把二进制数据转换成为Unicode字符,则必须使用decode方法。来看下面这个样例:

>>> s = 'a'.encode()>>> sb'a'>>> type(s)>>> s = '123'.encode()>>> sb'123'>>> s = '我喜欢Python'.encode()>>> sb'\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2Python'>>> s.decode('UTF-8')'我喜欢Python'

在Python 3中编写接受str或bytes,并返回str的方法: 以下是在交互式命令行中运行的结果。

>>> def to_str(bytes_or_str):... if isinstance(bytes_or_str, bytes):... value = bytes_or_str.decode('utf-8')... else:... value = bytes_or_str... return value...

在Python 3中编写接受str或bytes,并返回bytes的方法: 以下是在交互式命令行中运行的结果。

>>> def to_bytes(bytes_or_str):... if isinstance(bytes_or_str, str):... value = bytes_or_str.encode('utf-8')... else:... value = bytes_or_str... return value...

memo

对于操作二进制文件可能出现的问题在python 3中,如果内置的open函数获取了文件的句柄,那么请注意,该句柄​​1​​会采用UTF-8编码格式来操作文件。向文件中写入二进制数据:使用的方式为(‘wb’)而不是(‘w’)。读取数据时采用(‘rb’)而不是(‘r’)

第 4 条:使用辅助函数来代替复杂表达式

一行代码可以有多复杂?

print('\n'.join([''.join([('Love'[(x-y) % len('Love')] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]))

下图展现了它的结果。代码解释请参考我的这篇博客:心形

是一种标识符或者指针,可以理解为文件的描述符,用来指代开发者将要操作的文件。​​​↩︎​​


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 数据结构与算法系列精讲之汉诺塔
下一篇:【案例】进制转换程序(界面)(进制转换的程序)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~