10个Python小技巧你值得拥有


Posted in Python onSeptember 29, 2018

列表推导式

你有一个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的列表推导式 。

遍历列表

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

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)

非常直观明了。

元素互换

如果你是从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

初始化列表

假如你要一个是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]]

“过早优化是万恶之源”问问自己,初始化一个列表是必须的吗?

构造字符串

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

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)

返回tuple元组

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

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

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

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

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

zero, _ = binary()

就是这么高效率!

访问Dict字典

你也会经常给 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] 
# {2: 3, 3: 1, 1: 1, 5: 1, 6: 1, 7: 2, 9: 1}
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 被调用时都会对列表遍历。

使用库

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

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

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]))

一些用库的理由:

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

你可以指定 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] 很酷的翻转列表。

tab键还是空格

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

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

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

总结

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

Python 相关文章推荐
Django框架的使用教程路由请求响应的方法
Jul 03 Python
老生常谈python中的重载
Nov 11 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
Python编写带选项的命令行程序方法
Aug 13 Python
关于numpy中eye和identity的区别详解
Nov 29 Python
python实现飞行棋游戏
Feb 05 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
python实点云分割k-means(sklearn)详解
May 28 Python
windows+vscode安装paddleOCR运行环境的步骤
Nov 11 Python
pandas统计重复值次数的方法实现
Feb 20 Python
python编写五子棋游戏
May 25 Python
实例分析python3实现并发访问水平切分表
Sep 29 #Python
3个用于数据科学的顶级Python库
Sep 29 #Python
使用Python机器学习降低静态日志噪声
Sep 29 #Python
python实现字符串和字典的转换
Sep 29 #Python
python实现字符串中字符分类及个数统计
Sep 28 #Python
python中使用zip函数出现错误的原因
Sep 28 #Python
python中的for循环
Sep 28 #Python
You might like
PHP中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
php时间函数用法分析
2016/05/28 PHP
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
详解node.js 事件循环
2020/07/22 Javascript
JavaScript实现世界各地时间显示
2020/09/07 Javascript
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python调用C语言开发的共享库方法实例
2015/03/18 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
详解python中的装饰器
2018/07/10 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Python流程控制 while循环实现解析
2019/09/02 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
印尼网上商店:Alfacart.com
2019/03/11 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
小学模范班主任事迹材料
2014/05/13 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python