Python之流程語句:分支暗挑、循環(huán)、List Comprehension

在Python中斜友,一個(gè)程序區(qū)塊是使用冒號開頭炸裆,之后同一個(gè)區(qū)塊中要有相同的縮進(jìn),不能混用不同的空格數(shù)鲜屏,也不可混用空格和Tab烹看,Python 建議使用4個(gè)空格作為縮進(jìn)。

if分支語句

if condition1:
    if condtion2:
        doSomething()
    else:
        doSomething()
elif condition:
    doSomething()
else:
    doSomething()

Python區(qū)塊定義的方式避免了像C/C++墙歪、Java等語言某些讀起來不明確的情況听系,比如:

if(condition1)
    if(condition2)
        doSomething()
else
    doSomething2()

看起來else好像是跟第一個(gè)if語句對應(yīng)的,但實(shí)際上這些語言采用的是就近配對原則虹菲,是和第二個(gè)if語句對應(yīng)的靠胜,Python中就沒有這個(gè)問題,是以語句縮進(jìn)來對應(yīng)的。

if condition:
    if condition2:
         do_something()
else :
    do_something2()
#else跟第一個(gè)if語句配對

if condition:
    if condition2:
         do_something()
    else :
        do_something2()
# else與第二個(gè)if配對

在Python中還有個(gè) if...else 表達(dá)式:

# 判斷奇偶數(shù)
>>> num = 11
>>> print('{} 是 {}'.format(num, '奇數(shù)' if num % 2 else '偶數(shù)'))
11 是 奇數(shù)

當(dāng)if條件滿足時(shí)浪漠,會(huì)返回if前面的值陕习,若不滿足則返回else后面的值。


while 循環(huán)

Python 提供了while 循環(huán)址愿,根據(jù)while語句后面的內(nèi)容來判斷是否執(zhí)行循環(huán)體:

while condition:
    do_something()
else
    do_something()

當(dāng)判斷條件成立時(shí)该镣,會(huì)執(zhí)行while區(qū)塊,else是可選的响谓,如果有else語句损合,不管條件成不成立都會(huì)執(zhí)行else下的語句,若不想讓else執(zhí)行就在while區(qū)塊中加入break語句中斷循環(huán)娘纷,最好還是不要使用嫁审,這樣容易產(chǎn)生混亂。

print('請輸入兩個(gè)數(shù)字')
a = int(input('數(shù)字 1 :'))
b = int(input('數(shù)字 2 :'))
while b != 0:
    r = a % b
    a = b
    b = r
    if a == 1:
        print('互質(zhì)')
        break
else:
    print('最大公因數(shù):', a)

還是下面的代碼比較直觀:

print('請輸入兩個(gè)數(shù)字')
a = int(input('數(shù)字 1 :'))
b = int(input('數(shù)字 2 :'))
while b != 0:
    r = a % b
    a = b
    b = r
    if a == 1:
        print('互質(zhì)')
    else:
        print('最大公因數(shù):', a)

for in 循環(huán)

若要按順序迭代某個(gè)序列(字符串赖晶,元組律适,列表),則可以使用for in 語句:

>>> num = ['a', 1, '2', '3']
>>> for i in num:
...     print(i)
... 
a
1
2
3

如果在迭代的時(shí)候需要使用到索引遏插,則可以配合 range() 函數(shù)使用捂贿,range() 函數(shù)可以產(chǎn)生一個(gè)指定的數(shù)字范圍:

>>> for i in range(len(num)):
...     print(i, num[i])
... 
0 a
1 1
2 2
3 3

range() 函數(shù)的形式是 range(start, stop[, step]), start默認(rèn)是0胳嘲,step是步長默認(rèn)為1厂僧。

也可以使用 zip() 函數(shù),將兩個(gè)序列的各個(gè)元素像拉鏈一樣一一配對胎围,它返回的是一個(gè)zip對象蚌斩,這個(gè)對象并沒有包含真正配對的元素编兄,具有惰性求值的特性(關(guān)于惰性求值請看我的另一篇文章:Python中的優(yōu)化:惰性求值詳解),像range()函數(shù)也是產(chǎn)生一個(gè)range對象不是列表:

