Python學(xué)習(xí)筆記(四)Python外殼:代碼結(jié)構(gòu)

使用#注釋:

在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)買原書閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 178,362評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,805評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,896評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 43,062評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 35,175評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 36,489評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,606評(píng)論 1 118
  • Python 是一種相當(dāng)高級(jí)的語(yǔ)言,通過(guò) Python 解釋器把符合語(yǔ)法的程序代碼轉(zhuǎn)換成 CPU 能夠執(zhí)行的機(jī)器碼...
    Python程序媛閱讀 1,937評(píng)論 0 3
  • 個(gè)人筆記,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,743評(píng)論 0 5
  • 羅伯奔尼撒戰(zhàn)爭(zhēng) 雅典 斯巴達(dá) 1.對(duì)未來(lái)的恐懼 2.錯(cuò)誤的戰(zhàn)爭(zhēng) 3.西西里島戰(zhàn)爭(zhēng) 斯巴達(dá)贏了 開(kāi)場(chǎng) 感謝 進(jìn)步 建...
    宮曉杰閱讀 171評(píng)論 0 0
  • 話說(shuō)近幾年網(wǎng)上不斷爆出奇特的鬧洞房事件,網(wǎng)友憤懣異常,言論一致地抗議鬧洞房! 為什么網(wǎng)友對(duì)待應(yīng)該幸福歡愉的鬧洞房的...
    任游子閱讀 813評(píng)論 1 2