Python賦值語句
- Python中的賦值語句的基本形式是在等號左邊寫賦值語句的目標汽馋。要賦值的對象位于右側(cè)。左側(cè)的目標可以是變量名或者元素圈盔。右側(cè)的對象可以是任何會計算得到的對象表達式豹芯。
- 賦值語句建立對象的引用,而不是賦值對象驱敲。
- Python會在首次將對象引用值賦給變量時創(chuàng)建其變量名铁蹈。一旦賦值后,每當(dāng)這個變量名出現(xiàn)在表達式時众眨,就會被其所引用的值取代
- 變量名在引用前必須先賦值握牧,禁止未進行賦值就的變量
- 隱式賦值應(yīng)用于模塊導(dǎo)入容诬、函數(shù)、類定義沿腰、for循環(huán)變量以及函數(shù)參數(shù)
賦值語句的形式
- 基本形式
spam = 'spam'
- 元組及列表分解賦值
spam,ham = 'yum','YUM'
[spam,ham] = ['yum','YUM']
- Python會按照位置把右邊的對象和左邊的目標從左至右相配對览徒,在執(zhí)行時會先在右邊制作元素的元素。
- 序列賦值
在新的Python版本中颂龙,元組及列表賦值語句已經(jīng)統(tǒng)一為現(xiàn)在的序列賦值語句——任何變量名的序列都可以賦值給任何值的序列习蓬。Python會按位置一次賦值一個元素
a,b,c,d='spam'
a賦值為's' b賦值為'p'
- 擴展的序列解包
python3中,一種新形式的序列賦值允許我們更靈活的選擇要賦值的一個序列的一個部分
a,*b='spam'
在這個賦值語句中措嵌,a匹配第一個字母躲叼,剩下的用于匹配b:a賦值為's',b賦值為'pam'
- 多目標賦值
spam=ham='lunch'
在這個語句中spam ham都會賦值成對相同的字符串對象'lunch'的引用
- 增強賦值語句
spam+=42
序列賦值
>>> nudge=1
>>> wink=2
>>> nudge,wink=wink,nudge
>>> nudge.wink
>>> nudge,wink
(2, 1)
賦值右側(cè)可以是任何類型的序列,只要長度相等即可
高級序列賦值語句模式
在Python3.0中可以允許我們使用更為通用的擴展解包語法,在python2.x中要求賦值目標中的項數(shù)和主體的數(shù)目必須一致:否則就會報錯
>>> string='SPAM'
>>> a,b,c,d = string
>>> a,d
('S', 'M')
>>> a,b,c
('S', 'P', 'A')
>>> a,b,c = string
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
如果想使用通用方法就需要使用分片铅匹。
>>> string = 'SPAM'
>>> a,b,c=string[0],string[1],string[2:]
>>> a,b,c
('S', 'P', 'AM')
>>> a,b,c = list(string[:2])+[string[2:]]
>>> a,b,c
('S', 'P', 'AM')
>>> (a,b),c = string[:2],string[2:]
>>> a,b,c
('S', 'P', 'AM')
>>>
在最后一個賦值中押赊,Python先把右邊的第一個字符串('SP')和左邊的第一個元組((a,b))配對,然后一次賦值一個字符包斑,接著再把第二個字符串('AM')一次賦值給變量c流礁。在這個過程中,左邊對象的序列嵌套的形狀必須符合右邊對象的形狀罗丰。
Python3.0中的擴展序列解包
在Python3.0中一個帶有單個星號的名稱神帅,可以在賦值目標中使用,以指定對于序列的一個更為通用的匹配
>>> seq = [1,2,3,4,5]
>>> a,*b = seq
>>> a
1
>>> b
[2, 3, 4, 5]
- 當(dāng)使用一個帶星號的名稱的時候萌抵,左邊的目標中的項數(shù)不需要與主體序列的長度匹配找御。帶星號的名稱可以出現(xiàn)在目標中的任何地方
>>> *a,b = seq
>>> a,b
([1, 2, 3, 4], 5)
b匹配序列中的最后一項,a匹配最后一項之前的所有內(nèi)容
- 當(dāng)帶星號的名稱出現(xiàn)在中間绍填,它收集其他列出的名稱之間的所有內(nèi)容
>>> a,*b,c = seq
>>> a
1
>>> b
[2, 3, 4]
>>> c
5
- 擴展的序列解包語法對于任何序列類型都有效霎桅。不只是對列表有效
邊界情況
帶星號的名稱可能只匹配單個的項
>>> seq
[1, 2, 3, 4, 5]
>>> a,b,c,*d=seq
>>> print(a,b,c,d)
1 2 3 [4, 5]
- 如果沒有剩下的內(nèi)容可以匹配帶星號的名稱,它會賦值一個空的列表讨永。不管該名稱出現(xiàn)在哪里
>>> a,b,c,d,e,*f=seq
>>> print(a,b,c,d,e,f)
1 2 3 4 5 []
- 如果有多個帶星號的名稱滔驶,或者如果值少了而沒有帶星號的名稱,以及如果帶星號的名稱自身沒有編寫到一個列表中卿闹,將會引發(fā)錯誤
應(yīng)用于for循環(huán)
>>> for (a,*b,c) in [(1,2,3,4),(5,6,7,8)]:
... print(a,b,c)
1 [2, 3] 4
5 [6, 7] 8
增強賦值語句
X+=Y X&=Y X-=Y X|=Y
X =Y X^=Y X/=Y X>>=Y
X%=Y X<<=Y X*=Y X//=Y
增強賦值語句的有點
- 輸入減少揭糕,減少代碼量
- 左側(cè)只需要計算一次,在X+=Y中锻霎,X可以是復(fù)雜的對象表達式著角。在增強形式中,則只需計算一次旋恼,然而吏口,在完整形式X=X+Y中,X出現(xiàn)兩次,必須執(zhí)行兩次
- 優(yōu)化技術(shù)自動選擇锨侯,對于支持原處修改的對象而言嫩海,增強形式會自動執(zhí)行原處的修改運算。而不是使用相對來說速度更慢的復(fù)制
增強賦值以及共享引用
對于增強賦值語句囚痴,對列表是做原處修改的意思叁怪。而'+'總是生成新對象。
>>> M = [1,2]
>>> L = M
>>> L = L +[3,4]
>>> L,M
([1, 2, 3, 4], [1, 2])
上述的例子中深滚,由于'+'會生成一個新的列表對象奕谭,所以M的值并沒有發(fā)生改變
>>> M = [1,2]
>>> L = M
>>> L+=[3,4]
>>> L,M
([1, 2, 3, 4], [1, 2, 3, 4])
猶豫增強賦值對于可變的數(shù)據(jù)類型時在原處修改值,所以使M的值發(fā)生了變化
Python表達式語句
表達式語句和在原處的修改
對列表調(diào)用append痴荐、sort血柳、reverse這類在原處修改的運算,一定是對列表做原處的修改生兆,但這些方法在列表修改后并不會把列表返回难捌,而是返回的None對象
>>> L = [1,2]
>>> L.append(3)
>>> L
[1, 2, 3]
>>> L.extend([4,5,6])
>>> L
[1, 2, 3, 4, 5, 6]
>>> L = L.append(7)
>>> L
>>> print(L)
None
打印操作
print默認的把對象打印到stdout流,添加了一些格式化鸦难。
Python2.X Python3打印的差異
- 在Python3中根吁,打印是一個內(nèi)置函數(shù),用關(guān)鍵字參數(shù)來表示特定模式
- 在Python2.X中合蔽,打印是語句击敌。擁有自己的特定語法
Python3 print函數(shù)
調(diào)用格式
print([object,...],[sep=' '][,end='\n'][,file=sys,stdout])
格式中sep、end拴事、和file部分如果給出的話沃斤,必須作為關(guān)鍵字參數(shù)給定。必須使用一種特殊的"name = value"語法來根據(jù)名稱而不是根據(jù)位置來傳遞參數(shù)刃宵。
- sep是每個對象的文本之間插入一個字符串衡瓶,如果沒有傳遞的話默認是一個單個的空格
- end是添加在打印文本末尾的一個字符串,如果沒有傳遞的話牲证,默認是一個'\n'換行
- file指定了文本將要發(fā)送到的文件鞍陨。如果沒有指定的話默認會發(fā)送到標準的輸入輸出sys.stdout
Pyton3的print函數(shù)的應(yīng)用
>>> x='spam'
>>> y=99
>>> z=['eggs']
>>> print(x,y,z)
spam 99 ['eggs']
>>> print(x,y,z,sep='')
spam99['eggs']
>>> print(x,y,z,sep='%')
spam%99%['eggs']
>>> print(x,y,z,sep=' ',end='')
spam 99 ['eggs']>>>
>>> print(x,y,z,sep=' ',end='\n')
spam 99 ['eggs']
打印流重定向
在Python3.0和Python2.6中,打印都默認地發(fā)送到標準輸出流从隆。也可以發(fā)送到一個文本文件’
print只是Python的人性化的特性,它提供了sys.stdout對象的簡單接口
>>> import sys
>>> sys.stdout.write('hello world\n')
hello world
12
將輸出流重定向到文件后print語句直接打印內(nèi)容到文件
>>> import sys
>>> sys.stdout = open('/tmp/log.txt','a')
>>> x=[1,2,3,4]
>>> y='hello'
>>> z=136
>>> print(x,y,z)