符合语言习惯的 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程序语言快速上手教程
Jul 18 Python
python编写网页爬虫脚本并实现APScheduler调度
Jul 28 Python
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
Python控制台实现交互式环境执行
Jun 09 Python
keras 自定义loss层+接受输入实例
Jun 28 Python
Python将字典转换为XML的方法
Aug 01 Python
Python基础之数据类型知识汇总
May 18 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基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
arguments对象
2006/11/20 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
纯js实现遮罩层效果原理分析
2014/05/27 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
Python中bisect的用法
2014/09/23 Python
Python操作串口的方法
2015/06/17 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
python反转列表的三种方式解析
2019/11/08 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
易程科技软件测试笔试
2013/03/24 面试题
纪检干部现实表现材料
2014/08/21 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
无房证明范本
2014/09/17 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
合作意向书范本
2019/04/17 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers
tomcat下部署jenkins的方法
2022/05/06 Servers