不可錯過的 Python 的高階玩法
↑ 關(guān)注 + 星標(biāo) ,每天學(xué)Python新技能
后臺回復(fù)【大禮包】送你Python自學(xué)大禮包
Python 是世界上最流行的編程語言(TIOBE Index for April 2022),它易于上手且多才多藝,除了用于神經(jīng)網(wǎng)絡(luò)的構(gòu)建外, 還能用來創(chuàng)建Web應(yīng)用、桌面應(yīng)用、游戲和運維腳本等多種多樣的程序。
Python 語言語法簡潔,易于上手, 但當(dāng)你深入研究時, 會發(fā)現(xiàn) Python 有很多高級用法,這些高級用法可以大幅度提高代碼的可讀性和運行效率。
此外, Python 包含了海量的高質(zhì)量第三方庫, 許多重要的庫已經(jīng)成為 Python 開發(fā)不可或缺的內(nèi)容。
《高階 Python:代碼精進(jìn)之路》一書可以幫你掌握 Python 語言的高級特性,以及 Python 科學(xué)計算基石——numpy 的使用方法(numpy 的 API 設(shè)計非常優(yōu)秀,深度學(xué)習(xí)框架 TensorFlow、PyTorch 都使用了 numpy 相似的 API,并且可以和 numpy 混用)。

下面介紹幾個 Python 的高級用法。
Python 列表的索引和切片是非常強大的功能, 它們可以讓你在 Python 中獲取列表中的任意元素。除了支持常見的正索引外, Python 還支持負(fù)索引和切片。
正索引
a_list = [100, 200, 300, 400, 500, 600]print(a_list[0]) # 輸出 100.print(a_list[1]) # 輸出 200.print(a_list[2]) # 輸出 300.
負(fù)索引
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]
字符串格式化在命令行工具開發(fā)中非常重要, str 類包含基礎(chǔ)的,用于文本對齊的方法:左對齊,右對齊或居中對齊。
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:代碼精進(jìn)之路》一書中還介紹了許多更復(fù)雜的格式化方法。
Python 2.0 版本引入的最重要的功能之一就是列表推導(dǎo)式。它提供了一種從列表中生成一系列值的緊湊語法。它也可以應(yīng)用于字典,集合(set)和其他類型的集合。
假設(shè)你要創(chuàng)建一個包含 a_list 中每個元素的平方的新列表,一種可能的實現(xiàn)方式如下:
b_list = [ ]for i in a_list:b_list.append(i * i)
如果 a_list 包含元素 [1,2,3],則這些語句的結(jié)果是創(chuàng)建一個包含 [1,4,9] 的新列表,并將此列表分配給變量 b_list。在這種情況下,相應(yīng)的列表推導(dǎo)式如下所示:
b_list = [i * i for i in a_list]假設(shè)想講一個元組列表轉(zhuǎn)換為字典,元組列表如下:
vals_list = [ ('pi', 3.14), ('phi', 1.618) ]字典可以用下面的代碼生成:
my_dict = { i[0]: i[1] for i in vals_list }注意在鍵值表達(dá)式(i[0]:i[1])中冒號(:)的使用。
Python 最通用的功能之一就是能夠訪問可變長度參數(shù)的列表。借助此功能,你的函數(shù)可以處理任意數(shù)量的參數(shù),就像內(nèi)置的 print 函數(shù)一樣。可變長參數(shù)的特性也可以擴展到命名參數(shù)。
def func_name([ordinary_args,] *args):statements
這里的中括號表示 *args 前面可以有任意數(shù)量的普通參數(shù),在此表示為 ordinary_args。此類參數(shù)是可選的。下面是示例代碼:
def my_var_func(*args):print('The number of args is', len(args))for item in args:print(items)
此函數(shù) my_var_func 可接受任意長度的參數(shù)列表。
my_var_func(10, 20, 30, 40)The number of args is 410203040
可變長參數(shù)列表還支持關(guān)鍵字參數(shù),如下所示:
def pr_named_vals(**kwargs):for k in kwargs:print(k, ':', kwargs[k])
上面的函數(shù)遍歷了 kwargs 表示的字典參數(shù),打印出傳入?yún)?shù)的鍵(對應(yīng)于參數(shù)名稱)和對應(yīng)的值。
For example:pr_named_vals(a=10, b=20, c=30)a : 10b : 20c : 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)
運行時,此程序?qū)⒋蛴∫韵聝?nèi)容:
123: 100b : 200
線性代數(shù)運算在深度學(xué)習(xí)中非常重要,numpy 庫為 Python 提供了高效的線性代數(shù)運算模塊。
numpy 的線性代數(shù)模塊非常完備,以計算點積為例進(jìn)行介紹。
使用 numpy 時,可以使用點積函數(shù) dot 計算點積。
numpy.dot(A, B, out=None)A 和 B 是要進(jìn)行點積運算的兩個數(shù)組;out 參數(shù)(如果已指定)是用于存儲結(jié)果的正確形狀的數(shù)組,“正確形狀”取決于 A 和 B 的形狀。
兩個一維數(shù)組的點積很簡單。數(shù)組的長度必須相同。點積計算是將 A 中的每個元素與其 B 中的對應(yīng)元素相乘,然后對這些乘積求和,得出一個標(biāo)量值。
D. P. = A[0]*B[0] + A[1]*B[1] + ... + A[N-1] * B[N-1]
例子:
import numpy as npA = 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.0np.dot(A, B)10.0np.dot(B, B)30
二維矩陣之間的點積比較復(fù)雜。與數(shù)組之間的普通乘法一樣,兩個數(shù)組的形狀必須兼容,但這只需要在其中一個維度上相等即可。
下面是描述點積應(yīng)用到二維數(shù)組通用模式:
(A, B) * (B, C) => (A, C)思考下面的 2×3 數(shù)組,再結(jié)合一個 3×2 數(shù)組,其點積是 2×2 數(shù)組。
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]]


