從我開始學習Python時我就決定維護一個經常使用的「竅門」清單。不論何時當我看到一段讓我覺得「酷,這樣也行!」的程式碼(在一個例子中、在StackOverflow、在開源軟體中,等等),我會嘗試它直到理解它,然後把它加到列表中。這篇文章是清理過清單的一部分。如果你是個有經驗的Python程式設計師,儘管你可能已經知道一些,但你仍能發現一些你不知道的。如果你是一個正在學習Python的C、C++或Java程式設計師,或是剛開始學習編程,那麼你會像我一樣發現它們中的許多非常有用。
每個訣竅或語言特性只能透過實例來驗證,無需過多解釋。雖然我已盡力使例子清晰,但它們中的一些仍會看起來有些複雜,這取決於你的熟悉程度。所以如果看過例子後還不清楚的話,標題能夠提供足夠的資訊讓你透過Google獲取詳細的內容。
列表依難度排序,常用的語言特徵和技巧放在前面。
1.30 最大最小元素(heapq.nlargest和heapq.nsmallest)
>>> a = [random.randint(0, 100) for __ in xrange(100)]
> a)
[3, 3, 5, 6, 8]
>>> heapq.nlargest(5, a)
[100, 100, 99, 98, 98] . product)
>>> for p in itertools.product([1, 2, 3], [4, 5]):
(1, 4)
(1, 5)
( (2, 5) (3, 4) (3, 5) >>> for p in itertools.product([0, 1], printeat= ): ''.join(str(x) for x in p) ... 0000 0001 0010 001110110
0111
1000
1001
1010
1011
1100
1101
1110
1111
1110
1111
. _replacement)>>> for c in itertools.combinations([1, 2 , 3, 4, 5], 3): ... print ''.join(str(x) for x in c) ...135 145 234 235 245 345 >>> for 345 >>> for 345 >>> forp.
... print ''.join( str(x) for x in c)
...
11
12
13
22
s)>>> for p in itertools .permutations([1, 2, 3, 4]): ... print ''.join(str(x) for x in p) ... 1234 ... 1234 ... 1342 1423 1432 2134 2143 2314 3124 3142 3214 3241 3412 34213412
342143135
4213 4231 4312 4321 1.34 連結的迭代(itertools.chain)1.34 連結的迭代(itertools.chain)> for
> itertools.chain( itertools.combinations(a, 2), itertools.combinations(a, 3)): ... print p ... (1, 2).... 4)
(2, 3)
(2, 4)
(3, 4)
(1, 2, 3)
(1, 3, 3, 3)
(2, 3, 4)
>>> for subset in itertools.chain.from_iterable(itertools.combinations(a, n) for n in range(len(a) + 1)) Check subset
...
()
(1,)
(2,)
(3,)
(4,)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
(1, 2, 3)
(1
(1, 2, 3) ( , 4) (2, 3, 4) (1, 2, 3, 4) 1.35 按給定值分組行(itertools.groupby)1.35 依給定值分組資料> > import itertools
>>> with open('contactlenses.csv', 'r') as infile:
... data = [line.strip().split(',') for line in in infile]
... >>> data = data[1:] >>> def print_data(rows): ... print 'n'.join('t'.join({t'. }'.format(s) for s in row) for row in rows) ... >>> print_data(data)年輕 沒有 近視 無 近視 是 近視 是 正常 不 減少 柔軟
年輕 減 無
年輕遠視 是 正常 硬
老花前 近視 否 減少 沒有
近視前 沒有 正常 軟
前老花眼 近視 是 減少 無
前老花眼 近視 是 正常 硬
前老花眼 遠視 無 減少 無
前老花眼 遠視眼無 正常 軟
前老花眼 遠視眼 ye 減少 無
前老花眼 是 正常 無
老花眼 近視 沒有 減少 無
老花眼 近視 沒有 正常 沒有
老花眼 近視 是 減少 無
老花眼 近視 正常 硬
老花 遠視 否 減少 無
老花眼 遠視眼 無 正常 軟
老花眼 遠視眼 是 減少 無
老花眼 遠視 是 正常 無
>>>數據。 sort(key=itemgetter(-1))
>>> 取得值,在itertools.groupby(data, lambda r: r[-1]):
... print '------- - ---'
... print '組:' + 值
... print_data(group)
...
-----------
... ----------- 組:很難組
年輕 近視 是 正常 硬 年輕 遠視 正常 硬 前老花眼 是 正常 硬 老花眼 近視 是 正常 硬 ------------ 分組:無年輕近視 沒有減少 無 年輕 無 沒有 年輕 遠視 沒有 年輕 遠視 是 否 減中 是 減損 無
前老花眼 是 減少 正常 無
老花眼 減少 無
老花眼 正常 無
老花眼 矯正眼睛 無
老花眼 遠視 記憶 沒有
老花眼 遠視眼 是降低無
presbyopic hypermetrope是正常無
----------------------------------- young Myope no正常正常 軟
老花眼 遠視眼睛 軟