>>> zip([1,2,3],[4,5,6],[7,8,9])
<zip object at 0x108498e08>
>>> for i, j, k in zip([1,2,3],[4,5,6],[7,8,9]):
...     print(i, j, k)
... 
1 4 7
2 5 8
3 6 9

若真的要迭代時(shí)具有索引信息,建議使用 enumerate() 函數(shù)而不是 range() 函數(shù)删性,enumerate() 返回一個(gè) enumerate 對象剪侮,也是惰性求值腊瑟,可使用for in 進(jìn)行迭代还栓,enumerate 可用于獲取元組元素:

>>> num = [1,2,3,4,5,6]
>>> list(enumerate(num))
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

可以利用元組拆解的特性獲取索引信息:

>>> for i, j in enumerate(num):
...     print(i, j)
... 
0 1
1 2
2 3
3 4
4 5
5 6

只要是實(shí)現(xiàn)了__iter__() 方法的對象,都可以通過__iter__() 方法返回一個(gè)迭代器敬锐,這個(gè)迭代器可以使用for in語句來迭代背传,如:range、zip台夺、enumerate對象径玖,集合也實(shí)現(xiàn)了__iter__() 方法,因此也可以進(jìn)行迭代颤介,但是集合是無序的梳星,每次的迭代結(jié)果順序都不一樣赞赖;字典也是可以迭代的,使用keys()冤灾、values()前域、items()方法,分別返回dict_keys韵吨、dict_values匿垄、dict_items對象,也都實(shí)現(xiàn)了__iter__() 方法归粉,因此也可以使用for in進(jìn)行迭代椿疗,如果直接對字典進(jìn)行for in操作,默認(rèn)對鍵進(jìn)行迭代糠悼。


pass变丧、break、continue

在某個(gè)區(qū)塊中绢掰,并不想執(zhí)行任何程序語句或者稍后需要些什么語句,對于還沒打算編寫的區(qū)塊童擎,可以加上個(gè)pass語句滴劲,只是用來維持代碼的完整性,將來可能會(huì)用到它顾复,因?yàn)榭赡軙?huì)做一些小測試班挖,看看其他的代碼是否正常運(yùn)行。break和continue都是用來跳出循環(huán)的芯砸,break是直接跳出循環(huán)不在進(jìn)行循環(huán)操作萧芙,continue是中止本次循環(huán),繼續(xù)進(jìn)行下一輪的循環(huán)假丧。

list comprehension

將一個(gè)列表進(jìn)行操作轉(zhuǎn)為另外一個(gè)列表是很常見的操作双揪,Python提供了 list comprehension 語句:

# 將數(shù)組元素平方
#一般做法:
>>> array = [1, 2, 3, 4]
>>> array2 = []
>>> for i in array:
...     array2.append(i ** 2)
... 
>>> print(array2)
[1, 4, 9, 16]
#list comprehension語句
>>> array = [1, 2, 3, 4]
>>> array2 = [i ** 2 for i in array]
>>> print(array2)
[1, 4, 9, 16]

可以看到代碼精簡了很多,上述語句逐一迭代出數(shù)組元素并賦值給i變量包帚,之后執(zhí)行for左邊的表達(dá)式運(yùn)算渔期,使用 [] 括起來,表示每次迭代的結(jié)果收集為一個(gè)列表渴邦。
list comprehension 還可以與條件判斷式結(jié)合疯趟,構(gòu)成過濾的功能:

#篩選出數(shù)組中的奇數(shù)
>>> array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> new_array = [i for i in array if i % 2]
>>> print(new_array)
[1, 3, 5, 7, 9]

在上述代碼中,只有滿足了if條件才會(huì)執(zhí)行for左邊的語句谋梭,然后并入數(shù)組中信峻。
當(dāng)然,它還可以嵌套使用瓮床,不過這樣可讀性會(huì)變低盹舞,簡單兩層的還可以产镐,復(fù)雜的不推薦使用:

