使用#注釋:
在Python中使用#進(jìn)行標(biāo)識(shí)注釋,從#開(kāi)始到當(dāng)前行結(jié)束的部分都是注釋。注釋只對(duì)當(dāng)前行起作用,并且Python沒(méi)有多行注釋。但是,如果出現(xiàn)在文本串中,將回歸普通字符#的角色。
使用\連接:
一行程序最大長(zhǎng)度建議80字符。如果一行代碼寫不完,可以使用連接符\ (反斜線)把它放在一行的結(jié)束位置,Python仍然將其解釋為一行。
使用if語(yǔ)句判斷:
計(jì)算機(jī)之所以能做很多自動(dòng)化的任務(wù),因?yàn)樗梢宰约鹤鰲l件判斷。
比如,輸入用戶年齡,根據(jù)年齡打印不同的內(nèi)容,在Python程序中,可以用if語(yǔ)句實(shí)現(xiàn):
age = 20
if age >= 18:
print ('your age is', age)
print ('adult')
print ('END')
注意:Python代碼的縮進(jìn)規(guī)則。具有相同縮進(jìn)的代碼被視為代碼塊,上面的3,4行 print 語(yǔ)句就構(gòu)成一個(gè)代碼塊(但不包括第5行的print)。如果 if 語(yǔ)句判斷為 True,就會(huì)執(zhí)行這個(gè)代碼塊。
縮進(jìn)請(qǐng)嚴(yán)格按照Python的習(xí)慣寫法:4個(gè)空格,不要使用Tab,更不要混合Tab和空格,否則很容易造成因?yàn)榭s進(jìn)引起的語(yǔ)法錯(cuò)誤。
注意:if 語(yǔ)句后接表達(dá)式,然后用:表示代碼塊開(kāi)始。
如果你在Python交互環(huán)境下敲代碼,還要特別留意縮進(jìn),并且退出縮進(jìn)需要多敲一行回車:
>>> age = 20
>>> if age >= 18:
... ? ? print ('your age is', age)
... ? ? print ('adult')
使用if-else進(jìn)行判斷:
當(dāng) if 語(yǔ)句判斷表達(dá)式的結(jié)果為 True 時(shí),就會(huì)執(zhí)行 if 包含的代碼塊:
if age >= 18:
print ('adult')
如果我們想判斷年齡在18歲以下時(shí),打印出 'teenager',怎么辦?
方法是再寫一個(gè) if:
if age < 18:
print ('teenager')
或者用 not 運(yùn)算:
if not age >= 18:
print ('teenager')
細(xì)心的同學(xué)可以發(fā)現(xiàn),這兩種條件判斷是“非此即彼”的,要么符合條件1,要么符合條件2,因此,完全可以用一個(gè) if ... else ... 語(yǔ)句把它們統(tǒng)一起來(lái):
if age >= 18:
print ('adult')
else:
print ('teenager')
利用 if ... else ... 語(yǔ)句,我們可以根據(jù)條件表達(dá)式的值為 True 或者 False ,分別執(zhí)行 if 代碼塊或者 else 代碼塊。
注意: else 后面有個(gè)“:”。
Python中的常見(jiàn)的比較操作符:
相等 ==
不相等 ?!=
小于 ?<
不大于 <=
大于 ?>
不小于 >=
屬于 ?in...
這些操作符的執(zhí)行結(jié)果都是返回布爾值True或者False。如果向想同時(shí)進(jìn)行多重判斷,可以使用布爾操作符and,or或者not連接來(lái)決定最終表達(dá)式的布爾值。布爾操作符的優(yōu)先級(jí)沒(méi)有比較表達(dá)式的代碼高,也就是說(shuō)表達(dá)式先計(jì)算,然后再比較,為了避免混亂,可以用小括號(hào)將表達(dá)式括起來(lái)。
小栗子:x=7 ? ?5<x and ?x>10 -->False ? 5<x or ?x<10 --> True ? 5<x and not x>10 -->True
如果對(duì)同一個(gè)變量做多個(gè)and比較操作,Python允許下面的用法: 5<x<10-->True
這個(gè)表達(dá)式和5<x and x<10 是一樣的,也可以使用更長(zhǎng)的比較: 5<x<10<99 -->True?
什么是真值:
一個(gè)成假賦值不一定明確表示為False,下面的情況也會(huì)被認(rèn)為是False。
布爾 : False
null 類型 : None
整型 ?0
浮點(diǎn)型: 0.0 ?
空字符串:' '
空列表: [ ]
空元組:()
空字典:{}
空集合:set()
剩下的都會(huì)被認(rèn)為為真值。
如果你在判斷一個(gè)表達(dá)式不是一個(gè)簡(jiǎn)單的變量,Python會(huì)先計(jì)算表達(dá)式的值,然后返回布爾型結(jié)果。栗子: if ?color=="red":
使用while進(jìn)行循環(huán):
和for循環(huán)不同,while循環(huán)不會(huì)迭代list或者tuple元素,而是跟據(jù)表達(dá)式判斷循環(huán)是否結(jié)束。
N=10
x=0
while x
print(x)
x=x+1
while循環(huán)每次先判斷是否x
在循環(huán)體內(nèi),x = x + 1 會(huì)讓 x 不斷增加,最終因?yàn)?x < N 不成立而退出循環(huán)。
如果沒(méi)有這一個(gè)語(yǔ)句,while循環(huán)在判斷 x < N 時(shí)總是為True,就會(huì)無(wú)限循環(huán)下去,變成死循環(huán),所以要特別留意while循環(huán)的退出條件。
使用break跳出循環(huán):
用 for 循環(huán)或者 while 循環(huán)時(shí),如果要在循環(huán)體內(nèi)直接退出循環(huán),可以使用 break 語(yǔ)句。
比如計(jì)算1至100的整數(shù)和,我們用while來(lái)實(shí)現(xiàn):
sum = 0
x = 1
while True:
sum = sum + x
x = x + 1
if x > 100:
break
print sum
while True 本身是一個(gè)死循環(huán),但是在循環(huán)體內(nèi),我們還判斷了 x > 100 條件成立時(shí),用break語(yǔ)句退出循環(huán),這樣也可以實(shí)現(xiàn)循環(huán)的結(jié)束。break是退出整個(gè)循環(huán)體。
使用continue跳到循環(huán)開(kāi)始:
栗子:讀入一個(gè)整數(shù),如果是奇數(shù)就輸出它的平方,如果是偶數(shù)則跳過(guò)。使用q結(jié)束循環(huán)
In [1]: while True:
...:? ? value= input("Integer,please [q to quit] : ")
...:? ? if value=="q":? #停止循環(huán)
...:? ? ? ? break
...:? ? number=int(value)
...:? ? if number %2 ==0: #判斷偶數(shù)
...:? ? ? ? continue
...:? ? print (number,"squared is",number*number)
循環(huán)外使用else:
如果循環(huán)正常結(jié)束(沒(méi)有使用break跳出),程序?qū)⑦M(jìn)入到可選的else段。當(dāng)使用循環(huán)來(lái)遍歷一數(shù)據(jù)結(jié)構(gòu)的時(shí)候,找到滿足條件的解使用break跳出;循環(huán)結(jié)束,即沒(méi)有找到可行解時(shí),將執(zhí)行else部分代碼段:
上面執(zhí)行結(jié)果為:No? enen number found
使用for迭代:
Python頻繁的使用迭代器。它允許數(shù)據(jù)結(jié)構(gòu)長(zhǎng)度未知和具體實(shí)現(xiàn)未知的情況下遍歷整個(gè)數(shù)據(jù)結(jié)構(gòu),并且支持迭代快速讀寫中的數(shù)據(jù),以及不能一次讀入計(jì)算機(jī)內(nèi)存的數(shù)據(jù)流的處理。
列表,字符串,元組,字典,集合等都是Python中可迭代的對(duì)象。元組或列表在一次迭代過(guò)程產(chǎn)生一項(xiàng),而字符串迭代會(huì)產(chǎn)生一個(gè)字符,對(duì)于一個(gè)字典進(jìn)行迭代可以返回字典中的鍵,所使用字典的values()函數(shù)可以實(shí)現(xiàn)對(duì)值的迭代,使用字典的items()函數(shù)可以以元組的形式返回鍵值對(duì)。
list=["hello","word","allow","python"]
string="hdsfjmck"
dict={"room":"ballroom","weapon":"lead pipe","person":"xiaom"}
for lists in list:
print(lists)
for chart in string:
print(chart)
for keys,values in dict.items():
print(keys,":",values)
循環(huán)外使用else:
類似于while,for循環(huán)也可以使用可選的else代碼段,用來(lái)判斷for循環(huán)是否正常結(jié)束(沒(méi)有調(diào)用break跳出),否則執(zhí)行else段。
使用zip()并行迭代:
在迭代的時(shí)候可以使用zip()進(jìn)行并行迭代,zip()函數(shù)在最短序列用完的時(shí)候就會(huì)停止。
上面的只能遍歷到desserts的前三個(gè),以最短序列為準(zhǔn)。
現(xiàn)使用zip()函數(shù)配對(duì)兩個(gè)元組。函數(shù)的返回值既不是元組也不是列表,而是一個(gè)整合在一起的可迭代變量,配合dict()函數(shù)和zip()函數(shù)的返回值可以得到一個(gè)字典。
使用range()生成自然數(shù)序列:
range()函數(shù)返回在特定區(qū)間的自然數(shù)序列,不需要?jiǎng)?chuàng)建和存儲(chǔ)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如列表和元組。rang()函數(shù)的用法:rang(start,stop,step)。start默認(rèn)值為0,唯一要求的參數(shù)是stop,產(chǎn)生的最后一個(gè)數(shù)是stop的前一個(gè),并且step的默認(rèn)值是1。也可以反向創(chuàng)建自然數(shù)序列,這時(shí)step的值為-1。
像zip(),rang()這些函數(shù)的返回的是一個(gè)可以迭代的對(duì)象,所以可以使用for...in的皆否進(jìn)行遍歷,或者把這個(gè)對(duì)象轉(zhuǎn)化為一個(gè)序列(例如列表)。
for x in range(0,3) ? ? list(range(0,3)) ??
推導(dǎo)式:
推導(dǎo)式是一個(gè)或者多個(gè)迭代器快速簡(jiǎn)潔地創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的一種方法。
列表推導(dǎo)式:
最簡(jiǎn)單的形式:[ expression ?for ?item ?in ?iterable]
栗子:number_list=[number? for number in? range(1,6)]-->[1, 2, 3, 4, 5]
列表推到把循環(huán)放在方括號(hào)內(nèi),也可以加上條件表達(dá)式:
[expression for ?item in iterable ?if ?condition]
栗子:number_list=[number? for number in? range(1,6) if number % 2 ==0 ] -->[2, 4]
對(duì)于多重循環(huán),對(duì)應(yīng)的推導(dǎo)式中會(huì)有很多個(gè)for...語(yǔ)句。
栗子:外層循環(huán)在前面?
字典推導(dǎo)式:
字典生成式樣式:{key_expression : value_expression ?for ?expression in ?iterable}
類似于列表推導(dǎo),字典推導(dǎo)也有if條件判斷以及多個(gè)for循環(huán)迭代語(yǔ)句:
在程序中,對(duì)字符串‘letters’中出現(xiàn)的字母進(jìn)行循環(huán),計(jì)算出每個(gè)字母出現(xiàn)的次數(shù),對(duì)于上圖的程序來(lái)說(shuō),兩次調(diào)用word.count(letter)浪費(fèi)時(shí)間,因?yàn)樽址衪和e都出現(xiàn)了兩次,第一次調(diào)用word.count()時(shí)已經(jīng)計(jì)算得到相應(yīng)的值。通過(guò)修改推導(dǎo)式,可以解決這個(gè)問(wèn)題:
letter_counts={letter : word.count(letter)? for? letter? in? set(word) }
通過(guò)set()將迭代值去重。
集合推導(dǎo)式:
集合最簡(jiǎn)的推導(dǎo)式和列表,字典的類似:{expression for ?expression in iterable}?
最長(zhǎng)的版本(if tests,multiple for ?clauses)對(duì)于集合也可行:
a_set={number? for? number? in? range(1,6)? if? number? %? 3 ==1 } -->{1, 4}
生成器推導(dǎo)式:
元組是沒(méi)有推導(dǎo)式的。下面的表達(dá)式是生成器推導(dǎo)式,返回的是一個(gè)生成器對(duì)象:
number_thing=(number for number in range(1,6)) -->type(number_thing)-->generator
他是將數(shù)據(jù)傳遞給迭代器的一種方式:
for? number? in? number_thing:
print(number) -->1 2 3 4 5
通過(guò)對(duì)生成器的推導(dǎo)式調(diào)用list()函數(shù),可以使它類似于列表推導(dǎo)式:
number_list=list(number_thing)-->[1, 2, 3, 4, 5]
一個(gè)生成器只能運(yùn)行一次。列表,集合,字符串,字典都存儲(chǔ)在內(nèi)存中,但那時(shí)生成器僅在運(yùn)行中產(chǎn)生值,不會(huì)被保存下來(lái),所以不能重新使用或者備份一個(gè)生成器。
可以通過(guò)生成器推導(dǎo)式創(chuàng)建生成器,也可以通過(guò)使用生成器函數(shù)創(chuàng)建。
注:本文內(nèi)容來(lái)自《Python語(yǔ)言及其應(yīng)用》歡迎購(gòu)買原書閱讀