下面会介绍一下有趣的技巧,来源于PythonDiscord1Reddit2

F-strings

看到一个有趣的用法,之前自己没见过2

1
2
3
foos = [1, 2]
bar, qaz = 3, 3
f"{(len(foos), bar + qaz)=}"

等同于

1
(len(foos), bar + qaz)=(2, 6)

numeric

1
2
digits = 2
f{1/3:.{digits}f}

更多有趣的f-string格式可去这里看PyFormat

List Comprehensions

这个就很常见了,列表表达式

  • list
  • dict

最常见的就是这种oneline code了

1
person_dict = {person.name:person for person in persons}

FIZBUZZ

这个也是在Reddit上评论里面看到的一个小trick

1
2
3
4
5
6
7
mappings = {
    (True, True): "FizzBuzz",
    (True, False): "Fizz",
    (False, True): "Buzz",
}
for i in range(1, 21):
    print(mappings.get((i % 3 == 0, i % 5 == 0), i))

DataClass

这个feature很有意思3,有很多有意思的功能在创建类的时候 还可以通过slots来减少内存使用,提高效率等4

Matrix

比如有一个场景,你需要对矩阵进行顺时针旋转90

1
2
3
4
5
[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
]

转变为

1
2
3
4
5
[
  [7, 4, 1],
  [8, 5, 2],
  [9, 6, 3],
]

用一行代码来实现

1
2
3
4
5
6
7
>>> matrix = [[1, 2, 3],
...           [4, 5, 6],
...           [7, 8, 9]]
>>> list(map(list, zip(*matrix[::-1])))
... [[7, 4, 1],
...  [8, 5, 2],
...  [9, 6, 3]]

其实这种也可以通过numpy来处理 但是会增加额外的空间消耗等

1
2
3
4
np.rot90(matrix, k=1, axes=(1, 0))
>>>array([[7, 4, 1],
       [8, 5, 2],
       [9, 6, 3]])

  1. PythonDiscord ↩︎

  2. reddit ↩︎ ↩︎

  3. 该模块提供了一个装饰器和函数,用于自动向用户定义的类添加生成的特殊方法,例如__init__()和__repr__(),详情参考dataclass。 ↩︎

  4. use_slots_true_to_imporve_performance ↩︎