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网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
python交互式图形编程实例(一)
Nov 17 Python
一个Python最简单的接口自动化框架
Jan 02 Python
Python实现快速计算词频功能示例
Jun 25 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
Python占用的内存优化教程
Jul 28 Python
Python中pymysql 模块的使用详解
Aug 12 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
python tqdm实现进度条的示例代码
Nov 10 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循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
js传值 判断
2006/10/26 Javascript
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
python安装numpy&安装matplotlib& scipy的教程
2017/11/02 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
python 字符串和整数的转换方法
2018/06/25 Python
详解flask入门模板引擎
2018/07/18 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
python实现文件的分割与合并
2019/08/29 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
试了下Golang实现try catch的方法
2021/07/01 Golang
Java 定时任务技术趋势简介
2022/05/04 Java/Android