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实现简单QQ单用户机器人的方法
Jul 03 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
pandas 读取各种格式文件的方法
Jun 22 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
python学习之panda数据分析核心支持库
May 07 Python
Python socket如何解析HTTP请求内容
Feb 12 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
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
php学习笔记 PHP面向对象的程序设计
2011/06/13 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
Python字符串转换成浮点数函数分享
2015/07/24 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
python 自动重连wifi windows的方法
2018/12/18 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
实例代码讲解Python 线程池
2020/08/24 Python
用python对oracle进行简单性能测试
2020/12/05 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
毕业生自我鉴定
2013/11/05 职场文书
财务会计自荐信范文
2014/02/21 职场文书
保险公司晨会主持词
2014/03/22 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
惊天动地观后感
2015/06/10 职场文书
中秋节感想
2015/08/10 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python