[ZZ] python 语言技巧
http://sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html 感谢原作者
30 Python Language Features and Tricks You May Not Know About
Posted on Mar 05, 2014 , last modified on Mar 16, 2014
By Sahand Saba1.1 Unpacking
- >>> 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 Unpacking for swapping variables
- >>> a, b = 1, 2
- >>> a, b = b, a
- >>> a, b
- (2, 1)
1.3 Extended unpacking (Python 3 only)
- >>> a, *b, c = [1, 2, 3, 4, 5]
- >>> a
- 1
- >>> b
- [2, 3, 4]
- >>> c
- 5
1.4 Negative indexing
- >>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- >>> a[-1]
- 10
- >>> a[-3]
- 8
1.5 List slices (a[start:end])
- >>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- >>> a[2:8]
- [2, 3, 4, 5, 6, 7]
1.6 List slices with negative indexing
- >>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- >>> a[-4:-2]
- [7, 8]
1.7 List slices with step (a[start:end:step])
- >>> 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 List slices with negative step
- >>> 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 List slice assignment
- >>> 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 Naming slices (slice(start, end, step))
- >>> a = [0, 1, 2, 3, 4, 5]
- >>> LASTTHREE = slice(-3, None)
- >>> LASTTHREE
- slice(-3, None, None)
- >>> a[LASTTHREE]
- [3, 4, 5]
1.11 Zipping and unzipping lists and iterables
- >>> 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 Grouping adjacent list items using zip
- >>> 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 Inverting a dictionary using zip
- >>> 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.14 Flattening lists:
- >>> 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]
Note: according to Python's documentation on sum, itertools.chain.from_iterable is the preferred method for this.
1.15 Generator expressions
- >>> 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.16 Dictionary comprehensions
- >>> 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.17 Inverting a dictionary using a dictionary comprehension
- >>> 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.18 Named tuples (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.19 Inheriting from named tuples:
- >>> class Point(collections.namedtuple('PointBase', ['x', '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.20 Sets and set operations
- >>> A = {1, 2, 3, 3}
- >>> A
- set([1, 2, 3])
- >>> B = {3, 4, 5, 6, 7}
- >>> B
- set([3, 4, 5, 6, 7])
- >>> A | B
- set([1, 2, 3, 4, 5, 6, 7])
- >>> A & B
- set([3])
- >>> A - B
- set([1, 2])
- >>> B - A
- set([4, 5, 6, 7])
- >>> A ^ B
- set([1, 2, 4, 5, 6, 7])
- >>> (A ^ B) == ((A - B) | (B - A))
- True
1.21 Multisets and multiset operations (collections.Counter)
- >>> A = collections.Counter([1, 2, 2])
- >>> B = collections.Counter([2, 2, 3])
- >>> A
- Counter({2: 2, 1: 1})
- >>> B
- Counter({2: 2, 3: 1})
- >>> A | B
- Counter({2: 2, 1: 1, 3: 1})
- >>> A & B
- Counter({2: 2})
- >>> A + B
- Counter({2: 4, 1: 1, 3: 1})
- >>> A - B
- Counter({1: 1})
- >>> B - A
- Counter({3: 1})
1.22 Most common elements in an iterable (collections.Counter)
- >>> A = collections.Counter([1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6, 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.23 Double-ended queue (collections.deque)
- >>> Q = collections.deque()
- >>> Q.append(1)
- >>> Q.appendleft(2)
- >>> Q.extend([3, 4])
- >>> Q.extendleft([5, 6])
- >>> Q
- deque([6, 5, 2, 1, 3, 4])
- >>> Q.pop()
- 4
- >>> Q.popleft()
- 6
- >>> Q
- deque([5, 2, 1, 3])
- >>> Q.rotate(3)
- >>> Q
- deque([2, 1, 3, 5])
- >>> Q.rotate(-3)
- >>> Q
- deque([5, 2, 1, 3])
1.24 Double-ended queue with maximum length (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, 1, 2
- 1, 2, 3
- 2, 3, 4
- 3, 4, 5
- 4, 5, 6
- 5, 6, 7
- 6, 7, 8
- 7, 8, 9
1.25 Ordered dictionaries (collections.OrderedDict)
- >>> m = dict((str(x), x) for x in range(10))
- >>> print ', '.join(m.keys())
- 1, 0, 3, 2, 5, 4, 7, 6, 9, 8
- >>> m = collections.OrderedDict((str(x), x) for x in range(10))
- >>> print ', '.join(m.keys())
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
- >>> m = collections.OrderedDict((str(x), x) for x in range(10, 0, -1))
- >>> print ', '.join(m.keys())
- 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
1.26 Default dictionaries (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.27 Using default dictionaries to represent simple trees
- >>> 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"
- }
- }
(See https://gist.github.com/hrldcpr/2012250 for more on this.)
1.28 Mapping objects to unique counting numbers (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
1.29 Largest and smallest elements (heapq.nlargest and heapq.nsmallest)
- >>> a = [random.randint(0, 100) for __ in xrange(100)]
- >>> heapq.nsmallest(5, a)
- [3, 3, 5, 6, 8]
- >>> heapq.nlargest(5, a)
- [100, 100, 99, 98, 98]
1.30 Cartesian products (itertools.product)
- >>> for p in itertools.product([1, 2, 3], [4, 5]):
- (1, 4)
- (1, 5)
- (2, 4)
- (2, 5)
- (3, 4)
- (3, 5)
- >>> for p in itertools.product([0, 1], repeat=4):
- ... print ''.join(str(x) for x in p)
- ...
- 0000
- 0001
- 0010
- 0011
- 0100
- 0101
- 0110
- 0111
- 1000
- 1001
- 1010
- 1011
- 1100
- 1101
- 1110
- 1111
1.31 Combinations and combinations with replacement (itertools.combinations anditertools.combinations_with_replacement)
- >>> for c in itertools.combinations([1, 2, 3, 4, 5], 3):
- ... print ''.join(str(x) for x in c)
- ...
- 123
- 124
- 125
- 134
- 135
- 145
- 234
- 235
- 245
- 345
- >>> for c in itertools.combinations_with_replacement([1, 2, 3], 2):
- ... print ''.join(str(x) for x in c)
- ...
- 11
- 12
- 13
- 22
- 23
- 33
1.32 Permutations (itertools.permutations)
- >>> for p in itertools.permutations([1, 2, 3, 4]):
- ... print ''.join(str(x) for x in p)
- ...
- 1234
- 1243
- 1324
- 1342
- 1423
- 1432
- 2134
- 2143
- 2314
- 2341
- 2413
- 2431
- 3124
- 3142
- 3214
- 3241
- 3412
- 3421
- 4123
- 4132
- 4213
- 4231
- 4312
- 4321
1.33 Chaining iterables (itertools.chain)
- >>> a = [1, 2, 3, 4]
- >>> for p in itertools.chain(itertools.combinations(a, 2), itertools.combinations(a, 3)):
- ... print p
- ...
- (1, 2)
- (1, 3)
- (1, 4)
- (2, 3)
- (2, 4)
- (3, 4)
- (1, 2, 3)
- (1, 2, 4)
- (1, 3, 4)
- (2, 3, 4)
- >>> for subset in itertools.chain.from_iterable(itertools.combinations(a, n) for n in range(len(a) + 1))
- ... print subset
- ...
- ()
- (1,)
- (2,)
- (3,)
- (4,)
- (1, 2)
- (1, 3)
- (1, 4)
- (2, 3)
- (2, 4)
- (3, 4)
- (1, 2, 3)
- (1, 2, 4)
- (1, 3, 4)
- (2, 3, 4)
- (1, 2, 3, 4)
1.34 Grouping rows by a given key (itertools.groupby)
- >>> import itertools
- >>> with open('contactlenses.csv', 'r') as infile:
- ... data = [line.strip().split(',') for line in infile]
- ...
- >>> data = data[1:]
- >>> def print_data(rows):
- ... print '\n'.join('\t'.join('{: <16}'.format(s) for s in row) for row in rows)
- ...
- >>> print_data(data)
- young myope no reduced none
- young myope no normal soft
- young myope yes reduced none
- young myope yes normal hard
- young hypermetrope no reduced none
- young hypermetrope no normal soft
- young hypermetrope yes reduced none
- young hypermetrope yes normal hard
- pre-presbyopic myope no reduced none
- pre-presbyopic myope no normal soft
- pre-presbyopic myope yes reduced none
- pre-presbyopic myope yes normal hard
- pre-presbyopic hypermetrope no reduced none
- pre-presbyopic hypermetrope no normal soft
- pre-presbyopic hypermetrope yes reduced none
- pre-presbyopic hypermetrope yes normal none
- presbyopic myope no reduced none
- presbyopic myope no normal none
- presbyopic myope yes reduced none
- presbyopic myope yes normal hard
- presbyopic hypermetrope no reduced none
- presbyopic hypermetrope no normal soft
- presbyopic hypermetrope yes reduced none
- presbyopic hypermetrope yes normal none
- >>> data.sort(key=lambda r: r[-1])
- >>> for value, group in itertools.groupby(data, lambda r: r[-1]):
- ... print '-----------'
- ... print 'Group: ' + value
- ... print_data(group)
- ...
- -----------
- Group: hard
- young myope yes normal hard
- young hypermetrope yes normal hard
- pre-presbyopic myope yes normal hard
- presbyopic myope yes normal hard
- -----------
- Group: none
- young myope no reduced none
- young myope yes reduced none
- young hypermetrope no reduced none
- young hypermetrope yes reduced none
- pre-presbyopic myope no reduced none
- pre-presbyopic myope yes reduced none
- pre-presbyopic hypermetrope no reduced none
- pre-presbyopic hypermetrope yes reduced none
- pre-presbyopic hypermetrope yes normal none
- presbyopic myope no reduced none
- presbyopic myope no normal none
- presbyopic myope yes reduced none
- presbyopic hypermetrope no reduced none
- presbyopic hypermetrope yes reduced none
- presbyopic hypermetrope yes normal none
- -----------
- Group: soft
- young myope no normal soft
- young hypermetrope no normal soft
- pre-presbyopic myope no normal soft
- pre-presbyopic hypermetrope no normal soft
- presbyopic hypermetrope no normal soft
[ZZ] python 语言技巧的更多相关文章
- python语言技巧
一 在写之前 最好指定python的路径: #!/usr/bin/python python 在linux中需要添加编码方式:以免出现中文乱码 # -*- coding: UTF-8 –*- 二 ...
- Python语言防坑小技巧
Python语言防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.赋值即定义 1>.运行以下代码会出现报错 #!/usr/bin/env python #_*_ ...
- 如何系统地自学一门Python 语言(转)
转自:http://www.phpxs.com/post/4521 零基础情况下,学一门语言充实下自己,Python,简洁.优美.容易使用,是一个很好的选择.那么如何系统地自学Python呢? 有的人 ...
- Python语言and-or的用法
[原]python语言的 and-or 常常被用来实现类C语言中的三元运算符 : ? , 更为骚气的写法是 xxx and xxx or xxx and xxx or xxx,这样就可以可以做到 ...
- python代码优化技巧
转自:http://www.douban.com/group/topic/31478102/ 这个资料库还有些不错的好文章: http://www.ibm.com/developerworks/cn/ ...
- Python语言学习之Python入门到进阶
人们常说Python语言简单,编写简单程序时好像也确实如此.但实际上Python绝不简单,它也是一种很复杂的语言,其功能特征非常丰富,能支持多种编程风格,在几乎所有方面都能深度定制.要想用好Pytho ...
- python的技巧和方法你了解多少?
学了这些你的python代码将会改善与你的技巧将会提高. 1. 路径操作 比起os模块的path方法,python3标准库的pathlib模块的Path处理起路径更加的容易. 获取当前文件路径 前提导 ...
- 一些你需要知道的Python代码技巧
被人工智能捧红的 Python 已是一种发展完善且非常多样化的语言,其中肯定有一些你尚未发现的功能.本文或许能够让你学到一些新技巧. Python 是世界上最流行.热门的编程语言之一,原因很多,比 ...
- 掌握这些Python代码技巧,编程至少快一半!
被人工智能捧红的 Python 已是一种发展完善且非常多样化的语言,其中肯定有一些你尚未发现的功能.本文或许能够让你学到一些新技巧. Python 是世界上最流行.热门的编程语言之一,原因很多,比 ...
随机推荐
- C++习题 复数类--重载运算符2+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...
- Eclipse+Maven命令创建webapp项目<三>
1.使用maven命令:mvn archetype:create -DgroupId=xxxxx -DartifactId=web-sample -DarchetypeArtifactId=maven ...
- UVA 674 (入门DP, 14.07.09)
Coin Change Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We ...
- Thinkphp编辑器扩展类kindeditor用法
一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...
- Android MVC MVP
从.NET的宠物商店到Android MVC MVP 1 一些闲话 记得刚进公司的时候,我们除了做常规的Training Project外,每天还要上课,接受各种技术培训和公司业务介绍.当时第一次 ...
- jQuery整理笔记2----jQuery选择整理
一个.基本的选择 1.ID选择器 JavaScript提供了原生方法实如今DOM中选择指定ID值得元素. 使用方法例如以下: var element=document.getElementById(& ...
- Lua中的weak表——weak table(转)
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
- android得知----overridePendingTransition
1 Activity动画是指从一个切换activity跳到另一个activity随着电影. 它由两部分组成:第一部分是一个activity动画出口:中的第二个另一部分activity动画被访问: 于A ...
- 【Android进阶】判断网络连接状态并自动界面跳转
用于判断软件打开时的网络连接状态,若无网络连接,提醒用户跳转到设置界面 /** * 设置在onStart()方法里面,可以在界面每次获得焦点的时候都进行检测 */ @Override protecte ...
- POST和Get辨析
在Form里面,能够使用post也能够使用get.它们都是method的合法取值,可是两者也有不同,主要差别在于传递和获取參数的方式不同 一.Get方法: 1.參数的传递方式: 通过URL请求来传递用 ...