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实现探测socket和web服务示例
Mar 28 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
python for 循环获取index索引的方法
Feb 01 Python
python实现websocket的客户端压力测试
Jun 25 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
python爬虫用mongodb的理由
Jul 28 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 Python
Python快速实现一键抠图功能的全过程
Jun 29 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
解析ajax事件的调用顺序
2013/06/17 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
python素数筛选法浅析
2018/03/19 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
详解如何设置Python环境变量?
2019/05/13 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
应届生高等护理求职信
2013/10/12 职场文书
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python