掌握這些Python的高級用法,讓代碼更可讀、運行更高效!
??點擊“博文視點Broadview”,獲取更多書訊

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ù)的特性也可以擴(kuò)展到命名參數(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:?100?b : 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]]
以上內(nèi)容節(jié)選自《高階Python:代碼精進(jìn)之路》一書,歡迎閱讀本書學(xué)習(xí)更多Python的高級技巧。


▊《高階Python:代碼精進(jìn)之路》
[美]?Brian,Overland(布賴恩?歐弗蘭),John,Bennett(約翰?班納特) 著
李輝?譯
本書開發(fā)了一個“RPN腳本解釋器”項目,該項目貫穿本書的各個章節(jié),通過對該項目的學(xué)習(xí),你也可以開發(fā)出自己的“語言”
本書詳細(xì)地介紹了Python語言的一些高級功能以及常見數(shù)據(jù)類型的高級用法,非常適合有一定基礎(chǔ)的讀者深入學(xué)習(xí)Python編程。本書的主要內(nèi)容包括常見內(nèi)置類型(數(shù)值、字符串和集合等)的高級用法和潛在的陷阱,用于文本處理的格式化方法和正則表達(dá)式,用于數(shù)值計算和大規(guī)模數(shù)據(jù)處理的math包和numpy包等。此外,文件存儲、隨機數(shù)生成和圖表繪制也是本書的重要內(nèi)容。
(掃碼查看本書詳情!)
?
如果喜歡本文 歡迎?在看丨留言丨分享至朋友圈?三連 ?熱文推薦??
▼點擊閱讀原文,了解本書詳情~
