符合语言习惯的 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中使用HTMLParser解析html实例
Feb 08 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
Python操作json的方法实例分析
Dec 06 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
python命令行参数用法实例分析
Jun 25 Python
详解python pandas 分组统计的方法
Jul 30 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
python基于property()函数定义属性
Jan 22 Python
Python continue语句实例用法
Feb 06 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
Python中的With语句的使用及原理
Jul 29 Python
Python 解决空列表.append() 输出为None的问题
May 23 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
php+MySql实现登录系统与输出浏览者信息功能
2016/07/01 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
浅入深出Vue之自动化路由
2019/08/06 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
编写简单的Python程序来判断文本的语种
2015/04/07 Python
基于python操作ES实例详解
2019/11/16 Python
tensorflow 实现数据类型转换
2020/02/17 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
美国创意之家:BulbHead
2017/07/12 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
敬老院标语
2014/06/27 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
56句经典英文座右铭
2019/08/09 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
Html5生成验证码的示例代码
2021/05/10 Javascript
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL