代码这样写更优雅python

引用
一个程序员的微站

一,概述

Programs must be written for people to read , and only incidentally for machines to execute.
Harold Abelson, Structure and Interpretation of Computer Programs(计算机程序的构造和解释)

代码这样写更优雅python_第1张图片
要写出Pythonic 优雅的,道地的,整洁的代码,需要平时多观察大牛代码,

Github上的requests, flask , tornado 等优秀源代码是学习对象,下面是一些总结的常见的pythonic写法
一份优雅简洁的代码通常自带文档和注释属性,读代码就是读作者的思路
python 开发中很少像Java一样遵循某种设计模式作为开发原则中应用于系统中
代码清晰是最终目的

二,Pythonic集锦

1 变量交换

大部分编程语言交换两个变量的值,不得不引入一个临时变量

代码这样写更优雅python_第2张图片

2 循环遍历区间元素

代码这样写更优雅python_第3张图片

xrange 返回的是生成器对象,生成器比列表更加节省内存,
需要注意xrange是python 2的写法, python3中只有range 方法,特点和xrange一样


3 带有索引位置的集合遍历

遍历集合时候需要使用到集合的索引位置,直接对集合迭代没有索引信息,

代码这样写更优雅python_第4张图片

4 字符串连接

字符串连接时候,普通的方式可以用 + 操作
join 是一种更加高效的字符串连接方式,使用+操作时候,
每执行一次+操作在内存中生成一个新的字符串对象,
遍历8次有8个字符串生成,造成无谓的内存浪费
用join 方法整个过程中只会生成一个字符串对象

代码这样写更优雅python_第5张图片

5 打开/关闭 文件

执行文件操作时候,最后一定不能忘记关闭文件,即使报错了也要close,
普通的方法是在finnally 块中显示的调用close()方法
使用with 语句,系统会在执行玩文件操作后,自动关闭文件对象

代码这样写更优雅python_第6张图片

6 列表推导式

能够使用一行代码简明扼要的解决问题时候,不要使用两行
与之类似的还有生成器表达式,字典推导式

代码这样写更优雅python_第7张图片

7 善用装饰器

装饰器可以把与业务逻辑无关的代码抽离出来,让代码保持干净清爽,
而且装饰器还能被多个地方重复使用, 比如一个爬虫网页的函数
如果该URL曾经被爬过就直接从缓存中获取,否则爬下来之后加入到缓存,
防止后续重复爬取

代码这样写更优雅python_第8张图片

使用装饰器写代码表面上感觉代码量更多,但是它把缓存相关的逻辑抽离出来了
可以给更多的函数调用,这样总的代码量减少,而且业务看起来简洁


8 合理使用列表

列表对象list 是一个查询效率高于更新操作的数据结构,
例如删除一个元素和插入一个元素的执行效率非常低,因为要对剩下的元素进行移动

代码这样写更优雅python_第9张图片

deque 是一个双向队列的数据结构,删除元素和插入元素会很快


9 序列解包

代码这样写更优雅python_第10张图片

10 遍历字典的key 和 value

方法一速度没有那么快,因为每一次迭代时候还要重新进行hash查找key 对应的value
方法二遇到字典非常大的时候,会导致内存的消耗增加一倍以上

代码这样写更优雅python_第11张图片

iteritems 返回迭代器对象,可以节省更多的内存,
不过在python3中没有该方法了,只有items方法,作用等价于iteritems


11, 链式比较操作

代码这样写更优雅python_第12张图片

链式比较操作 False == False == True 等价于 False == False and False == True
所以输出结果是False


12, if/else 三目运算

代码这样写更优雅python_第13张图片

在类C的语言中都支持三目运算b ? x: y , Python 之禅

There should be one -- and preferably only one --obvious way to do it.

能够使用if/else 清晰表达逻辑时候,就没有必要在额外新增一种方式来实现


代码这样写更优雅python_第14张图片

13,真值判断

检查某个对象是否是真值, 显示地使用True 和 False 作比较多此一举,不专业

代码这样写更优雅python_第15张图片

14,for/else 语句

for else 是Python 特有的语法格式,else 中的代码在for 循环遍历完所有元素之后执行

代码这样写更优雅python_第16张图片

15,字符串格式化

很难说用format 比用%s 的代码少,但是format 更加易于理解

代码这样写更优雅python_第17张图片

16,列表切片

获取列表中的部分元素最先想到的是用for 循环根据条件提取元素,这也是其他语言中
管用的手段,但是python中有强大的切片功能
列表元素的下标不仅可以用正数表示,还可以用负数表示,最后一个元素的位置是-1,
从右到左,依次递减

代码这样写更优雅python_第18张图片

17,善用生成器

代码这样写更优雅python_第19张图片

上面是用生成器生成斐波那契数列,生成器的好处是无需一次性将所有的元素
加载到内存,只有迭代获取元素的时候才返回元素,
而列表预先一次性把全部的元素加载到内存,
此外使用yield,代码看起来更加简洁


18,获取字典元素

代码这样写更优雅python_第20张图片

19,预设字典默认值

通过key 分组时候,不得不每次都检查key 是否已经存在于字典中

代码这样写更优雅python_第21张图片

20,字典推导式

在python2.7之前,构建字典对象一般使用下面这种方式,可读性非常差

代码这样写更优雅python_第22张图片

字典推导式是python2.7新增的特性, 可读性增强了很多,类似的还有列表推导式和集合推导式

你可能感兴趣的:(代码这样写更优雅python)