10个python小技巧

Stack Overflow数据显示,python是增长最快的语言。Netflix、IBM等数百家大型企业都在用python,包括dropbox。在编程语言流行指数榜上,python也是最热门的语言之一。跟其他一些高级编程语言相比,python的一些优点有:

  1. 兼容所有主流平台和操作系统

  2. 很多开源框架和工具

  3. 可读性和可维护性的代码

  4. 鲁棒的标准库

  5. 标准的测试驱动开发环境

  6. 。。。

鉴于上述优点,这篇文章准备讲述10个python的小技巧来帮助你每天的coding工作。

字符串拼接

当你需要拼接一堆字符串时,你可以使用for循环去各自一个一个相加。然而这非常低效。因为在python里面,字符串是不可变的,所以在每一次相加的时候左边和右边的字符串都会被拷贝成一个新的字符串。

一个更好的方法是利用join函数:

>>> characters = ['p', 'y', 't', 'h', 'o', 'n'] 
>>> word = "".join(characters) 
>>> print(word) # python 
python 

利用列表生成式

列表生成式是用户从一个可迭代对象上生成另一个列表的工具。因为列表生成式返回的是列表,所以它的表达式左右是通过方括号括起来,然后列表里的所有元素都会执行运算,生成新的列表。列表生成式更快是因为python解释器对它进行了优化。

下面是两组例子:

>>> m = [x ** 2 for x in range(5)] 
>>> print(m) # [0, 1, 4, 9, 16] 
[0, 1, 4, 9, 16] 
>>> 
>>> list_a = [1, 2, 3, 4] 
>>> list_b = [2, 3, 4, 5] 
>>> common_num = [a for a in list_a for b in list_b if a == b] 
>>> print(common_num) # [2, 3, 4] 
[2, 3, 4] 
>>> 

第一组是求列表m的平方数,第二组是求两个列表的交集。


利用enumerate进行迭代

enumerate会在迭代对象上面加上一个计数器,返回的是一个enumerate对象。看下下列代码完成上面功能:

>>> numbers = [30, 42, 28, 50, 15] 
>>> for i, num in enumerate(numbers): 
...   if num % 3 == 0 and num % 5 == 0: 
...     numbers[i] = 'fizzbuzz' 
...   elif num % 3 == 0: 
...     numbers[i] = 'fizz' 
...   elif num % 5 == 0: 
...     numbers[i] = 'buzz' 
... 
>>> print(numbers) 
['fizzbuzz', 'fizz', 28, 'buzz', 'fizzbuzz'] 

善于使用zip

当你需要合并几个相同长度的列表的时候,zip就可以大显神通了。如下例所示:

>>> countries = ['France', 'Germany', 'Canada'] 
>>> capitals = ['Paris', 'Berlin', 'Ottawa'] 
>>> for country, capital in zip(countries,capitals): 
...     print(country, capital) 
... 
France Paris 
Germany Berlin 
Canada Ottawa 

使用itertools

python中的itertools是一系列操作python迭代器方法的集合,它还有几个用于生成可迭代对象的工具。这里使用itertools.combinations()作为例子,itertools.combinations()的作用是求组合,求出所有组合数:

>>> import itertools 
>>> friends = ['Team 1', 'Team 2', 'Team 3', 'Team 4'] 
>>> list(itertools.combinations(friends, r=2)) 
[('Team 1', 'Team 2'), ('Team 1', 'Team 3'), ('Team 1', 'Team 4'), ('Team 2', 'Team 3'), ('Team 2', 'Team 4'), ('Team 3', 'Team 4')] 

这里要注意的是组合数中元素的顺序并不重要,('Team 1', 'Team 2')和('Team 2', 'Team 1')意思一样。

还可以用itertools.permutations()求排列:

>>> list(itertools.permutations(friends,r=2)) 
[('Team 1', 'Team 2'), ('Team 1', 'Team 3'), ('Team 1', 'Team 4'), ('Team 2', 'Team 1'), ('Team 2', 'Team 3'), ('Team 2', 'Team 4'), ('Team 3', 'Team 1'), ('Team 3', 'Team 2'), ('Team 3', 'Team 4'), ('Team 4', 'Team 1'), ('Team 4', 'Team 2'), ('Team 4', 'Team 3')] 

使用collections

python里面的collections是容器数据类型,它包含很多高性能的数据类型,使代码更清晰简洁,同时还提供了很多函数,这里使用Counter()作为示例,Counter()函数使用列表或者元组作为输入,返回一个Counter字典,字典的key是迭代对象里面所有的唯一元素,value是每个唯一元素出现的个数。

>>> from collections import Counter 
>>> count = Counter(['a','b','c','d','b','c','d','b']) 
>>> count 
Counter({'b': 3, 'c': 2, 'd': 2, 'a': 1}) 
>>> 

将两个列表转换为字典

假设我们有两个列表,一个是学生姓名,一个包含所有学生的分数,python里面有个很简洁的方式可以将两个关联起来,利用zip:

>>> students = ["Peter", "Julia", "Alex"] 
>>> marks = [84, 65, 77] 
>>> dictionary = dict(zip(students, marks)) 
>>> print(dictionary) 
{'Peter': 84, 'Julia': 65, 'Alex': 77} 
>>> 

使用python生成器

生成器函数可以让码农们以快速、简便、简洁的方式构建一个迭代器。这里举个例子:求1-100000000所有数的平方和。看起来很简单,可以用列表生成式很快实现,但问题在于太大了,费内存费时间,可扩展性比较差:

>>> import time 
>>> t1 = time.clock() 
>>> sum([i * i for i in range(1, 100000000)]) 
>>> t2 = time.clock() 
>>> time_diff = t2 - t1 
>>> print(f"It took {time_diff} Secs to execute this method") 
It took 46.010000000000005 Secs to execute this method 
>>> 

如果把方括号变成圆括号,就变成了生成式方式,降低内存使用的同事速度也变得更快了:

>>> import time 
>>> t1 = time.clock() 
>>> sum((i * i for i in range(1, 100000000))) 
>>> t2 = time.clock() 
>>> time_diff = t2 - t1 
>>> print(f"It took {time_diff} Secs to execute this method") 
It took 15.069999999999993 Secs to execute this method 

从函数中返回多个值

python函数可以一次返回多个值,只需要将它们用逗号分隔即可,python会自动将它们变成一个元组返回。如:

>>> def multiplication_division(num1, num2): 
...   return num1*num2, num1/num2 
... 
>>> product, division = multiplication_division(15, 3) 
>>> print("Product=", product, "Quotient =", division) # Product= 45 Quotient = 5.0 
Product= 45 Quotient = 5.0 

使用sorted()函数

python里面对任意序列的排序都可以简单地用sorted函数实现,接受的可以是列表或者元组然后返回一个排序后列表,如:

>>> sorted([3,5,2,1,4]) 
[1, 2, 3, 4, 5] 
>>> sorted(['france', 'germany', 'canada', 'india', 'china'], reverse=True) 
['india', 'germany', 'france', 'china', 'canada'] 
>>> 

经常写python的人可能对上述技巧并不陌生,或者了解十之八九,希望此文能够帮助那些python新手。


参考链接:https://towardsdatascience.com/10-python-tips-and-tricks-you-should-learn-today-a05c23a39dc5

6 views

©2020 by EasyCSTech. Special thanks to IPinfo​ and EasyNote.