Python开发的十个小贴士和技巧及长常犯错误


Posted in Python onSeptember 27, 2018

下面是十个Python中很有用的贴士和技巧。其中一些是初学这门语言常常会犯的错误。

注意:假设我们都用的是Python 3

1. 列表推导式

你有一个list:bag = [1, 2, 3, 4, 5]

现在你想让所有元素翻倍,让它看起来是这个样子:[2, 4, 6, 8, 10]

大多初学者,根据之前语言的经验会大概这样来做

bag = [1, 2, 3, 4, 5] 
for i in range(len(bag)): 
 bag[i] = bag[i] * 2

但是有更好的方法:

bag = [elem * 2 for elem in bag]

很简洁对不对?这叫做Python的列表推导式。

2. 遍历列表

还是上面的列表。如果可能尽量避免这样做:

bag = [1, 2, 3, 4, 5] 
for i in range(len(bag)): 
 print(bag[i])

取而代之的应该是这样:

bag = [1, 2, 3, 4, 5] 
for i in bag: 
 print(i)

如果x是一个列表,你可以对它的元素进行迭代。多数情况下你不需要各元素的索引,但如果你非要这样做,那就用enumerate函数。它像下边的样子:

bag = [1, 2, 3, 4, 5] 
for index, element in enumerate(bag): 
 print(index, element)

非常直观明了。

3. 元素互换

如果你是从java或者C语言转到Python来,可能会习惯于这样:

a = 5 
b = 10
# 交换 a 和 b
tmp = a 
a = b 
b = tmp

但Python提供了一个更自然更好的方法!

a = 5 
b = 10 
# 交换a 和 b
a, b = b, a

4. 初始化列表

假如你要一个是10个整数0的列表,你可能首先想到:

bag = [] 
for _ in range(10): 
 bag.append(0)

换个方式吧:

bag = [0] * 10

看,多优雅。

注意:如果你列表包含了列表,这样做会产生浅拷贝。

举个例子:

bag_of_bags = [[0]] * 5 # [[0], [0], [0], [0], [0]] 
bag_of_bags[0][0] = 1 # [[1], [1], [1], [1], [1]]

Oops!所有的列表都改变了,而我们只是想要改变第一个列表。

改一改啦:

bag_of_bags = [[0] for _ in range(5)] 
# [[0], [0], [0], [0], [0]]
bag_of_bags[0][0] = 1 
# [[1], [0], [0], [0], [0]]
“过早优化是万恶之源”

问问自己,初始化一个列表是必须的吗?

5. 构造字符串

你会经常需要打印字符串。要是有很多变量,避免下面这样:

name = "Raymond" 
age = 22 
born_in = "Oakland, CA" 
string = "Hello my name is " + name + "and I'm " + str(age) + " years old. I was born in " + born_in + "." 
print(string)

额,这看起来多乱呀?你可以用个漂亮简洁的方法来代替,.format。

这样做:

name = "Raymond" 
age = 22 
born_in = "Oakland, CA" 
string = "Hello my name is {0} and I'm {1} years old. I was born in {2}.".format(name, age, born_in) 
print(string)

6. 返回tuples(元组)

Python允许你在一个函数中返回多个元素,这让生活更简单。但是在解包元组的时候出出线这样的常见错误:

def binary(): 
 return 0, 1

result = binary() 
zero = result[0] 
one = result[1]

这是没必要的,你完全可以换成这样:

def binary(): 
 return 0, 1
zero, one = binary()

要是你需要所有的元素被返回,用个下划线_:

zero, _ = binary()

就是这么高效率!

7. 访问Dicts(字典)

你也会经常给dicts中写入key,value(键,值)。

如果你试图访问一个不存在的于dict的key,可能会为了避免KeyError错误,你会倾向于这样做:

countr = {} 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
for i in bag: 
 if i in countr:
 countr[i] += 1
 else:
 countr[i] = 1

