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 相关文章推荐
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
深入理解Python变量与常量
Jun 02 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
python删除过期log文件操作实例解析
Jan 31 Python
python查询mysql,返回json的实例
Mar 26 Python
详解Python3 基本数据类型
Apr 19 Python
简单了解python PEP的一些知识
Jul 13 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 Python
python实现简单的学生管理系统
Feb 22 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过滤危险html代码
2008/08/18 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
PHP时间函数使用详解
2019/03/21 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
Python-基础-入门 简介
2014/08/09 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
Python中内建函数的简单用法说明
2016/05/05 Python
python编程实现希尔排序
2017/04/13 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
简单的Python调度器Schedule详解
2019/08/30 Python
美国网上订购鲜花:FTD
2016/09/23 全球购物
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
党校培训思想汇报
2013/12/30 职场文书
执行总经理岗位职责
2014/02/03 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
安全责任书范文
2014/08/25 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
2014年统战工作总结
2014/12/09 职场文书
委托函范文
2015/01/29 职场文书
六一活动主持词
2015/06/30 职场文书
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers