Python Tips
紀錄一些 Python 上的小技巧, 善用後可以很方便, 不過有些已經用的很習慣了, 之後有想到任何新接觸 Python 的人會需要的再補上 :P
Python 的 bool 可以拿來做運算
>>> +True
1
>>> +False
0
>>> True + 1
2
善用 any 和 all
any 是只要傳入的 iterable 中間有任何的 bool 是 True 就回傳 True
all 是傳入的 iterable 中間全部的 bool 必須是 True 才回傳 True
分 group
>>> x = range(9)
>>> list(zip(*[iter(x)]*3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
>>> x = range(9)
>>> list(zip(*[iter(x), iter(x[1:])]*2))
[(0, 1, 1, 2), (2, 3, 3, 4), (4, 5, 5, 6), (6, 7, 7, 8)]
套用自己 class 內的 decorator 到其他 method
@staticmethod
def decorator(function):
pass
@decorator.__func__
def func(self):
pass
更改遞迴深度限制
import sys
print(sys.getrecursionlimit()) # 預設是 1000
sys.setrecursionlimit(1000000)
雖然可以更改遞迴深度的限制, 但是改的太寬鬆可能會讓遞迴執行過深, 造成記憶體不夠。
一次存取多個 Index 或 Value
>>> from operator import itemgetter
>>> a = [-2, 1, 5, 3, 8, 5, 6]
>>> b = [1, 2, 5]
>>> itemgetter(*b)(a)
(1, 5, 5)
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> itemgetter('a', 'c')(d)
(1, 3)
subprocess + ffplay
import subprocess
cmd = ['ffplay', '-']
ffplay = subprocess.Popen(cmd, stdin=subprocess.PIPE)
with open("test.mp4", "rb") as f:
ffplay.stdin.write(f.read())
簡單地週期性執行特定函式
import threading
def run_periodically(func, interval=1):
def _func():
func()
threading.Timer(interval, _func).start() # new timer
_func()
# simple usage, print "42" every 5 seconds
run_periodically(lambda: print(42), 5)
format_map
類似 str.format(**mapping)
,
但是 mapping
會直接使用而不會被複製,
可以和繼承 dict
的 class 搭配使用(可以客製化找不到 key 或是存取結果的處理)。