给大家整理了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 ElementTree 基本读操作示例
Apr 09 Python
python实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
Python 绘图和可视化详细介绍
Feb 11 Python
python实现稀疏矩阵示例代码
Jun 09 Python
python删除文本中行数标签的方法
May 31 Python
python 读取txt,json和hdf5文件的实例
Jun 05 Python
python skimage 连通性区域检测方法
Jun 21 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
Django 实现外键去除自动添加的后缀‘_id’
Nov 15 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 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验证码类
2016/05/15 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
php测试kafka项目示例
2020/02/06 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
ext jquery 简单比较
2010/04/07 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
Python socket 套接字实现通信详解
2019/08/27 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
Python生成器实现简单"生产者消费者"模型代码实例
2020/03/27 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
python Zmail模块简介与使用示例
2020/12/19 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
妇科医生自荐信
2013/11/05 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
大学生求职信
2014/06/17 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python