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 相关文章推荐
Scrapy基于selenium结合爬取淘宝的实例讲解
Jun 13 Python
Python爬虫之网页图片抓取的方法
Jul 16 Python
python实现随机漫步算法
Aug 27 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
Mar 09 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 Python
Python 中random 库的详细使用
Jun 03 Python
Python使用BeautifulSoup4修改网页内容
May 20 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 json_encode中文乱码问题的解决办法
2013/09/09 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
Python文件操作类操作实例详解
2014/07/11 Python
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
整理Python最基本的操作字典的方法
2015/04/24 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
pycharm安装图文教程
2017/05/02 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
python实现简单银行管理系统
2019/10/25 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
Europcar意大利:汽车租赁
2019/07/07 全球购物
医院护士见习期自我鉴定
2014/04/10 职场文书
银行求职自荐信范文
2015/03/04 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
创业计划书之宠物店
2019/09/19 职场文书