Python 10 个极简用法,第五期

今天带来 Python 10 个极简用法,第五期。

前四期在这里:

Python 10 个习惯用法,第一期

Python 10 个习惯用法,第二期

Python 10 个习惯用法,第三期

Python 10 个极简用法,第四期

1 文档字符串

说明函数的功能和用法,使用一对 """,用法如下:

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    '

2 函数标注

函数的参数被标注后,我们便能一眼识别出其类型和默认参数值等, 还是以上面函数为例:

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}

3 Python 实现栈

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),不用写索引参数等。

4 Python 实现队列

如果说 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])

这样实现队列的后进后出、先进先出的特性,模拟了队列只能在两头添加、删除元素的特点。

5 嵌套列表生成式

列表生成式高效,同时也可嵌套,注意不要嵌套太深:

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.

6 按索引删除

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]

7 一键打包

Python 的简洁处处可见,等号右侧多个值,一个等号便可直接把它打包:

In [34]: t = 1,'zglg','shandong',(172,5000)

In [35]: t
Out[35]: (1, 'zglg', 'shandong', (172, 5000))

打包成元组,这个数据结构。

8 连串比较

Python 支持连串的不等式比较,使用方便:

In [36]: def comp_range(x,ran=[0,1]):
    ...:     return filter(lambda e: 0<e<1, x) # 连串 0<e<1

In [38]: list(comp_range([-2.,1.5,0.3,0.1]))
Out[38]: [0.3, 0.1]

9 打印点划线

Python 打印点划线,直接乘以个数即可,非常方便:

In [39]: print('-'*18)
------------------

10 打印平方及立方表

字符串的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 的简洁之美。码字不易,点个在看。

如果你对算法感兴趣,想零入门算法,欢迎关注振哥的这个公众号:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值