30个有关Python的小技巧

本文由  伯乐在线  -  Kevin Sun  翻译自  sahandsaba 。欢迎加入 技术翻译小组 。转载请参见文章末尾处的要求。

从我开始学习python的时候,我就开始自己总结一个python小技巧的集合。后来当我什么时候在Stack Overflow
或者在某个开源软件里看到一段很酷代码的时候,我就很惊讶:原来还能这么做!,当时我会努力的自己尝试一下这段代码,直到我懂了它的整体思路以后,我就把这段代码加到我的集合里。这篇博客其实就是这个集合整理后一部分的公开亮相。如果你已经是个python大牛,那么基本上你应该知道这里面的大多数用法了,但我想你应该也能发现一些你不知道的新技巧。而如果你之前是一个c,c++,java的程序员,同时在学习python,或者干脆就是一个刚刚学习编程的新手,那么你应该会看到很多特别有用能让你感到惊奇的实用技巧,就像我当初一样。

每一个技巧和语言用法都会在一个个实例中展示给大家,也不需要有其他的说明。我已经尽力把每个例子弄的通俗易懂,但是因为读者对python的熟悉程度不同,仍然可能难免有一些晦涩的地方。所以如果这些例子本身无法让你读懂,至少这个例子的标题在你后面去google搜索的时候会帮到你。

整个集合大概是按照难易程度排序,简单常见的在前面,比较少见的在最后。

1.1 拆箱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> a, b, c = 1 , 2 , 3
>>> a, b, c
( 1 , 2 , 3 )
>>> a, b, c = [ 1 , 2 , 3 ]
>>> a, b, c
( 1 , 2 , 3 )
>>> a, b, c = ( 2 * i + 1 for i in range ( 3 ))
>>> a, b, c
( 1 , 3 , 5 )
>>> a, (b, c), d = [ 1 , ( 2 , 3 ), 4 ]
>>> a
1
>>> b
2
>>> c
3
>>> d
4

1.2 拆箱变量交换

1
2
3
4
>>> a, b = 1 , 2
>>> a, b = b, a
>>> a, b
( 2 , 1 )

1.3 扩展拆箱(只兼容python3)

1
2
3
4
5
6
7
>>> a, * b, c = [ 1 , 2 , 3 , 4 , 5 ]
>>> a
1
>>> b
[ 2 , 3 , 4 ]
>>> c
5

1.4 负数索引

1
2
3
4
5
>>> a = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
>>> a[ - 1 ]
10
>>> a[ - 3 ]
8

1.5 切割列表

1
2
3
>>> a = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
>>> a[ 2 : 8 ]
[ 2 , 3 , 4 , 5 , 6 , 7 ]

1.6 负数索引切割列表

1
2
3
>>> a = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
>>> a[ - 4 : - 2 ]
[ 7 , 8 ]

1.7指定步长切割列表

1
2
3
4
5
6
7
>>> a = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
>>> a[:: 2 ]
[ 0 , 2 , 4 , 6 , 8 , 10 ]
>>> a[:: 3 ]
[ 0 , 3 , 6 , 9 ]
>>> a[ 2 : 8 : 2 ]
[ 2 , 4 , 6 ]

1.8 负数步长切割列表

1
2
3
4
5
>>> a = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
>>> a[:: - 1 ]
[ 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ]
>>> a[:: - 2 ]
[ 10 , 8 , 6 , 4 , 2 , 0 ]

1.9 列表切割赋值

1
2
3
4
5
6
7
8
9
10
>>> a = [ 1 , 2 , 3 , 4 , 5 ]
>>> a[ 2 : 3 ] = [ 0 , 0 ]
>>> a
[ 1 , 2 , 0 , 0 , 4 , 5 ]
>>> a[ 1 : 1 ] = [ 8 , 9 ]
>>> a
[ 1 , 8 , 9 , 2 , 0 , 0 , 4 , 5 ]
>>> a[ 1 : - 1 ] = []
>>> a
[ 1 , 5 ]

1.10 命名列表切割方式

1
2
3
4
5
6
>>> a = [ 0 , 1 , 2 , 3 , 4 , 5 ]
>>> LASTTHREE = slice ( - 3 , None )
>>> LASTTHREE
slice ( - 3 , None , None )
>>> a[LASTTHREE]
[ 3 , 4 , 5 ]

1.11 列表以及迭代器的压缩和解压缩

1
2
3
4
5
6
7
>>> a = [ 1 , 2 , 3 ]
>>> b = [ 'a' , 'b' , 'c' ]
>>> z = zip (a, b)
>>> z
[( 1 , 'a' ), ( 2 , 'b' ), ( 3 , 'c' )]
>>> zip ( * z)
[( 1 , 2 , 3 ), ( 'a' , 'b' , 'c' )]

1.12 列表相邻元素压缩器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> a = [ 1 , 2 , 3 , 4 , 5 , 6 ]
>>> zip ( * ([ iter (a)] * 2 ))
[( 1 , 2 ), ( 3 , 4 ), ( 5 , 6 )]
 
