40个你可能不知道的Python的特点和技巧
1、拆箱
>>> 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]>>> a1>>> b2>>> c3>>> d4 |
2、使用拆箱进行变量交换
>>> a, b = 1, 2>>> a, b = b, a>>> a, b(2, 1) |
3、扩展的拆箱(Python 3支持)
>>> a, *b, c = [1, 2, 3, 4, 5]>>> a1>>> b[2, 3, 4]>>> c5 |
4、负数索引
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>> a[-1]10>>> a[-3]8 |
5、列表切片(a[start:end])
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>> a[2:8][2, 3, 4, 5, 6, 7] |
6、负数索引的列表切片
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>> a[-4:-2][7, 8] |
7、带步数的列表切片(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] |
8、负数步数的列表切片
>>> 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] |
9、列表切片赋值
>>> 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] |
10、切片命名(slice(start, end, step))
>>> a = [0, 1, 2, 3, 4, 5]>>> LASTTHREE = slice(-3, None)>>> LASTTHREEslice(-3, None, None)>>> a[LASTTHREE][3, 4, 5] |
11、遍历列表索引和值(enumerate)
>>> a = ["Hello", "world", "!"]>>> for i, x in enumerate(a):... print "{}: {}".format(i, x)...0: Hello1: world2: ! |
12、遍历字典的KEY和VALUE(dict.iteritems)
>>> m = {"a": 1, "b": 2, "c": 3, "d": 4}>>> for k, v in m.iteritems():... print "{}: {}".format(k, v)...a: 1c: 3b: 2d: 4# 注意:Python 3中要使用dict.items |
13、压缩 & 解压列表和可遍历对象
>>> 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")] |
14、使用zip分组相邻列表项
>>> a = [1, 2, 3, 4, 5, 6]>>> # Using iterators>>> 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,)]>>> # Using slices>>> from itertools import islice>>> group_adjacent = lambda a, k: zip(*(islice(a, i, None, 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,)] |
15、使用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, 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)] |
16、使用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"} |
17、合并列表
>>> 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. |
18、生成器
>>> 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 |
19、字典解析
>>> 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"} |
20、使用字典解析反相字典对象
>>> 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"} |
21、命名的tuples(collections.namedtuple)
>>> Point = collections.namedtuple("Point", ["x", "y"])>>> p = Point(x=4.0, y=2.0)>>> pPoint(x=4.0, y=2.0)>>> p.x4.0>>> p.y2.0 |
22、继承命名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=4.0, y=2.0)>>> q = Point(x=2.0, y=3.0)>>> p + qPoint(x=6.0, y=5.0) |
23、Set & Set运算
>>> A = {1, 2, 3, 3}>>> Aset([1, 2, 3])>>> B = {3, 4, 5, 6, 7}>>> Bset([3, 4, 5, 6, 7])>>> A | Bset([1, 2, 3, 4, 5, 6, 7])>>> A & Bset([3])>>> A - Bset([1, 2])>>> B - Aset([4, 5, 6, 7])>>> A ^ Bset([1, 2, 4, 5, 6, 7])>>> (A ^ B) == ((A - B) | (B - A))True |
24、Multisets运算(collections.Counter)
>>> A = collections.Counter([1, 2, 2])>>> B = collections.Counter([2, 2, 3])>>> ACounter({2: 2, 1: 1})>>> BCounter({2: 2, 3: 1})>>> A | BCounter({2: 2, 1: 1, 3: 1})>>> A & BCounter({2: 2})>>> A + BCounter({2: 4, 1: 1, 3: 1})>>> A - BCounter({1: 1})>>> B - ACounter({3: 1}) |
25、列表中出现最多的元素(collections.Counter)
>>> A = collections.Counter([1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6, 7])>>> ACounter({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)] |
26、双向队列(collections.deque)
>>> Q = collections.deque()>>> Q.append(1)>>> Q.appendleft(2)>>> Q.extend([3, 4])>>> Q.extendleft([5, 6])>>> Qdeque([6, 5, 2, 1, 3, 4])>>> Q.pop()4>>> Q.popleft()6>>> Qdeque([5, 2, 1, 3])>>> Q.rotate(3)>>> Qdeque([2, 1, 3, 5])>>> Q.rotate(-3)>>> Qdeque([5, 2, 1, 3]) |
27、限制长度的双向队列(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)...00, 10, 1, 21, 2, 32, 3, 43, 4, 54, 5, 65, 6, 76, 7, 87, 8, 9 |
28、排序字典(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 |
29、默认字典(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]" |
30、使用defaultdict代表tree
>>> 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 |
31、映射对象到唯一的计数数字(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 |
32、最大 & 最小元素(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] |
33、笛卡尔积(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)...0000000100100011010001010110011110001001101010111100110111101111 |
34、组合(itertools.combinations and itertools.combinations_with_replacement)
>>> for c in itertools.combinations([1, 2, 3, 4, 5], 3):... print "".join(str(x) for x in c)...123124125134135145234235245345>>> for c in itertools.combinations_with_replacement([1, 2, 3], 2):... print "".join(str(x) for x in c)...111213222333 |
35、排列(itertools.permutations)
>>> for p in itertools.permutations([1, 2, 3, 4]):... print "".join(str(x) for x in p)...123412431324134214231432213421432314234124132431312431423214324134123421412341324213423143124321 |
36、链接可遍历对象(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) |
37、根据给定的KEY分组(itertools.groupby)
>>> from operator import itemgetter>>> 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 " ".join(" ".join("{: <16}".format(s) for s in row) for row in rows)...>>> print_data(data)young myope no reduced noneyoung myope no normal softyoung myope yes reduced noneyoung myope yes normal hardyoung hypermetrope no reduced noneyoung hypermetrope no normal softyoung hypermetrope yes reduced noneyoung hypermetrope yes normal hardpre-presbyopic myope no reduced nonepre-presbyopic myope no normal softpre-presbyopic myope yes reduced nonepre-presbyopic myope yes normal hardpre-presbyopic hypermetrope no reduced nonepre-presbyopic hypermetrope no normal softpre-presbyopic hypermetrope yes reduced nonepre-presbyopic hypermetrope yes normal nonepresbyopic myope no reduced nonepresbyopic myope no normal nonepresbyopic myope yes reduced nonepresbyopic myope yes normal hardpresbyopic hypermetrope no reduced nonepresbyopic hypermetrope no normal softpresbyopic hypermetrope yes reduced nonepresbyopic hypermetrope yes normal none>>> data.sort(key=itemgetter(-1))>>> for value, group in itertools.groupby(data, lambda r: r[-1]):... print "-----------"... print "Group: " + value... print_data(group)...-----------Group: hardyoung myope yes normal hardyoung hypermetrope yes normal hardpre-presbyopic myope yes normal hardpresbyopic myope yes normal hard-----------Group: noneyoung myope no reduced noneyoung myope yes reduced noneyoung hypermetrope no reduced noneyoung hypermetrope yes reduced nonepre-presbyopic myope no reduced nonepre-presbyopic myope yes reduced nonepre-presbyopic hypermetrope no reduced nonepre-presbyopic hypermetrope yes reduced nonepre-presbyopic hypermetrope yes normal nonepresbyopic myope no reduced nonepresbyopic myope no normal nonepresbyopic myope yes reduced nonepresbyopic hypermetrope no reduced nonepresbyopic hypermetrope yes reduced nonepresbyopic hypermetrope yes normal none-----------Group: softyoung myope no normal softyoung hypermetrope no normal softpre-presbyopic myope no normal softpre-presbyopic hypermetrope no normal softpresbyopic hypermetrope no normal soft |
38、在任意目录启动HTTP服务
python -m SimpleHTTPServer 5000Serving HTTP on 0.0.0.0 port 5000 ... |
39、Python之禅
>>> import thisThe Zen of Python, by Tim PetersBeautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than complicated.Flat is better than nested.Sparse is better than dense.Readability counts.Special cases aren"t special enough to break the rules.Although practicality beats purity.Errors should never pass silently.Unless explicitly silenced.In the face of ambiguity, refuse the temptation to guess.There should be one-- and preferably only one --obvious way to do it.Although that way may not be obvious at first unless you"re Dutch.Now is better than never.Although never is often better than *right* now.If the implementation is hard to explain, it"s a bad idea.If the implementation is easy to explain, it may be a good idea.Namespaces are one honking great idea -- let"s do more of those! |
40、使用C风格的大括号代替Python缩进来表示作用域
>>> from __future__ import braces |
40个你可能不知道的Python的特点和技巧的更多相关文章
- 你所不知道的15个Axure使用技巧
你有用原型开发工具吗?如果有,那你用的是Axure还是别的? 从以前就喜欢使用Axure,主要是觉得它能清楚的表达设计的思路,还有交互的真实再现,能让看的人一目了然,昨天看了这篇博文,便更加确定Axu ...
- 你可能不知道的python
1.如何循环获得下标,使用 enumerate ints = ['a','b','c','d','e','f'] for idx, val in enumerate(ints): print idx, ...
- 你所不知道的Python奇技淫巧
有时候你会看到很Cool的Python代码,你惊讶于它的简洁,它的优雅,你不由自主地赞叹:竟然还能这样写.其实,这些优雅的代码都要归功于Python的特性,只要你能掌握这些Pythonic的技巧,你一 ...
- 不得不知道的Python字符串编码相关的知识
开发经常会遇到各种字符串编码的问题,例如报错SyntaxError: Non-ASCII character 'ascii' codec can't encode characters in posi ...
- 转:11个实用但你可能不知道的Python程序库
原文来自于:http://www.techug.com/11-python-libraries-you-might-not-know 目前,网上已有成千上万个Python包,但几乎没有人能够全部知道它 ...
- 11个实用但你可能不知道的Python程序库
目前,网上已有成千上万个Python包,但几乎没有人能够全部知道它们.单单PyPi上就有超过47000个包列表. 现在,越来越多的数据科学家开始使用Python,虽然他们从pandas,scikit- ...
- 【转载】不得不知道的Python字符串编码相关的知识
原文地址:http://www.cnblogs.com/Xjng/p/5093905.html 开发经常会遇到各种字符串编码的问题,例如报错SyntaxError: Non-ASCII charact ...
- 关于Python你不得不知道的Python语言特点
首先什么是语言?什么是编程? 准确来说是:定义计算机程序的语言,用来向计算机发送指令 个人理解: 语言:是一种交流的工具或者方式.比如我们的汉语普通话.各地的方言.外语中的英语.俄语.日语等.我们 ...
- 你可能不知道的 Python 技巧
英文 | Python Tips and Trick, You Haven't Already Seen 原作 | Martin Heinz (https://martinheinz.dev) 译者 ...
随机推荐
- ubuntu 16.04.3配置MinDoc的PDF导出功能
1. 安装 wkhtmltopdf,然后reboot sudo apt-get install wkhtmltopdf 2. 进入cd /usr/bin 测试一下,看目录下有没有pdf生成 wkhtm ...
- input框限制0开头的数字(0除外)
用到parseInt() 函数 parseInt() 函数可解析一个字符串,并返回一个整数 提示和注释 注释:只有字符串中的第一个数字会被返回. 注释:开头和结尾的空格是允许的. 提示:如果字符串的第 ...
- Python gevent学习笔记-2
在上一篇里面介绍了gevent的最主要的功能,先来来了解一下gevent里面一些更加高级的功能. 事件 事件是一种可以让greenlet进行异步通信的手段. ? 1 2 3 4 5 6 7 8 9 1 ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.1——设置项目参数
问题: 开发的时候经常需要向项目中添加一些额外的参数或者硬编码的值. 解决方案: 使用ext块设置公用的值.如果需要从build文件中移除这些值,可以将参数放到gradle.properties文件中 ...
- 《从零开始学Swift》学习笔记(Day 52)——Cocoa错误处理模式
原创文章,欢迎转载.转载请注明:关东升的博客 Swift错误处理模式,在Swift 1.x和Swift 2.0是不同的两种模式. Swift 1.x代码错误处理模式采用Cocoa框架错误处理模式,到现 ...
- Young Maids
E - Young Maids Time limit : 2sec / Memory limit : 256MB Score : 800 points Problem Statement Let N ...
- Building Shops
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...
- python中静态方法、类方法、属性方法区别
在python中,静态方法.类方法.属性方法,刚接触对于它们之间的区别确实让人疑惑. 类方法(@classmethod) 是一个函数修饰符,表是该函数是一个类方法 类方法第一个参数是cls,而实例方法 ...
- .NET调用JAVA的WebService方法
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,在网上也有相关资料, ...
- ActiveMQ5.10.2版本配置JMX
ActiveMQ的特性之一是很好的支持JMX.通过JMX MBeans可以很方便的监听和控制ActiveMQ的broker. 鉴于官方网站提供的JMX特性说明对于远程访问的配置流程不是很完整,笔者在实 ...