=Start=
周末北京雾霾,没有出门,宅在家里把《编写高质量代码:改善Python程序的91个建议》这本书看了一遍,结合之前看的《Python高手之路》,回顾了一下Python中的知识点,在此记录一下:
什么样的代码才够Pythonic?
这是很难定义的。而且对于Pythonic的概念,不同的人有不同的看法。但以下几个方面还是值得参考的:
- 代码应充分体现Python自身的风格(看起来像伪码般清晰易懂);
- 对Python语法有充分理解,熟悉常见的idioms,但不应当为了使用而使用;
- 对Python标准库有充分的理解,特别是内置函数和内置数据类型;
- 学习Python不同版本提供的新特性,以及掌握它的变化趋势;
- 学习公认的Pythonic风格的代码,比如:Flask、requests等;
代码规范
使用类似于 PEP8 这样的代码规范/风格检测工具帮助学习:代码布局、注释、命名规范等方面的要求。
- http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
- http://docs.python-guide.org/en/latest/writing/style/
- http://binhminhcs.blogspot.com/2011/12/python-pythonic-pythoneer-pythonist.html
构建合理的包层次来管理module
本质上每一个Python文件都是一个模块,使用模块可以增强代码的可维护性和可重用性。但显然在大的项目中将所有的Python文件都放在一个目录下并不是一个值得推荐的做法,我们需要合理的组织项目的层次来管理模块,这就是包(package)发挥功效的地方了。
什么是包(package)呢?简单来说,包(package)即目录,但与普通目录不同,它除了包含常规的Python文件以外,还包含一个 __init__.py 文件,同时它允许嵌套。比如:
Package/__init__.py Module1.py Module2.py Subpackage/__init__.py Module1.py Module2.py
包中的模块可以通过“.”访问符进行访问,即“包名.模块名”。比如:
import Package from Package import Module1 from Package import Subpackage import Package.Subpackage from Package.Subpackage import Module1
列表解析/推导式(list comprehension)
1.代码量更少,简洁、直观清晰;
2.列表解析的效率更高(但对于大数据的处理,列表解析不是一个最佳选择,过多的内存消耗可能会导致 MemoryError ,这时还是推荐使用传统的循环进行处理);
Python性能优化的小tips
减少函数调用
==
性能: 列表解析 > for 循环 > while 循环
遍历list时,列表解析性能最优,while循环最差(需要一个外部计数器)
==
处理大数据时,尽可能使用不可变数据类型,更快 —— tuple > list
==
尽可能的创建生成器和使用yield,因为这相对于常规序列实现方式,性能更优
==
使用局部变量
局部变量性能优于全局变量,内建变量及属性查找(LEGB)
==
使用后用del删除无用对象
创建大文件的技巧
with open('large.txt', 'wb') as fp: fp.seek(1073741824-1) fp.write('\0')
Python中的新式类和古典类
''' Python中一切皆对象:字符是对象,列表是对象,内建类型(built-in type)也是对象;用户定义的类型是对象,object是对象,type也是对象。 自 Python 2.2 之后,为了弥补内建类型(built-in type)和古典类(classic classes)之间的鸿沟引入了新式类(new-style classes)。在新式类中,object是所有内建类型的基类,用户所定义的类可以继承自object也可继承自内建类型。 鸿沟:类和类型并不统一; 比如上面的 a 是古典类Class A的一个实例,那么 a.__class__ 返回 __main__.A ,type(a)返回<type 'instance'> b 是新式类Class B的一个实例,那么 b.__class__ 返回 <class '__main__.B'> ,type(b)返回<class '__main__.B'> ''' class A: pass class B(object): pass # class C(type): # pass class D(dict): pass a = A() b = B() # c = C() d = D() print type(A), type(B), type(D) #<type 'classobj'> <type 'type'> <type 'type'> print type(a), type(b), type(d) #<type 'instance'> <class '__main__.B'> <class '__main__.D'> print a.__class__, isinstance(a, object), isinstance(a, type) #__main__.A True False print b.__class__, isinstance(b, object), isinstance(b, type) #<class '__main__.B'> True False # print c.__class__, isinstance(c, object), isinstance(c, type) print d.__class__, isinstance(d, object), isinstance(d, type) #<class '__main__.D'> True False
Python中的「空」数据
- 常量 None
- 常量 False
- 任何形式的数值类型零,如 0/0L/0.0/0j
- 空的序列,如 ”/()/[]
- 空的字典,如 {}
- 当用户定义的类中定义了 nonzero() 方法和 len() 方法,并且该方法返回整数0或者布尔值False的时候。
其中常量 None 的特殊性体现在它既不是 0、False,也不是空字符串,它就是一个空值对象。其数据类型为 NoneType,遵循单例模式,是唯一的,因而不能创建 None 对象。所有赋值为None的变量都相等,并且None与任何其他非None的对象的比较结果都为False。
Python中时间戳字符串的大小比较
datetime对象自身就支持用「>/<」操作符进行比较操作
Python中将字符串转换成datetime对象的方法
>>> from datetime import datetime as dt >>> a = dt.strptime("10/12/13", "%m/%d/%y") >>> b = dt.strptime("10/15/13", "%m/%d/%y") >>> a > b False >>> a < b True >>>
- http://stackoverflow.com/questions/20365854/comparing-two-date-strings-in-python
- http://stackoverflow.com/questions/10238607/convert-string-to-datetime-in-python-and-compare-to-current-time
- http://stackoverflow.com/questions/3278999/how-can-i-compare-a-date-and-a-datetime-in-python
- https://wiki.python.org/moin/WorkingWithTime
- https://pymotw.com/2/datetime/
Python中的多行字符串
multi_line_str = """line one line two line three""" joined_line_str = ("this is an " "implicitly joined " "string")
Python中多行字符串的格式化
搜索关键字:python multi line string format
'''line {0} line {1} line {2}'''.format(1,2,3) args = (1,2,3) '''line {0} line {1} line {2}'''.format(*args) kwargs = {'arg1':1, 'arg2':2, 'arg3':3} '''line {arg1} line {arg2} line {arg3}'''.format(**kwargs)
- http://stackoverflow.com/questions/10985603/multi-line-string-with-arguments-how-to-declare
- http://stackoverflow.com/questions/2504411/proper-indentation-for-python-multiline-strings
- http://stackoverflow.com/questions/13023941/python-multiline-string-format
=EOF=
《 “Python的知识点回顾” 》 有 3 条评论
Python 中的单例模式
https://funhacks.net/2017/01/17/singleton/
单件模式——Golang实现
http://blog.cyeam.com/designpattern/2015/08/12/singleton
你真的会写单例模式吗——Java实现
http://www.tekbroaden.com/singleton-java.html
Php中的单例模式面面观
http://blog.gaoyuan.xyz/2014/04/26/singleton-pattern-in-php/
Python 字符串格式化 str.format 简介
http://kuanghy.github.io/2016/11/25/python-str-format
Python字符串格式化
http://gohom.win/2015/09/13/PyStringFormat/
`
”.format()的格式限定符
首先将格式化限定式写在{}内,:作为格式化标识开始。同样支持 [flags][width].[precision]typecode 格式化表达式,其中左中右对齐和format函数一样, 使用
In [7]: ‘{:_<8.4f}'.format(6.4)
Out[7]: '6.4000__'
In [8]: '{0:_<8.4f}'.format(6.4)
Out[8]: '6.4000__'
In [9]: '{0:8.4f}’.format(6.4)
Out[10]: ‘ 6.4000’
In [11]: ‘{0:_>8.4f}’.format(6.4)
Out[11]: ‘__6.4000’
`
Python 的练手项目有哪些值得推荐?
https://www.zhihu.com/question/29372574
The Architecture of Open Source Applications
http://www.aosabook.org/en/index.html
http://aosabook.org/blog/
https://github.com/aosabook/500lines/blob/master/README.md