for i in range(10): 
 if i in countr:
 print("Count of {}: {}".format(i, countr[i]))
 else:
 print("Count of {}: {}".format(i, 0))

但是,用get()是个更好的办法。

countr = {} 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
for i in bag: 
 countr[i] = countr.get(i, 0) + 1
for i in range(10): 
 print("Count of {}: {}".format(i, countr.get(i, 0)))

当然你也可以用setdefault来代替。

这还用一个更简单却多费点开销的办法:

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
countr = dict([(num, bag.count(num)) for num in bag])
for i in range(10): 
 print("Count of {}: {}".format(i, countr.get(i, 0)))

你也可以用dict推导式。

countr = {num: bag.count(num) for num in bag}

这两种方法开销大是因为它们在每次count被调用时都会对列表遍历。

8 使用库

现有的库只需导入你就可以做你真正想做的了。

还是说前面的例子,我们建一个函数来数一个数字在列表中出现的次数。那么,已经有一个库就可以做这样的事情。

from collections import Counter 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
countr = Counter(bag)
for i in range(10): 
 print("Count of {}: {}".format(i, countr[i]))

一些用库的理由:

代码是正确而且经过测试的。
它们的算法可能会是最优的,这样就跑的更快。
抽象化:它们指向明确而且文档友好,你可以专注于那些还没有被实现的。
最后,它都已经在那儿了,你不用再造轮子了。

9. 在列表中切片/步进

你可以指定start的点和stop点,就像这样list[start:stop:step]。我们取出列表中的前5个元素:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[:5]: 
 print(elem)

这就是切片,我们指定stop点是5,再停止前就会从列表中取出5个元素。

要是最后5个元素怎么做?

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[-5:]: 
 print(elem)

没看明白吗?-5意味着从列表的结尾取出5个元素。

如果你想对列表中元素间隔操作,你可能会这样做:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for index, elem in enumerate(bag): 
 if index % 2 == 0: 
 print(elem)

但是你应该这样来做:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[::2]: 
 print(elem)
# 或者用 ranges
bag = list(range(0,10,2)) 
print(bag)

这就是列表中的步进。list[::2]意思是遍历列表同时两步取出一个元素。

你可以用list[::-1]很酷的翻转列表。

10. tab键还是空格键

长时间来看,将tab和空格混在一起会带来很多不必要的麻烦,你会看到IndentationError: unexpected indent。不管你选择tab键还是空格键,你应该在你的文件和项目中一直保持使用。

一个使用空格而不是tab的原因是,tab不是在所有编辑器中都一样的。视呢所用的编辑器,tab可能会被当作2到8个空格。

你也可以在写代码时用空格来定义tab。这样你可以自己选择用几个空格来当做tab。大多数Python用户是用4个空格。

总结

以上所述是小编给大家介绍的Python开发的十个小贴士和技巧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
在Python中操作字典之clear()方法的使用
May 21 Python
python将ansible配置转为json格式实例代码
May 15 Python
python数字图像处理实现直方图与均衡化
May 04 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
Django REST framework 分页的实现代码
Jun 19 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
django 读取图片到页面实例
Mar 27 Python
什么是Python变量作用域
Jun 03 Python
Python对excel的基本操作方法
Feb 18 Python
yolov5返回坐标的方法实例
Mar 17 Python
详解django中使用定时任务的方法
Sep 27 #Python
Python高级特性切片(Slice)操作详解
Sep 27 #Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 #Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 #Python
APIStar:一个专为Python3设计的API框架
Sep 26 #Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 #Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 #Python
You might like
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
PHP 面向对象 final类与final方法
2010/05/05 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
浅析PHP文件下载原理
2014/12/25 PHP
php中JSON的使用方法
2015/04/30 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
县优秀教师事迹材料
2014/01/31 职场文书
企业总经理任命书
2014/06/05 职场文书
审计班子对照检查材料
2014/08/27 职场文书
离婚协议书标准格式
2014/10/04 职场文书
质量保证书
2015/01/17 职场文书