给大家整理了19个pythonic的编程习惯(小结)


Posted in Python onSeptember 25, 2019

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:
  # 互斥操作...

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python下os模块强大的重命名方法renames详解
Mar 07 Python
pyqt5简介及安装方法介绍
Jan 31 Python
Python遍历numpy数组的实例
Apr 04 Python
TensorFlow实现简单卷积神经网络
May 24 Python
Flask之请求钩子的实现
Dec 23 Python
pycharm重命名文件的方法步骤
Jul 29 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
Python的控制结构之For、While、If循环问题
Jun 30 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
python中requests库+xpath+lxml简单使用
Apr 29 Python
Python实现双向链表基本操作
May 25 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 #Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 #Python
python super的使用方法及实例详解
Sep 25 #Python
Pycharm+Python+PyQt5使用详解
Sep 25 #Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 #Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 #Python
Python实现串口通信(pyserial)过程解析
Sep 25 #Python
You might like
php实现mysql同步的实现方法
2009/10/21 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
js的一些常用方法小结
2011/06/29 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
python模块导入的细节详解
2018/12/10 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
Python callable内置函数原理解析
2020/03/05 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
python二维图制作的实例代码
2020/12/03 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
电子信息专业学生自荐信
2013/11/09 职场文书
酒店节能降耗方案
2014/05/08 职场文书
心理咨询承诺书
2014/05/20 职场文书
2014年度党员自我评议
2014/09/13 职场文书
质量保证书格式模板
2015/02/27 职场文书
小学思品教学反思
2016/02/20 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python