python 19个值得学习的编程技巧


Posted in Python onAugust 15, 2020

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

以上就是python19个值得学习的编程技巧的详细内容,更多关于python 编程技巧的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python Property属性的2种用法
Jun 21 Python
Python利用Nagios增加微信报警通知的功能
Feb 18 Python
python模块之paramiko实例代码
Jan 31 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
Python远程视频监控程序的实例代码
May 05 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
python 模拟银行转账功能过程详解
Aug 06 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
Python新手如何进行闭包时绑定变量操作
May 29 Python
Python下划线5种含义代码实例解析
Jul 10 Python
基于 Python 实践感知器分类算法
Jan 07 Python
解析python 类方法、对象方法、静态方法
Aug 15 #Python
浅谈python锁与死锁问题
Aug 14 #Python
Python3.8安装Pygame教程步骤详解
Aug 14 #Python
Python configparser模块应用过程解析
Aug 14 #Python
PyCharm 2020.2 安装详细教程
Sep 25 #Python
Python logging模块handlers用法详解
Aug 14 #Python
Python代码注释规范代码实例解析
Aug 14 #Python
You might like
10 个经典PHP函数
2013/10/17 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
javascript 冒号 使用说明
2009/06/06 Javascript
JavaScript 动态创建VML的方法
2009/10/14 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
浅谈Nodejs应用主文件index.js
2016/08/28 NodeJs
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
django删除表重建的实现方法
2019/08/28 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
python实现简易淘宝购物
2019/11/22 Python
Python装饰器用法与知识点小结
2020/03/09 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
面试求职的个人自我评价
2013/11/16 职场文书
应届毕业生个人求职自荐信
2014/01/06 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
护士自我推荐信范文
2015/03/24 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
教师评职称工作总结2015
2015/04/20 职场文书