符合语言习惯的 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代码真的很爽
Aug 26 Python
python使用xmlrpc实例讲解
Dec 17 Python
在Python中定义和使用抽象类的方法
Jun 30 Python
python3+dlib实现人脸识别和情绪分析
Apr 21 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
python常用函数与用法示例
Jul 02 Python
Python autoescape标签用法解析
Jan 17 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
Python自动登录QQ的实现示例
Aug 28 Python
python 代码运行时间获取方式详解
Sep 18 Python
Python 使用office365邮箱的示例
Oct 29 Python
Python OpenCV之常用滤波器使用详解
Apr 07 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
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python利用Guetzli批量压缩图片
2017/03/23 Python
Python面向对象之继承代码详解
2018/01/29 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Django组件cookie与session的具体使用
2019/06/05 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
社团活动策划书范文
2014/01/09 职场文书
2015年化验室工作总结
2015/04/23 职场文书
公司捐书倡议书
2015/04/27 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
vue中div禁止点击事件的实现
2022/04/02 Vue.js