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格式化压缩后的JS文件的方法
Mar 05 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
一道python走迷宫算法题
Jan 22 Python
python实现装饰器、描述符
Feb 28 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
python得到windows自启动列表的方法
Oct 14 Python
python 执行终端/控制台命令的例子
Jul 12 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
增大python字体的方法步骤
Jul 05 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 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
PHPExcel简单读取excel文件示例
2016/05/26 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PDO::_construct讲解
2019/01/27 PHP
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
Ajax基础知识详解
2017/02/17 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
简单的Python2.7编程初学经验总结
2015/04/01 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
RC4文件加密的python实现方法
2015/06/30 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
应届大学生自荐信格式
2013/09/21 职场文书
教师年终个人自我评价
2013/10/04 职场文书
店长岗位的工作内容
2013/11/12 职场文书
优秀中职教师事迹材料
2014/08/26 职场文书
丽江古城导游词
2015/02/03 职场文书
python 如何做一个识别率百分百的OCR
2021/05/29 Python
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android