社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

不可错过的 Python 的高阶玩法

Python绿色通道 • 3 年前 • 447 次点击  

↑ 关注 + 星标 ,每天学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刷题网站!



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/137085