从我开始学习Python时我就决定维护一个经常使用的“窍门”列表。不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中、在StackOverflow、在开源码软件中,等等),我会尝试它直到理解它,然后把它添加到列表中。这篇文章是清理过列表的一部分。如果你是一个有经验的Python程序员,尽管你可能已经知道一些,但你仍能发现一些你不知道的。如果你是一个正在学习Python的C、C++或Java程序员,或者刚开始学习编程,那么你会像我一样发现它们中的很多非常有用。
每个窍门或语言特性只能通过实例来验证,无需过多解释。虽然我已尽力使例子清晰,但它们中的一些仍会看起来有些复杂,这取决于你的熟悉程度。所以如果看过例子后还不清楚的话,标题能够提供足够的信息让你通过Google获取详细的内容。
列表按难度排序,常用的语言特征和技巧放在前面。
1.1 分拆
>>> a,b,c = 1,2,3
>>> a,c
(1,3)
>>> a,c = [1,3]
>>> a,c = (2 * i + 1 for i in range(3))
>>> a,3,5)
>>> a,(b,c),d = [1,(2,3),4]
>>> a
1
>>> b
2
>>> c
3
>>> d
4
1.2 交换变量分拆
>>> a,b = 1,2
>>> a,b = b,a
>>> a,b
(2,1)
1.3 拓展分拆 (Python 3下适用)
>>> a,*b,4,5]
>>> a
1
>>> b
[2,4]
>>> c
5
1.4 负索引
>>> a = [0,1,5,6,7,8,9,10]
>>> a[-1]
10
>>> a[-3]
8
1.5 列表切片 (a[start:end])
>>> a = [0,10]
>>> a[2:8]
[2,7]
1.6 使用负索引的列表切片
>>> a = [0,10]
>>> a[-4:-2]
[7,8]
1.7 带步进值的列表切片 (a[start:end:step])
>>> a = [0,10]
>>> a[::2]
[0,10]
>>> a[::3]
[0,9]
>>> a[2:8:2]
[2,6]
1.8 负步进值得列表切片
>>> a = [0,10]
>>> a[::-1]
[10,0]
>>> a[::-2]
[10,0]
1.9 列表切片赋值
>>> a = [1,5]
>>> a[2:3] = [0,0]
>>> a
[1,5]
>>> a[1:1] = [8,9]
>>> a
[1,5]
>>> a[1:-1] = []
>>> a
[1,5]
1.10 命名切片 (slice(start,end,step))
>>> a = [0,5]
>>> LASTTHREE = slice(-3,None)
>>> LASTTHREE
slice(-3,None,None)
>>> a[LASTTHREE]
[3,5]
1.11 zip打包解包列表和倍数
>>> a = [1,3]
>>> b = ['a','b','c']
>>> z = zip(a,b)
>>> z
[(1,'a'),'b'),(3,'c')]
>>> zip(*z)
[(1,('a','c')]
1.12 使用zip合并相邻的列表项
>>> a = [1,6]
>>> zip(*([iter(a)] * 2))
[(1,2),4),(5,6)]
>>> group_adjacent = lambda a,k: zip(*([iter(a)] * k))
>>> group_adjacent(a,3)
[(1,(4,6)]
>>> group_adjacent(a,2)
[(1,1)
[(1,),(6,)]
>>> zip(a[::2],a[1::2])
[(1,6)]
>>> zip(a[::3],a[1::3],a[2::3])
[(1,k: zip(*(a[i::k] for i in range(k)))
>>> group_adjacent(a,)]
1.13 使用zip和iterators生成滑动窗口 (n -grams)
>>> from itertools import islice
>>> def n_grams(a,n):
... z = (islice(a,i,None) for i in range(n))
... return zip(*z)
...
>>> a = [1,6]
>>> n_grams(a,5),6)]
>>> n_grams(a,4)
[(1,6)]
1.14 使用zip反转字典
>>> m = {'a': 1,'b': 2,'c': 3,'d': 4}
>>> m.items()
[('a',1),('c',('b',('d',4)]
>>> zip(m.values(),m.keys())
[(1,'c'),'d')]
>>> mi = dict(zip(m.values(),m.keys()))
>>> mi
{1: 'a',2: 'b',3: 'c',4: 'd'}