能够让你提升的九个 Python 小技巧

一、列表推导式

你有一个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_ofbags = [[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个空格。

好啦,以上就是我的分享,如果你跟我一样都喜欢python,也在学习python的道路上奔跑,欢迎你加入python学习群:839383765 群内每天都会分享最新业内资料,企业项目案例,分享python免费课程,共同交流学习,让学习变(编)成(程)一种习惯!

原文地址:https://blog.51cto.com/14186420/2364027

时间: 2024-11-10 13:04:31

能够让你提升的九个 Python 小技巧的相关文章

python 小技巧

英文出处:sahandsaba.欢迎加入翻译组. 从我开始学习python的时候,我就开始自己总结一个python小技巧的集合.后来当我什么时候在Stack Overflow或者在某个开源软件里看到一段很酷代码的时候,我就很惊讶:原来还能这么做!,当时我会努力的自己尝试一下这段代码,直到我懂了它的整体思路以后,我就把这段代码加到我的集合里.这篇博客其实就是这个集合整理后一部分的公开亮相.如果你已经是个python大牛,那么基本上你应该知道这里面的大多数用法了,但我想你应该也能发现一些你不知道的新

Python补充02 Python小技巧

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在这里列举一些我使用Python时积累的小技巧.这些技巧是我在使用Python过程中经常使用的.之前很零碎的记在笔记本中,现在整理出来,和大家分享,也作为Python快速教程的一个补充. import模块 在Python经常使用import声明,以使用其他模块(也就是其它.py文件)中定义的对象. 1) 使用__name__ 当我们编写Python库模块的时候,我们往往运行一些测

Python小技巧整理

一.python小工具: 1.内置下载和网站: 进入相应目录:2.x python -m SimpleHTTPServer 3.x python -m http.server 2.字符串转换为JSON [[email protected] ~]# echo '{"job":"developer","name":"1mx","sex":"male"}' | python -m json.t

python小技巧(转)

http://blog.jobbole.com/63320/ 30 Python Language Features and Tricks You May Not Know About Posted on Mar 05, 2014 , last modified on May 19, 2014 - Permanent link 1   Introduction Since I started learning Python, I decided to maintain an often visi

Python 快速教程(补充篇02): Python小技巧

import模块 在Python经常使用import声明,以使用其他模块(也就是其它.py文件)中定义的对象. 1) 使用__name__ 当我们编写Python库模块的时候,我们往往运行一些测试语句.当这个程序作为库被import的时候,我们并不需要运行这些测试语句.一种解决方法是在import之前,将模块中的测试语句注释掉.Python有一种更优美的解决方法,就是使用__name__. 下面是一个简单的库程序TestLib.py.当直接运行TestLib.py时,__name__为”__ma

python小技巧

命令行启动简单的httpserver: python3: $ python3 -m http.serverServing HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...10.1.21.242 - - [27/Sep/2017 18:24:34] "GET / HTTP/1.1" 200 -10.1.21.242 - - [27/Sep/2017 18:24:34] code 404, message File not found

python 小技巧之获取固定下面包含的某种类型文件的个数

遇到这样一个问题.我想要统计某个文件夹下有多少个py文件怎么办. 用python能解决吗?答案,能. 解决办法,使用glob 代码如下: import glob path_file_number=glob.glob(pathname=r'*.py') print(path_file_number) print(len(path_file_number)) 很简单的几行代码,. 第一步,导入glob库 第二步,使用glob下面的glob的方法,参数是路径下判断的文件 第三步:打印: 结果: 这个是

能够让你装逼的10个Python小技巧

列表推导式 你有一个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的列表推导式 . 遍历列表 还是上面的列表

Python小技巧:打印出来的文本文档中间有空格

问题描述: 在file.txt中存了内容如下 AAAAAA BBBBBB CCCCCC 然后采用python显示,发现显示出来的是这样的 A A A A A A B B B B B B C C C C C C Why? Code如下 本意是想在文本文档中寻找某一行(CCC)的,但是一直都显示没有这一行,奇怪了 ''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子 ''' import io