30个Python技巧(2)
对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 52php.cn的小编两巴掌来看看吧!
从我开始学习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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |