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生成验证码实例
Aug 21 Python
Python生成密码库功能示例
May 23 Python
python中装饰器级连的使用方法示例
Sep 29 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
从pandas一个单元格的字符串中提取字符串方式
Dec 17 Python
python add_argument()用法解析
Jan 29 Python
Python闭包与装饰器原理及实例解析
Apr 30 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 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
使用无限生命期Session的方法
2006/10/09 PHP
php读取javascript设置的cookies的代码
2010/04/12 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
javascript 类定义的4种方法
2009/09/12 Javascript
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
Python多线程实现同步的四种方式
2017/05/02 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
Python类装饰器实现方法详解
2018/12/21 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
Python如何将装饰器定义为类
2020/07/30 Python
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
就业推荐表院系意见
2015/06/05 职场文书
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js