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 相关文章推荐
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
Django自定义分页效果
Jun 27 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
python 按照固定长度分割字符串的方法小结
Apr 30 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
python3中的md5加密实例
May 29 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
如何在Django项目中引入静态文件
Jul 26 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
Python实现密钥密码(加解密)实例详解
Apr 26 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
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
python redis存入字典序列化存储教程
2020/07/16 Python
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
关爱女孩行动实施方案
2014/03/13 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
2014年度个人工作总结
2014/11/07 职场文书
python 字典和列表嵌套用法详解
2021/06/29 Python
MySQL数据库 任意ip连接方法
2022/05/20 MySQL