Python語句
Python的語法實際上是由語句和表達(dá)式組成的(語句使用關(guān)鍵字來組成,只執(zhí)行某種操作,可以沒有返回值霞怀;而表達(dá)式?jīng)]有關(guān)鍵字,是使用數(shù)學(xué)運(yùn)算符構(gòu)成的算數(shù)表達(dá)式莉给,是一個單純的運(yùn)算求值過程毙石,總是返回值。表達(dá)式本身可以作為表達(dá)式語句颓遏,也能作為賦值語句的右值或if語句的條件等徐矩,所以表達(dá)式可以作為語句的組成部分,但不是必須成分)叁幢。表達(dá)式處理對象并嵌套在語句中丧蘸,語句編碼操作實現(xiàn)程序的邏輯關(guān)系。語句還是對象生成的地方遥皂。
簡單語句
簡單語句由一個邏輯行構(gòu)成,在由分號分隔的單個物理行上可能存在幾個簡單語句刽漂。常見的簡單語句有賦值語句演训、表達(dá)式語句、assert 語句贝咙、del 語句样悟、break 語句、continue 語句等。這里我們只簡單的介紹表達(dá)式語句窟她、賦值語句和del 語句陈症,其他語句會在后續(xù)對應(yīng)的章節(jié)詳細(xì)介紹。
一震糖、賦值語句
賦值語句用于(重新)將對象綁定到變量录肯,以及修改可變對象的屬性或項目。
Python賦值語句會把對象的引用存儲在變量名或數(shù)據(jù)結(jié)構(gòu)的元素內(nèi)吊说。賦值語句總是建立對象的引用值论咏,而不是復(fù)制對象。因此颁井,Python的變量更像是指針(引用)厅贪,而不是數(shù)據(jù)存儲區(qū)域。
Python會在首次將值(即對象的引用)賦值給變量時創(chuàng)建其變量名雅宾。有些(并非全部)數(shù)據(jù)結(jié)構(gòu)元素也會在賦值時創(chuàng)建养涮。一旦賦值了,每當(dāng)這個變量名出現(xiàn)在表達(dá)式中眉抬,就會被其所引用的值取代贯吓。變量名在引用前必須先賦值,使用尚未進(jìn)行賦值的變量名是一種錯誤吐辙。
本節(jié)中宣决,我們關(guān)心的是 =
語句,但是在Python中昏苏,賦值語句有一些隱性的操作尊沸。例如,模塊導(dǎo)入贤惯、函數(shù)和類的定義洼专、for循環(huán)變量以及函數(shù)參數(shù)全都是隱式賦值運(yùn)算。因為賦值語句在任何出現(xiàn)的地方的工作原理都相同孵构,所有這些方式都是在運(yùn)行時把變量名和對象的引用綁定起來而已屁商。
1、基本形式(將對象賦值到單個目標(biāo))
目標(biāo)是變量名:
如果變量名沒有出現(xiàn)在當(dāng)前代碼塊的 global 或 nonlocal 語句中:變量名綁定到當(dāng)前局部命名空間中的對象颈墅。否則:變量名綁定到當(dāng)前全局命名空間的對象或由 nonlocal 決定的外部命名空間蜡镶。
如果名稱已綁定,則名稱將使用新的對象重新被綁定恤筛。這可能導(dǎo)致先前綁定到名稱的對象的引用計數(shù)達(dá)到零官还,導(dǎo)致對象被釋放,并且它的析構(gòu)函數(shù)(如果它有一個)被調(diào)用毒坛。目標(biāo)是屬性引用(對象):
引用中的主表達(dá)式是計算望伦。它產(chǎn)生的對象應(yīng)該具有一個可以賦值的屬性林说;如果情況不是這樣,則拋出 TypeError 異常屯伞。然后要求該對象將被賦值的對象賦值給給定的屬性腿箩;如果不能做此操作,它會拋出一個異常(通常是AttributeError劣摇,但不一定)珠移。2拜姿、多目標(biāo)賦值
Python賦值對象的引用值(最右邊的對象)給左邊的所有目標(biāo)扔傅。3、序列賦值
在Python中 = 左側(cè)可以接收編寫在元組或列表中的變量谣蠢, = 右側(cè)可以接受使任何類型的序列滑潘,只要和左側(cè)序列元素長度相等即可垢乙,不然會產(chǎn)生錯誤。Python會按照位置把右側(cè)序列中的元素和左側(cè)序列中的變量從左至右相匹配语卤,然后每一次賦值一個值追逮。擴(kuò)展的序列賦值
序列賦值通常要求左側(cè)變量數(shù)目與右側(cè)主體的項數(shù)完全一致堰塌。如果長度不同的話赵刑,將會得到一個錯誤。但是一個帶有星號的變量场刑,可以在賦值目標(biāo)中使用般此,以指定對于序列的一個更為通用的匹配 —— 將一個列表賦值給了帶星號的名稱,該列表收集了序列中沒有賦值給其他變量的所有項牵现。注意: 如果有多個帶星號的名稱,或者如果值少與沒有帶星號的名稱腻异,以及帶星號的名稱自身沒有編寫到一個列表或元祖中进副,都將引發(fā)錯誤。
4悔常、增強(qiáng)賦值語句
增強(qiáng)賦值是在單個語句中組合運(yùn)算符的賦值語句:在Python中影斑,每個二元表達(dá)式運(yùn)算符都有對應(yīng)的增強(qiáng)賦值形式:
X += Y, X -= Y机打, X *= Y矫户, X /= Y, X //= Y残邀, X %= Y皆辽,
X **= Y,X &= Y芥挣,X |= Y驱闷, X ^= Y, X <<= Y空免,X >>= Y
增強(qiáng)賦值語句有三個優(yōu)點:
1空另、程序員輸入減少。
2蹋砚、左側(cè)只需計算一次扼菠,因此增強(qiáng)賦值語句通常執(zhí)行的更快(在完整形式 X = X + Y 中,X出現(xiàn)兩次都弹,必須執(zhí)行兩次)娇豫。
與正常賦值不同,增強(qiáng)的賦值在計算右側(cè)之前計算左側(cè)畅厢。例如冯痢,a[i] += f(x)首先查找a [i ],然后求值f(x)并執(zhí)行加法框杜,最后浦楣,將結(jié)果寫回到a[i]。3咪辱、優(yōu)化技術(shù)會自動選擇振劳。
對于支持原處修改的對象而言,增強(qiáng)形式會自動執(zhí)行原處的修改運(yùn)算油狂,而不是相比來說速度更慢的復(fù)制历恐。
就增強(qiáng)賦值運(yùn)算而言寸癌,在原處的運(yùn)算可作為一種優(yōu)化而應(yīng)用在可變對象上。合并對于共享對象引用產(chǎn)生的副作用可能會更少弱贼,但是蒸苇,通常會比對等的原處修改形式運(yùn)行的更慢。合并操作必須創(chuàng)建一個新的對象吮旅,把左側(cè)的賦值到列表中溪烤,然后再把右側(cè)的賦值到列表中。想必而言庇勃,原處方法調(diào)用直接在一個內(nèi)存塊末尾添加項檬嘀。二、表達(dá)式語句
表達(dá)式語句用于計算和寫入一個值责嚷,或者(通常)用來調(diào)用函數(shù)或方法鸳兽。
三棍鳖、del 語句
刪除是遞歸的,刪除目標(biāo)列表將遞歸刪除列表中的每個對象碗旅,從左到右渡处。
刪除一個變量將從局部或全局命名空間中刪除該變量的綁定,取決于變量是否出現(xiàn)在相同代碼塊的global 語句中祟辟。如果變量沒有綁定医瘫,將拋出一個NameError 異常。
屬性引用旧困、下標(biāo)和切片的刪除將傳遞給原始的對象醇份;切片的刪除在一般情況下等同于賦予一個右邊類型的空切片(但即使這點也是由切片的對象決定)。
《Python基礎(chǔ)手冊》系列:
Python基礎(chǔ)手冊 1 —— Python語言介紹
Python基礎(chǔ)手冊 2 —— Python 環(huán)境搭建(Linux)
Python基礎(chǔ)手冊 3 —— Python解釋器
Python基礎(chǔ)手冊 4 —— 文本結(jié)構(gòu)
Python基礎(chǔ)手冊 5 —— 標(biāo)識符和關(guān)鍵字
Python基礎(chǔ)手冊 6 —— 操作符
Python基礎(chǔ)手冊 7 —— 內(nèi)建函數(shù)
Python基礎(chǔ)手冊 8 —— Python對象
Python基礎(chǔ)手冊 9 —— 數(shù)字類型
Python基礎(chǔ)手冊10 —— 序列(字符串)
Python基礎(chǔ)手冊11 —— 序列(元組&列表)
Python基礎(chǔ)手冊12 —— 序列(類型操作)
Python基礎(chǔ)手冊13 —— 映射(字典)
Python基礎(chǔ)手冊14 —— 集合
Python基礎(chǔ)手冊15 —— 解析
Python基礎(chǔ)手冊16 —— 文件
Python基礎(chǔ)手冊17 —— 簡單語句
Python基礎(chǔ)手冊18 —— 復(fù)合語句(流程控制語句)
Python基礎(chǔ)手冊19 —— 迭代器
Python基礎(chǔ)手冊20 —— 生成器
Python基礎(chǔ)手冊21 —— 函數(shù)的定義
Python基礎(chǔ)手冊22 —— 函數(shù)的參數(shù)
Python基礎(chǔ)手冊23 —— 函數(shù)的調(diào)用
Python基礎(chǔ)手冊24 —— 函數(shù)中變量的作用域
Python基礎(chǔ)手冊25 —— 裝飾器
Python基礎(chǔ)手冊26 —— 錯誤 & 異常
Python基礎(chǔ)手冊27 —— 模塊
Python基礎(chǔ)手冊28 —— 模塊的高級概念
Python基礎(chǔ)手冊29 —— 包