本文将向你展示20条非常实用的Python使用技巧。
以下为译文:
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
>>> x = y = z = 2
>>> x, y, z
(2, 2, 2)
非常有逻辑且优雅,对吧?
>>> x = 5
>>> 2 < x ≤ 8
True
>>> 6 < x ≤ 8
False
这个表达式相当于(2 < x)且 (x ≤ 8) 且 (x ≤ 8),但更为紧凑,而且只需执行一次x求值。
>>> 2 < x > 4
True
甚至可以将多个比较连起来:
>>> x = 2
>>> y = 8
>>> 0 < x < 4 < y < 16
True
>>> x, y, z = 2, 4, 8
>>> x
2
>>> y
4
>>> z
8
注意第一条语句中的2, 4, 8相当于一个元组(2, 4, 8)。
>>> x, *y, z = 2, 4, 8, 16
>>> x
2
>>> y
[4, 8]
>>> z
16
在这段代码中,x对应于第一个值2,因为2是首先出现的。z是最后一个,所以取最后一个值8。y以列表形式取中间的所有值,因为它带有星号(y*)。
>>> x, y = 2, 8
>>> x
2
>>> y
8
>>> x, y = y, x
>>> x
8
>>> y 2
>>> x = {'u': 1}
>>> y = {'v': 2}
>>> z = {**x, **y, 'w': 4}
>>> z
{'u': 1, 'v': 2, 'w': 4}
>>> x = ['u', 'v', 'w']
>>> y = '-*-'.join(x)
>>> y
'u-*-v-*-w'
>>> for i, item in enumerate(['u', 'v', 'w']):
... print('index:', i, 'element:', item)
...
index: 0 element: u
index: 1 element: v
index: 2 element: w
每次遍历你都会获得一个元组,其中包括索引值和对应的元素。
>>> for item in reversed(['u', 'v', 'w']):
... print(item)
...
w
v
u
>>> x = [1, 2, 4]
>>> y = ('u', 'v', 'w')
>>> z = zip(x, y)
>>> z
>>> list(z)
[(1, 'u'), (2, 'v'), (4, 'w')]
你可以遍历返回的zip对象,或者将其变成一个列表或元祖。
>>> x = [(1, 2, 4), ('u', 'v', 'w')]
>>> y = zip(*x)
>>> z = list(y)
>>> z
[(1, 'u'), (2, 'v'), (4, 'w')]
>>> x = [1, 2, 1, 4, 8]
>>> y = set(x)
>>> y
{8, 1, 2, 4}
>>> z = list(y)
>>> z
[8, 1, 2, 4]
>>> x = (1, 'v')
>>> y = (4, 'u')
>>> z = (2, 'w')
>>> sorted([x, y, z])
[(1, 'v'), (2, 'w'), (4, 'u')]
但是,如果你希望按照第二个元素(或其他元素)排序,则可以使用key参数和适当的lambda函数作为第二个参数:
>>> sorted([x, y, z], key=lambda item: item[1])
[(4, 'u'), (1, 'v'), (2, 'w')]
反向排序时也使用类似的方法:
>>> sorted([x, y, z], key=lambda item: item[1], reverse=True)
[(2, 'w'), (1, 'v'), (4, 'u')]
>>> x = {'u': 4, 'w': 2, 'v': 1}
>>> sorted(x.items())
[('u', 4), ('v', 1), ('w', 2)]
它们按照键的顺序进行排序。如果你希望按照值排序,则应该指定相应的key参数。反向排序也类似:
>>> sorted(x.items(), key=lambda item: item[1])
[('v', 1), ('w', 2), ('u', 4)]
>>> sorted(x.items(), key=lambda item: item[1], reverse=True)
[('u', 4), ('w', 2), ('v', 1)]
>>> fr'u \ n v w={2 + 8}'
'u \\ n v w=10'
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2019, 5, 20, 1, 12, 31, 230217)
>>> x = [2, 1, 4, 16, 8]
>>> max((item, i) for i, item in enumerate(x))[1]
3
如果有两个或多个元素都是最大值,那么该方法返回最后一个的索引:
>>> y = [2, 1, 4, 8, 8]
>>> max((item, i) for i, item in enumerate(y))[1]
4
如果想获取第一个,则可以对上面的语句稍作改动:
>>> -max((item, -i) for i, item in enumerate(y))[1]
3
另一种方法可能更优雅:
>>> x = [2, 1, 4, 16, 8]
>>> max(range(len(x)), key=lambda i: x[i])
3
>>> y = [2, 1, 4, 8, 8]
>>> max(range(len(y)), key=lambda i: x[i])
3
如果想获得最小元素的索引,则只需用min替换上面的max。
>>> import itertools
>>> x, y, z = (2, 8), ['u', 'v', 'w'], {True, False}
>>> list(itertools.product(x, y, z))
[(2, 'u', False), (2, 'u', True), (2, 'v', False), (2, 'v', True),
(2, 'w', False), (2, 'w', True), (8, 'u', False), (8, 'u', True),
(8, 'v', False), (8, 'v', True), (8, 'w', False), (8, 'w', True)]
>>> import numpy as np
>>> x, y = np.array([1, 3, 5]), np.array([2, 4, 6])
>>> z = x @ y
>>> z
44
热 文 推 荐
☞这款“狗屁不通”文章生成器火了,效果确实比GPT 2差太远
☞CSDN应邀赴微软IT大会,揭开微软重磅推出的秘密武器——Azure区块链代币平台的神秘面纱!