不可错过的 Python 的高阶玩法

共 3946字,需浏览 8分钟

 ·

2022-07-10 14:52

↑ 关注 + 星标 ,每天学Python新技能

后台回复【大礼包】送你Python自学大礼包

来源:Python 编程时光


Python 是世界上最流行的编程语言(TIOBE Index for April 2022),它易于上手且多才多艺,除了用于神经网络的构建外, 还能用来创建Web应用、桌面应用、游戏和运维脚本等多种多样的程序。

Python 语言语法简洁,易于上手, 但当你深入研究时, 会发现 Python 有很多高级用法,这些高级用法可以大幅度提高代码的可读性和运行效率。

此外, Python 包含了海量的高质量第三方库, 许多重要的库已经成为 Python 开发不可或缺的内容。

《高阶 Python:代码精进之路》一书可以帮你掌握 Python 语言的高级特性,以及 Python 科学计算基石——numpy 的使用方法(numpy 的 API 设计非常优秀,深度学习框架 TensorFlow、PyTorch 都使用了 numpy 相似的 API,并且可以和 numpy 混用)。

下面介绍几个 Python 的高级用法。


01

索引和切片

Python 列表的索引和切片是非常强大的功能, 它们可以让你在 Python 中获取列表中的任意元素。除了支持常见的正索引外, Python 还支持负索引和切片。

正索引

   a_list = [100, 200, 300, 400, 500, 600]     print(a_list[0])      # 输出 100.     print(a_list[1])      # 输出 200.     print(a_list[2])      # 输出 300.

负索引

   a_list = [100, 200, 300, 400, 500, 600]     print(a_list[-1])     # 输出 600.     print(a_list[-3])     # 输出 400.

切片

以下是列表切片的一些示例:

   a_list = [1, 2, 5, 10, 20, 30] 
b_list = a_list[1:3] # 生成 [2, 5] c_list = a_list[4:] # 生成 [20, 30] d_list = a_list[-4:-1] # 生成 [5, 10, 20] e_list = a_list[-1:] # 生成 [30]


02

字符串对齐

字符串格式化在命令行工具开发中非常重要, str 类包含基础的,用于文本对齐的方法:左对齐,右对齐或居中对齐。

str.ljust(width [, fillchar])    # 左对齐str.rjust(width [, fillchar])    # 右对齐 str.center(width [, fillchar])   # 中间对齐 digit_str.zfill(width)           # 用“0”填充

下面是一些例子:

new_str = 'Help!'.center(10, '#') print(new_str)

该例的输出为:

##Help!###


new_str = '750'.rjust(6, '0') print(new_str)

此例的输出为:

000750

上例只是一个简单的字符串格式化样例,《高阶 Python:代码精进之路》一书中还介绍了许多更复杂的格式化方法。


03

列表推导式&字典推导式

Python 2.0 版本引入的最重要的功能之一就是列表推导式。它提供了一种从列表中生成一系列值的紧凑语法。它也可以应用于字典,集合(set)和其他类型的集合。

假设你要创建一个包含 a_list 中每个元素的平方的新列表,一种可能的实现方式如下:

   b_list = [ ]     for i in a_list:         b_list.append(i * i)

如果 a_list 包含元素 [1,2,3],则这些语句的结果是创建一个包含 [1,4,9] 的新列表,并将此列表分配给变量 b_list。在这种情况下,相应的列表推导式如下所示:

   b_list = [i * i   for i in a_list]

假设想讲一个元组列表转换为字典,元组列表如下:

   vals_list = [ ('pi', 3.14), ('phi', 1.618) ]

字典可以用下面的代码生成:

   my_dict = { i[0]: i[1] for i in vals_list }

注意在键值表达式(i[0]:i[1])中冒号(:)的使用。


04

可变长参数列表

Python 最通用的功能之一就是能够访问可变长度参数的列表。借助此功能,你的函数可以处理任意数量的参数,就像内置的 print 函数一样。可变长参数的特性也可以扩展到命名参数。

   def func_name([ordinary_args,] *args):         statements

这里的中括号表示 *args 前面可以有任意数量的普通参数,在此表示为 ordinary_args。此类参数是可选的。下面是示例代码:

   def my_var_func(*args):         print('The number of args is', len(args))         for item in args:             print(items)

此函数 my_var_func 可接受任意长度的参数列表。

   >>> my_var_func(10, 20, 30, 40)     The number of args is 4     10     20     30     40

可变长参数列表还支持关键字参数,如下所示:

   def pr_named_vals(**kwargs):         for k in kwargs:             print(k, ':', kwargs[k])

上面的函数遍历了 kwargs 表示的字典参数,打印出传入参数的键(对应于参数名称)和对应的值。

   For example:     >>> pr_named_vals(a=10, b=20, c=30)     a : 10     b : 20     c : 30

args 和 kwargs 可以组合使用,下面是一个例子。

   def pr_vals_2(*args, **kwargs):         for i in args:             print(i)         for k in kwargs:             print(k, ':', kwargs[k]) 
pr_vals_2(1, 2, 3, -4, a=100, b=200)

运行时,此程序将打印以下内容:

   1    2    3    -4    a : 100    b : 200


05

使用 numpy 进行线性代数运算

线性代数运算在深度学习中非常重要,numpy 库为 Python 提供了高效的线性代数运算模块。

numpy 的线性代数模块非常完备,以计算点积为例进行介绍。

使用 numpy 时,可以使用点积函数 dot 计算点积。

numpy.dot(A, B, out=None)

A 和 B 是要进行点积运算的两个数组;out 参数(如果已指定)是用于存储结果的正确形状的数组,“正确形状”取决于 A 和 B 的形状。

两个一维数组的点积很简单。数组的长度必须相同。点积计算是将 A 中的每个元素与其 B 中的对应元素相乘,然后对这些乘积求和,得出一个标量值。

D. P. = A[0]*B[0] + A[1]*B[1] + ... + A[N-1] * B[N-1]


例子:

import numpy as np  A = np.ones(5)  B = np.arange(5)  print(A, B)  [1. 1. 1. 1. 1.] [0 1 2 3 4]  np.dot(A, A)  5.0  np.dot(A, B)  10.0  np.dot(B, B)  30

二维矩阵之间的点积比较复杂。与数组之间的普通乘法一样,两个数组的形状必须兼容,但这只需要在其中一个维度上相等即可。

下面是描述点积应用到二维数组通用模式:

(A, B) * (B, C) => (A, C)

思考下面的 2×3 数组,再结合一个 3×2 数组,其点积是 2×2 数组。

A = np.arange(6).reshape(2,3)  B = np.arange(6).reshape(3,2)  C = np.dot(A, B)  print(A, B, sep='\n\n')  print('\nDot product:\n', C)[[0 1 2]  [3 4 5]]
[[0 1] [2 3] [4 5]]
Dot product: [[10 13] [28 40]]









  1. 1885页学习资料。一本在手,python不愁!

  2. 当Pandas撞上了SQL,于是一个强大的pandasql库产生了!

  3. 卧槽,这才是最强Python刷题网站!



浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报