引用
一个程序员的微站
一,概述
Programs must be written for people to read , and only incidentally for machines to execute.
-Harold Abelson, Structure and Interpretation of Computer Programs(计算机程序的构造和解释)
要写出Pythonic 优雅的,道地的,整洁的代码,需要平时多观察大牛代码,
Github上的requests, flask , tornado 等优秀源代码是学习对象,下面是一些总结的常见的pythonic写法
一份优雅简洁的代码通常自带文档和注释属性,读代码就是读作者的思路
python 开发中很少像Java一样遵循某种设计模式作为开发原则中应用于系统中
代码清晰是最终目的
二,Pythonic集锦
1 变量交换
大部分编程语言交换两个变量的值,不得不引入一个临时变量
2 循环遍历区间元素
xrange 返回的是生成器对象,生成器比列表更加节省内存,
需要注意xrange是python 2的写法, python3中只有range 方法,特点和xrange一样
3 带有索引位置的集合遍历
遍历集合时候需要使用到集合的索引位置,直接对集合迭代没有索引信息,
4 字符串连接
字符串连接时候,普通的方式可以用 + 操作
join 是一种更加高效的字符串连接方式,使用+操作时候,
每执行一次+操作在内存中生成一个新的字符串对象,
遍历8次有8个字符串生成,造成无谓的内存浪费
用join 方法整个过程中只会生成一个字符串对象
5 打开/关闭 文件
执行文件操作时候,最后一定不能忘记关闭文件,即使报错了也要close,
普通的方法是在finnally 块中显示的调用close()方法
使用with 语句,系统会在执行玩文件操作后,自动关闭文件对象
6 列表推导式
能够使用一行代码简明扼要的解决问题时候,不要使用两行
与之类似的还有生成器表达式,字典推导式
7 善用装饰器
装饰器可以把与业务逻辑无关的代码抽离出来,让代码保持干净清爽,
而且装饰器还能被多个地方重复使用, 比如一个爬虫网页的函数
如果该URL曾经被爬过就直接从缓存中获取,否则爬下来之后加入到缓存,
防止后续重复爬取
使用装饰器写代码表面上感觉代码量更多,但是它把缓存相关的逻辑抽离出来了
可以给更多的函数调用,这样总的代码量减少,而且业务看起来简洁
8 合理使用列表
列表对象list 是一个查询效率高于更新操作的数据结构,
例如删除一个元素和插入一个元素的执行效率非常低,因为要对剩下的元素进行移动
deque 是一个双向队列的数据结构,删除元素和插入元素会很快
9 序列解包
10 遍历字典的key 和 value
方法一速度没有那么快,因为每一次迭代时候还要重新进行hash查找key 对应的value
方法二遇到字典非常大的时候,会导致内存的消耗增加一倍以上
iteritems 返回迭代器对象,可以节省更多的内存,
不过在python3中没有该方法了,只有items方法,作用等价于iteritems
11, 链式比较操作
链式比较操作 False == False == True 等价于 False == False and False == True
所以输出结果是False
12, if/else 三目运算
在类C的语言中都支持三目运算b ? x: y , Python 之禅
There should be one -- and preferably only one --obvious way to do it.
能够使用if/else 清晰表达逻辑时候,就没有必要在额外新增一种方式来实现
13,真值判断
检查某个对象是否是真值, 显示地使用True 和 False 作比较多此一举,不专业
14,for/else 语句
for else 是Python 特有的语法格式,else 中的代码在for 循环遍历完所有元素之后执行
15,字符串格式化
很难说用format 比用%s 的代码少,但是format 更加易于理解
16,列表切片
获取列表中的部分元素最先想到的是用for 循环根据条件提取元素,这也是其他语言中
管用的手段,但是python中有强大的切片功能
列表元素的下标不仅可以用正数表示,还可以用负数表示,最后一个元素的位置是-1,
从右到左,依次递减
17,善用生成器
上面是用生成器生成斐波那契数列,生成器的好处是无需一次性将所有的元素
加载到内存,只有迭代获取元素的时候才返回元素,
而列表预先一次性把全部的元素加载到内存,
此外使用yield,代码看起来更加简洁
18,获取字典元素
19,预设字典默认值
通过key 分组时候,不得不每次都检查key 是否已经存在于字典中
20,字典推导式
在python2.7之前,构建字典对象一般使用下面这种方式,可读性非常差
字典推导式是python2.7新增的特性, 可读性增强了很多,类似的还有列表推导式和集合推导式