40个你可能不知道的Python技巧附代码


Posted in Python onJanuary 29, 2020

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]
>>> a
1
>>> b
2
>>> c
3
>>> d
4

2、使用拆箱进行变量交换

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

3、扩展的拆箱(Python 3支持)

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

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)
>>> LASTTHREE
slice(-3, None, None)
>>> a[LASTTHREE]
[3, 4, 5]

11、遍历列表索引和值(enumerate)

>>> a = ["Hello", "world", "!"]
>>> for i, x in enumerate(a):
... print "{}: {}".format(i, x)
...
0: Hello
1: world
2: !

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: 1
c: 3
b: 2
d: 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)
>>> p
Point(x=4.0, y=2.0)
>>> p.x
4.0
>>> p.y
2.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 + q
Point(x=6.0, y=5.0)

23、Set & Set运算

>>> 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

24、Multisets运算(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})

25、列表中出现最多的元素(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)]

26、双向队列(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])

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)
...
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

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)
...
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

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)
...
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

35、排列(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

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 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=itemgetter(-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

38、在任意目录启动HTTP服务

python -m SimpleHTTPServer 5000
Serving HTTP on 0.0.0.0 port 5000 ...

39、Python之禅

>>> import this
The Zen of Python, by Tim Peters
 
Beautiful 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

这篇文章就介绍到这了,更多内容请查看相关文章。

Python 相关文章推荐
python list使用示例 list中找连续的数字
Jan 27 Python
python基础教程之获取本机ip数据包示例
Feb 10 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
Python tkinter事件高级用法实例
Jan 31 Python
Python定时任务sched模块用法示例
Jul 16 Python
python使用Matplotlib画饼图
Sep 25 Python
Python pandas DataFrame操作的实现代码
Jun 21 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
python pip如何手动安装二进制包
Sep 30 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 Python
golang中的空接口使用详解
Mar 30 Python
你可能不知道的Python 技巧小结
Jan 29 #Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 #Python
Python原始套接字编程实例解析
Jan 29 #Python
Python内置类型性能分析过程实例
Jan 29 #Python
python add_argument()用法解析
Jan 29 #Python
python使用ctypes调用扩展模块的实例方法
Jan 28 #Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 #Python
You might like
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
php实现无限级分类
2014/12/24 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
python实现的防DDoS脚本
2011/02/08 Python
python如何获取服务器硬件信息
2017/05/11 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python实现电子产品商店
2019/02/26 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
党校学习思想汇报
2014/01/06 职场文书
物理教学随笔感言
2014/02/22 职场文书
政府信息公开实施方案
2014/05/09 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
健康状况证明模板
2014/10/23 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
安全员岗位职责范本
2015/04/11 职场文书
会计入职心得体会
2016/01/22 职场文书
七年级语文教学反思
2016/03/03 职场文书