给大家整理了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字符遍历的艺术
Sep 06 Python
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
python随机取list中的元素方法
Apr 08 Python
python绘制多个曲线的折线图
Mar 23 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
python二进制文件的转译详解
Jul 03 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
Python中的With语句的使用及原理
Jul 29 Python
如何在Anaconda中打开python自带idle
Sep 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
php中取得文件的后缀名?
2012/02/20 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
限制文本框输入N个字符的js代码
2010/05/13 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
JS前端广告拦截实现原理解析
2020/02/17 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
python字典多条件排序方法实例
2014/06/30 Python
Python的设计模式编程入门指南
2015/04/02 Python
python实现文件快照加密保护的方法
2015/06/30 Python
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
为什么python比较流行
2020/06/19 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
WSDL的操作类型主要有几种
2013/07/19 面试题
暑假实习求职信范文
2013/09/22 职场文书
委托书范本
2014/04/02 职场文书
生日答谢词
2015/01/05 职场文书
档案接收函格式
2015/01/30 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书