符合语言习惯的 Python 优雅编程技巧【推荐】


Posted in Python onSeptember 25, 2018

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,下面列举一些常见的Pythonic写法。
0. 程序必须先让人读懂,然后才能让计算机执行。

“Programs must be written for people to read, and only incidentally for machines to execute.”

1. 交换赋值

##不推荐
temp = a
a = b
b = a 
##推荐
a, b = b, a # 先生成一个元组(tuple)对象,然后unpack

2. Unpacking

##不推荐
l = ['David', 'Pythonista', '+1-514-555-1234']
first_name = l[0]
last_name = l[1]
phone_number = l[2] 
##推荐
l = ['David', 'Pythonista', '+1-514-555-1234']
first_name, last_name, phone_number = l
# Python 3 Only
first, *middle, last = another_list

3. 使用操作符in

##不推荐
if fruit == "apple" or fruit == "orange" or fruit == "berry":
  # 多次判断 
##推荐
if fruit in ["apple", "orange", "berry"]:
  # 使用 in 更加简洁

4. 字符串操作

##不推荐
colors = ['red', 'blue', 'green', 'yellow']
result = ''
for s in colors:
  result += s # 每次赋值都丢弃以前的字符串对象, 生成一个新对象 
##推荐
colors = ['red', 'blue', 'green', 'yellow']
result = ''.join(colors) # 没有额外的内存分配

5. 字典键值列表

##不推荐
for key in my_dict.keys():
  # my_dict[key] ... 
##推荐
for key in my_dict:
  # my_dict[key] ...
# 只有当循环中需要更改key值的情况下,我们需要使用 my_dict.keys()
# 生成静态的键值列表。

6. 字典键值判断

##不推荐
if my_dict.has_key(key):
  # ...do something with d[key] 
##推荐
if key in my_dict:
  # ...do something with d[key]

7. 字典 get 和 setdefault 方法

##不推荐
navs = {}
for (portfolio, equity, position) in data:
  if portfolio not in navs:
      navs[portfolio] = 0
  navs[portfolio] += position * prices[equity]
##推荐
navs = {}
for (portfolio, equity, position) in data:
  # 使用 get 方法
  navs[portfolio] = navs.get(portfolio, 0) + position * prices[equity]
  # 或者使用 setdefault 方法
  navs.setdefault(portfolio, 0)
  navs[portfolio] += position * prices[equity]

8. 判断真伪

##不推荐
if x == True:
  # ....
if len(items) != 0:
  # ...
if items != []:
  # ... 
##推荐
if x:
  # ....
if items:
  # ...

9. 遍历列表以及索引

##不推荐
items = 'zero one two three'.split()
# method 1
i = 0
for item in items:
  print i, item
  i += 1
# method 2
for i in range(len(items)):
  print i, items[i]
##推荐
items = 'zero one two three'.split()
for i, item in enumerate(items):
  print i, item

10. 列表推导

##不推荐
new_list = []
for item in a_list:
  if condition(item):
    new_list.append(fn(item)) 
##推荐
new_list = [fn(item) for item in a_list if condition(item)]

11. 列表推导-嵌套

##不推荐
for sub_list in nested_list:
  if list_condition(sub_list):
    for item in sub_list:
      if item_condition(item):
        # do something... 
##推荐
gen = (item for sl in nested_list if list_condition(sl) \
      for item in sl if item_condition(item))
for item in gen:
  # do something...

12. 循环嵌套

##不推荐
for x in x_list:
  for y in y_list:
    for z in z_list:
      # do something for x & y 
##推荐
from itertools import product
for x, y, z in product(x_list, y_list, z_list):
  # do something for x, y, z

13. 尽量使用生成器代替列表

##不推荐
def my_range(n):
  i = 0
  result = []
  while i < n:
    result.append(fn(i))
    i += 1
  return result # 返回列表
##推荐
def my_range(n):
  i = 0
  result = []
  while i < n:
    yield fn(i) # 使用生成器代替列表
    i += 1
*尽量用生成器代替列表,除非必须用到列表特有的函数。

14. 中间结果尽量使用imap/ifilter代替map/filter

##不推荐
reduce(rf, filter(ff, map(mf, a_list)))
##推荐
from itertools import ifilter, imap
reduce(rf, ifilter(ff, imap(mf, a_list)))
*lazy evaluation 会带来更高的内存使用效率,特别是当处理大数据操作的时候。

15. 使用any/all函数

##不推荐
found = False
for item in a_list:
  if condition(item):
    found = True
    break
if found:
  # do something if found... 
##推荐
if any(condition(item) for item in a_list):
  # do something if found...

16. 属性(property)

=
##不推荐
class Clock(object):
  def __init__(self):
    self.__hour = 1
  def setHour(self, hour):
    if 25 > hour > 0: self.__hour = hour
    else: raise BadHourException
  def getHour(self):
    return self.__hour
##推荐
class Clock(object):
  def __init__(self):
    self.__hour = 1
  def __setHour(self, hour):
    if 25 > hour > 0: self.__hour = hour
    else: raise BadHourException
  def __getHour(self):
    return self.__hour
  hour = property(__getHour, __setHour)

17. 使用 with 处理文件打开

##不推荐
f = open("some_file.txt")
try:
  data = f.read()
  # 其他文件操作..
finally:
  f.close()
##推荐
with open("some_file.txt") as f:
  data = f.read()
  # 其他文件操作...

18. 使用 with 忽视异常(仅限Python 3)

##不推荐
try:
  os.remove("somefile.txt")
except OSError:
  pass
##推荐
from contextlib import ignored # Python 3 only
with ignored(OSError):
  os.remove("somefile.txt")

19. 使用 with 处理加锁

##不推荐
import threading
lock = threading.Lock()
lock.acquire()
try:
  # 互斥操作...
finally:
  lock.release()
##推荐
import threading
lock = threading.Lock()
with lock:
  # 互斥操作...

20. 参考

1) Idiomatic Python: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
2) PEP 8: Style Guide for Python Code: http://www.python.org/dev/peps/pep-0008/

总结

以上所述是小编给大家介绍的符合语言习惯的 Python 优雅编程技巧 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
解析Python中的二进制位运算符
May 13 Python
在Python程序中操作文件之isatty()方法的使用教程
May 24 Python
python中偏函数partial用法实例分析
Jul 08 Python
python获取元素在数组中索引号的方法
Jul 15 Python
Python中对元组和列表按条件进行排序的方法示例
Nov 10 Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Python中应该使用%还是format来格式化字符串
Sep 25 #Python
Django如何自定义分页
Sep 25 #Python
Python使用googletrans报错的解决方法
Sep 25 #Python
Python实现简单的用户交互方法详解
Sep 25 #Python
Python中反射和描述器总结
Sep 23 #Python
python3实现爬取淘宝美食代码分享
Sep 23 #Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 #Python
You might like
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
PHP 编程安全性小结
2010/01/08 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php URL验证正则表达式
2011/07/19 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
记录几个javascript有关的小细节
2007/04/02 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
探究Python中isalnum()方法的使用
2015/05/18 Python
python实现内存监控系统
2021/03/07 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
有机童装:Toby Tiger
2018/05/23 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
自荐书封面下载
2013/11/29 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
群众路线剖析材料
2014/02/02 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
党支部四风整改方案
2014/10/25 职场文书
保护校园环境倡议书
2015/04/28 职场文书
Python基础之数据结构详解
2021/04/28 Python