给大家整理了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 相关文章推荐
Eclipse + Python 的安装与配置流程
Mar 05 Python
Python中使用装饰器和元编程实现结构体类实例
Jan 28 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
python机器学习之神经网络实现
Oct 13 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
Python3数字求和的实例
Feb 19 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
深入学习python多线程与GIL
Aug 26 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
Python爬虫回测股票的实例讲解
Jan 22 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相关资料
2006/10/09 PHP
PHP新手上路(五)
2006/10/09 PHP
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
php源码的安装方法和实例
2019/09/26 PHP
phpStorm2020 注册码
2020/09/17 PHP
JS 遮照层实现代码
2010/03/31 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python实现PID算法及测试的例子
2019/08/08 Python
python中树与树的表示知识点总结
2019/09/14 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
通过cmd进入python的步骤
2020/06/16 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
《长江之歌》教学反思
2014/04/17 职场文书
公证委托书
2014/08/01 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
批评与自我批评范文
2014/10/15 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android