今天带来 Python 10 个极简用法,第五期。
前四期在这里:
Python 10 个习惯用法,第一期
Python 10 个习惯用法,第二期
Python 10 个习惯用法,第三期
Python 10 个极简用法,第四期
说明函数的功能和用法,使用一对 """
,用法如下:
def fdoc(x):
"""
filter 函数使用演示
找到列表x中所有奇数
"""
odd = filter(lambda e: e % 2, x)
for e in odd: # 找到奇数
print(e)
调用 fdoc:
In [2]: fdoc.__doc__
Out[2]: '\n filter 函数使用演示\n \n 找到列表x中所有奇数\n '
函数的参数被标注后,我们便能一眼识别出其类型和默认参数值等, 还是以上面函数为例:
def fannotate(x:list):
odd = filter(lambda e: e % 2, x)
for e in odd: # 找到奇数
print(e)
调用 fannotate 函数:
In [4]: fannotate.__annotations__
Out[4]: {'x': list}
Python 无栈(stack)这一数据结构,但 Python列表实当栈用极为方便。
In [5]: x = [1,3,5]
In [6]: x.append(2) # push 操作
In [7]: x
Out[7]: [1, 3, 5, 2]
In [8]: x.pop() # pop 操作
Out[8]: 2
In [9]: x
Out[9]: [1, 3, 5]
以上所有操作时间复杂度为 O(1),不用写索引参数等。
如果说 Python 列表天性为栈而生,那么模拟队列操作就显得极为力不从心。因为队列操作发生两端,若在队头移除一个元素,代价极高。
为此,Python 添加一个相对高级的数据结构deque
来模拟队列,它位于collections
模块中:
In [10]: from collections import deque
In [11]: queue = deque([1,3,5])
In [12]: queue.append(2) # 对尾添加元素
In [13]: queue
Out[13]: deque([1, 3, 5, 2])
In [14]: queue.popleft() #对头移除元素
Out[14]: 1
In [15]: queue
Out[15]: deque([3, 5, 2])
这样实现队列的后进后出、先进先出的特性,模拟了队列只能在两头添加、删除元素的特点。
列表生成式高效,同时也可嵌套,注意不要嵌套太深:
In [16]: a = [1,3,5]
In [17]: b = [2,4,6]
In [18]: [(i,j) for i in a for j in b] # 嵌套,j 为内层
Out[18]: [(1, 2), (1, 4), (1, 6), (3, 2), (3, 4), (3, 6), (5, 2), (5, 4), (5, 6)]
i 为外层 for, j 为内层 for.
Python 的 list 无按索引删除元素的接口,不过使用del
却能按照索引删除元素:
In [20]: a = [1,3,5,3]
In [21]: a.remove(3) #删除列表中第一个等于3的值
In [22]: a
Out[22]: [1, 5, 3]
In [23]: a = [1,3,5,3]
In [24]: del a[0] # 按照索引删除元素
In [25]: a
Out[25]: [3, 5, 3]
Python 的简洁处处可见,等号右侧多个值,一个等号便可直接把它打包:
In [34]: t = 1,'zglg','shandong',(172,5000)
In [35]: t
Out[35]: (1, 'zglg', 'shandong', (172, 5000))
打包成元组,这个数据结构。
Python 支持连串的不等式比较,使用方便:
In [36]: def comp_range(x,ran=[0,1]):
...: return filter(lambda e: 0
Python 打印点划线,直接乘以个数即可,非常方便:
In [39]: print('-'*18)
------------------
字符串的rjust
函数实现右对齐,如下打印平方及立方表,看到高度右对齐:
In [42]: for x in range(1,11):
...: print(repr(x).rjust(3),repr(x**2).rjust(3),repr(x**3).rjust(3))
...:
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
ljust
实现左对齐:
In [43]: for x in range(1,11):
...: print(repr(x).ljust(3),repr(x**2).ljust(3),repr(x**3).ljust(3))
...:
...:
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
以上就是本期 10 个 Python 极简用法,再次感受到 Python 的简洁之美。码字不易,点个在看。
如果你对算法感兴趣,想零入门算法,欢迎关注振哥的这个公众号: