给大家整理了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 专题二 条件语句和循环语句的基础知识
Mar 19 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
浅谈dataframe中更改列属性的方法
Jul 10 Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 Python
用python做游戏的细节详解
Jun 25 Python
python flask几分钟实现web服务的例子
Jul 26 Python
python3调用windows dos命令的例子
Aug 14 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
Django Auth用户认证组件实现代码
Oct 13 Python
用python发送微信消息
Dec 21 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
php关联数组快速排序的方法
2015/04/17 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python中for循环详解
2014/01/17 Python
python求斐波那契数列示例分享
2014/02/14 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
python utc datetime转换为时间戳的方法
2019/01/15 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
公司企业表扬信
2014/01/11 职场文书
班主任工作年限证明
2014/01/12 职场文书
有关打架的检讨书
2014/01/25 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书