# 將二維矩陣轉(zhuǎn)為一維
>>> matrix = [
... [1,2,3],
... [4,5,6],
... [7,8,9]
... ]
>>> array = [e for row in matrix for e in row]
>>> print(array)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

#得到兩個(gè)序列的排列組合
```python
>>> num1 = [1, 2, 3, 4]
>>> num2 = [1, 2, 3, 4]
>>> [(i ,j) for i in num1 for j in num2 ]
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (4, 1), (4, 2), (4, 3), (4, 4)]
>>> [word1 + word2 for word1 in 'hello' for word2 in 'world']
['hw', 'ho', 'hr', 'hl', 'hd', 'ew', 'eo', 'er', 'el', 'ed', 'lw', 'lo', 'lr', 'll', 'ld', 'lw', 'lo', 'lr', 'll', 'ld', 'ow', 'oo', 'or', 'ol', 'od']

在 list comprehension 兩邊放上[],會(huì)產(chǎn)生列表矾策,如果數(shù)據(jù)很多磷账,直接返回列表會(huì)占用太多內(nèi)存,可以用() 取代 [] ,這樣就會(huì)創(chuàng)建一個(gè)generator對象贾虽,具有惰性求值的特性:

>>> num = (i for i in range(99999999999999999))
>>> num
<generator object <genexpr> at 0x106e29fc0>

list comprehension語句也可以用來創(chuàng)建集合逃糟,在語句兩邊放上{}:

>>> num = [1,2,3,4,5,6,7,8,9,0]
>>> {i for i in num if i % 2}
{1, 3, 5, 7, 9}

也可以用來創(chuàng)建字典,使用zip()函數(shù)將鍵值一一配對:

>>> keys = ['JYH', 'JY']
>>> values = ['123', '456']
>>> {key : value for key, value in zip(keys, values)}
{'JYH': '123', 'JY': '456'}

還可以用來創(chuàng)建元組蓬豁,由于()會(huì)創(chuàng)建生成器绰咽,所以要換一種方式,將生成器表達(dá)式傳給tuple():

>>> tuple(i for i in range(10))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

關(guān)于惰性求值請看我的另一篇文章:Python中的優(yōu)化:惰性求值詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末地粪,一起剝皮案震驚了整個(gè)濱河市取募,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟆技,老刑警劉巖玩敏,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異质礼,居然都是意外死亡旺聚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門眶蕉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砰粹,“玉大人,你說我怎么就攤上這事造挽〖盍В” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵饭入,是天一觀的道長嵌器。 經(jīng)常有香客問我,道長谐丢,這世上最難降的妖魔是什么嘴秸? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮庇谆,結(jié)果婚禮上岳掐,老公的妹妹穿的比我還像新娘。我一直安慰自己饭耳,他們只是感情好串述,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寞肖,像睡著了一般纲酗。 火紅的嫁衣襯著肌膚如雪衰腌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天觅赊,我揣著相機(jī)與錄音右蕊,去河邊找鬼。 笑死吮螺,一個(gè)胖子當(dāng)著我的面吹牛饶囚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸠补,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼萝风,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了紫岩?” 一聲冷哼從身側(cè)響起规惰,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泉蝌,沒想到半個(gè)月后歇万,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勋陪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年堕花,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粥鞋。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞄崇,靈堂內(nèi)的尸體忽然破棺而出呻粹,到底是詐尸還是另有隱情,我是刑警寧澤苏研,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布等浊,位于F島的核電站,受9級特大地震影響摹蘑,放射性物質(zhì)發(fā)生泄漏筹燕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一衅鹿、第九天 我趴在偏房一處隱蔽的房頂上張望撒踪。 院中可真熱鬧,春花似錦大渤、人聲如沸制妄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耕捞。三九已至衔掸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俺抽,已是汗流浹背敞映。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磷斧,地道東北人振愿。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像瞳抓,于是被迫代替她去往敵國和親埃疫。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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