>>> group_adjacent = lambda a, k: zip ( * ([ iter (a)] * k))
>>> group_adjacent(a, 3 )
[( 1 , 2 , 3 ), ( 4 , 5 , 6 )]
>>> group_adjacent(a, 2 )
[( 1 , 2 ), ( 3 , 4 ), ( 5 , 6 )]
>>> group_adjacent(a, 1 )
[( 1 ,), ( 2 ,), ( 3 ,), ( 4 ,), ( 5 ,), ( 6 ,)]
 
>>> zip (a[:: 2 ], a[ 1 :: 2 ])
[( 1 , 2 ), ( 3 , 4 ), ( 5 , 6 )]
 
>>> zip (a[:: 3 ], a[ 1 :: 3 ], a[ 2 :: 3 ])
[( 1 , 2 , 3 ), ( 4 , 5 , 6 )]
 
>>> group_adjacent = lambda a, k: zip ( * (a[i::k] for i in range (k)))
>>> group_adjacent(a, 3 )
[( 1 , 2 , 3 ), ( 4 , 5 , 6 )]
>>> group_adjacent(a, 2 )
[( 1 , 2 ), ( 3 , 4 ), ( 5 , 6 )]
>>> group_adjacent(a, 1 )
[( 1 ,), ( 2 ,), ( 3 ,), ( 4 ,), ( 5 ,), ( 6 ,)]

1.13 在列表中用压缩器和迭代器滑动取值窗口

1
2
3
4
5
6
7
8
9
10
11
>>> def n_grams(a, n):
...     z = [ iter (a[i:]) for i in range (n)]
...     return zip ( * z)
...
>>> a = [ 1 , 2 , 3 , 4 , 5 , 6 ]
>>> n_grams(a, 3 )
[( 1 , 2 , 3 ), ( 2 , 3 , 4 ), ( 3 , 4 , 5 ), ( 4 , 5 , 6 )]
>>> n_grams(a, 2 )
[( 1 , 2 ), ( 2 , 3 ), ( 3 , 4 ), ( 4 , 5 ), ( 5 , 6 )]
>>> n_grams(a, 4 )
[( 1 , 2 , 3 , 4 ), ( 2 , 3 , 4 , 5 ), ( 3 , 4 , 5 , 6 )]

1.14 用压缩器反转字典

1
2
3
4
5
6
7
8
>>> m = { 'a' : 1 , 'b' : 2 , 'c' : 3 , 'd' : 4 }
>>> m.items()
[( 'a' , 1 ), ( 'c' , 3 ), ( 'b' , 2 ), ( 'd' , 4 )]
>>> zip (m.values(), m.keys())
[( 1 , 'a' ), ( 3 , 'c' ), ( 2 , 'b' ), ( 4 , 'd' )]
>>> mi = dict ( zip (m.values(), m.keys()))
>>> mi
{ 1 : 'a' , 2 : 'b' , 3 : 'c' , 4 : 'd' }

1.15 列表展开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> a = [[ 1 , 2 ], [ 3 , 4 ], [ 5 , 6 ]]
>>> list (itertools.chain.from_iterable(a))
[ 1 , 2 , 3 , 4 , 5 , 6 ]
 
>>> sum (a, [])
[ 1 , 2 , 3 , 4 , 5 , 6 ]
 
>>> [x for l in a for x in l]
[ 1 , 2 , 3 , 4 , 5 , 6 ]
 
>>> a = [[[ 1 , 2 ], [ 3 , 4 ]], [[ 5 , 6 ], [ 7 , 8 ]]]
>>> [x for l1 in a for l2 in l1 for x in l2]
[ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
 
>>> a = [ 1 , 2 , [ 3 , 4 ], [[ 5 , 6 ], [ 7 , 8 ]]]
>>> flatten = lambda x: [y for l in x for y in flatten(l)] if type (x) is list else [x]
>>> flatten(a)
[ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]

1.16 生成器表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> g = (x * * 2 for x in xrange ( 10 ))
>>> next (g)
0
>>> next (g)
1
>>> next (g)
4
>>> next (g)
9
>>> sum (x * * 3 for x in xrange ( 10 ))
2025
>>> sum (x * * 3 for x in xrange ( 10 ) if x % 3 = = 1 )
408

1.17 字典推导

1
2
3
4
5
6
7
>>> m = {x: x * * 2 for x in range ( 5 )}
>>> m
{ 0 : 0 , 1 : 1 , 2 : 4 , 3 : 9 , 4 : 16 }
 
>>> m = {x: 'A' + str (x) for x in range ( 10 )}
>>> m
{ 0 : 'A0' , 1 : 'A1' , 2 : 'A2' , 3 : 'A3' , 4 : 'A4' , 5 : 'A5' , 6 : 'A6' , 7 : 'A7' , 8 : 'A8' , 9 : 'A9' }

1.18 用字典推导反转字典

1
2
3
4
5
>>> m = { 'a' : 1 , 'b' : 2 , 'c' : 3 , 'd' : 4 }
>>> m
{ 'd' : 4 , 'a' : 1 , 'b' : 2 , 'c' : 3 }
>>> {v: k for k, v in m.items()}
{ 1 : 'a' , 2 : 'b' , 3 : 'c' , 4 : 'd' }

1.19 命名元组

1
2
3
4
5
6
7
8
>>> Point = collections.namedtuple( 'Point' , [ 'x' , 'y' ])
>>> p = Point(x = 1.0

你可能感兴趣的:(python)