30个Python技巧(2)

前端之家收集整理的这篇文章主要介绍了30个Python技巧(2)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!

从我开始学习Python时我就决定维护一个经常使用的“窍门”列表。不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中、在StackOverflow、在开源码软件中,等等),我会尝试它直到理解它,然后把它添加到列表中。这篇文章是清理过列表的一部分。如果你是一个有经验的Python程序员,尽管你可能已经知道一些,但你仍能发现一些你不知道的。如果你是一个正在学习Python的C、C++或Java程序员,或者刚开始学习编程,那么你会像我一样发现它们中的很多非常有用。

每个窍门或语言特性只能通过实例来验证,无需过多解释。虽然我已尽力使例子清晰,但它们中的一些仍会看起来有些复杂,这取决于你的熟悉程度。所以如果看过例子后还不清楚的话,标题能够提供足够的信息让你通过Google获取详细的内容

列表按难度排序,常用的语言特征和技巧放在前面。

1.15 摊平列表:

>>> a = [[1,2],[3,4],[5,6]]

>>> list(itertools.chain.from_iterable(a))

[1,2,3,4,5,6]

 

>>> sum(a,[])

[1,6]

 

>>> [x for l in a for x in l]

[1,6]

 

>>> a = [[[1,4]],[[5,6],[7,8]]]

>>> [x for l1 in a for l2 in l1 for x in l2]

[1,6,7,8]

 

>>> a = [1,8]]]

>>> flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x]

>>> flatten(a)

[1,8]

注意: 根据Python的文档,itertools.chain.from_iterable是首选。

1.16 生成器表达式

>>> 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 迭代字典

>>> 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 通过迭代字典反转字典

>>> m = {'a': 1,'b': 2,'c': 3,'d': 4}

>>> m

{'d': 4,'a': 1,'c': 3}

>>> {v: k for k,v in m.items()}

{1: 'a',2: 'b',3: 'c',4: 'd'}

1.19 命名序列 (collections.namedtuple)

>>> Point = collections.namedtuple('Point',['x','y'])

>>> p = Point(x=1.0,y=2.0)

>>> p

Point(x=1.0,y=2.0)

>>> p.x

1.0

>>> p.y

2.0

1.20 命名列表的继承:

>>> class Point(collections.namedtuple('PointBase','y'])):

... __slots__ = ()

... def __add__(self,other):

... return Point(x=self.x + other.x,y=self.y + other.y)

...

>>> p = Point(x=1.0,y=2.0)

>>> q = Point(x=2.0,y=3.0)

>>> p + q

Point(x=3.0,y=5.0)

1.21 集合及集合操作

>>> A = {1,3}

>>> A

set([1,3])

>>> B = {3,7}

>>> B

set([3,7])

>>> A | B

set([1,7])

>>> A & B

set([3])

>>> A - B

set([1,2])

>>> B - A

set([4,7])

>>> A ^ B

set([1,7])

>>> (A ^ B) == ((A - B) | (B - A))

True

1.22 多重集及其操作 (collections.Counter)

>>> A = collections.Counter([1,2])

>>> B = collections.Counter([2,3])

>>> A

Counter({2: 2,1: 1})

>>> B

Counter({2: 2,3: 1})

>>> A | B

Counter({2: 2,3: 1})

>>> A & B

Counter({2: 2})

>>> A + B

Counter({2: 4,3: 1})

>>> A - B

Counter({1: 1})

>>> B - A

Counter({3: 1})

1.23 迭代中最常见的元素 (collections.Counter)

>>> A = collections.Counter([1,1,7])

>>> A

Counter({3: 4,1: 2,2: 2,4: 1,5: 1,6: 1,7: 1})

>>> A.most_common(1)

[(3,4)]

>>> A.most_common(3)

[(3,4),(1,2),(2,2)]

1.24 双端队列 (collections.deque)

>>> Q = collections.deque()

>>> Q.append(1)

>>> Q.appendleft(2)

>>> Q.extend([3,4])

>>> Q.extendleft([5,6])

>>> Q

deque([6,4])

>>> Q.pop()

4

>>> Q.popleft()

6

>>> Q

deque([5,3])

>>> Q.rotate(3)

>>> Q

deque([2,5])

>>> Q.rotate(-3)

>>> Q

deque([5,3])

1.25 有最大长度的双端队列 (collections.deque)

>>> last_three = collections.deque(maxlen=3)

>>> for i in xrange(10):

... last_three.append(i)

... print ','.join(str(x) for x in last_three)

...

0

0,1

0,2

1,3

2,4

3,5

4,6

5,7

6,8

7,8,9

1.26 字典排序 (collections.OrderedDict)

>>> m = dict((str(x),x) for x in range(10))

>>> print ','.join(m.keys())

1,9,8

>>> m = collections.OrderedDict((str(x),'.join(m.keys())

0,9

>>> m = collections.OrderedDict((str(x),x) for x in range(10,-1))

>>> print ','.join(m.keys())

10,1

1.27 缺省字典 (collections.defaultdict)

>>> m = dict()

>>> m['a']

Traceback (most recent call last):

File "<stdin>",line 1,in <module>

KeyError: 'a'

>>>

>>> m = collections.defaultdict(int)

>>> m['a']

0

>>> m['b']

0

>>> m = collections.defaultdict(str)

>>> m['a']

''

>>> m['b'] += 'a'

>>> m['b']

'a'

>>> m = collections.defaultdict(lambda: '[default value]')

>>> m['a']

'[default value]'

>>> m['b']

'[default value]'

1.28 用缺省字典表示简单的树

>>> import json

>>> tree = lambda: collections.defaultdict(tree)

>>> root = tree()

>>> root['menu']['id'] = 'file'

>>> root['menu']['value'] = 'File'

>>> root['menu']['menuitems']['new']['value'] = 'New'

>>> root['menu']['menuitems']['new']['onclick'] = 'new();'

>>> root['menu']['menuitems']['open']['value'] = 'Open'

>>> root['menu']['menuitems']['open']['onclick'] = 'open();'

>>> root['menu']['menuitems']['close']['value'] = 'Close'

>>> root['menu']['menuitems']['close']['onclick'] = 'close();'

>>> print json.dumps(root,sort_keys=True,indent=4,separators=(',',': '))

{

"menu": {

"id": "file",

"menuitems": {

"close": {

"onclick": "close();",

"value": "Close"

},

"new": {

"onclick": "new();",

"value": "New"

},

"open": {

"onclick": "open();",

"value": "Open"

}

},

"value": "File"

}

}

(到https://gist.github.com/hrldcpr/2012250查看详情)

1.29 映射对象到唯一的序列数 (collections.defaultdict)

>>> import itertools,collections

>>> value_to_numeric_map = collections.defaultdict(itertools.count().next)

>>> value_to_numeric_map['a']

0

>>> value_to_numeric_map['b']

1

>>> value_to_numeric_map['c']

2

>>> value_to_numeric_map['a']

0

>>> value_to_numeric_map['b']

1

原文链接:https://www.f2er.com/python/527216.html

猜你在找的Python相关文章