上面提到的4種容器類型都是可遍歷的,所以該講講用來遍歷的for循環(huán)了。for循環(huán)的語法也是簡單的英語:
a = ['This', 'is', 'a', 'list', '!']
b = ['This', 'is', 'a', 'tuple', '!']
c = {'This': 'is', 'an': 'unordered', 'dict': '!'}
# 依次輸出:'This', 'is', 'a', 'list', '!'
for x in a:
print(x)
# 依次輸出:'This', 'is', 'a', 'tuple', '!'
for x in b:
print(x)
# 鍵的遍歷。不依次輸出:'This', 'dict', 'an'
for key in c:
print(key)
# 依次輸出0到9
for i in range(10):
print(i)
注意到每個(gè)for循環(huán)中,print都有縮進(jìn),這是Python中一個(gè)讓人愛恨交織的特點(diǎn):強(qiáng)行縮進(jìn)來表明成塊的代碼。這樣做的好處是代碼十分清晰工整,還有助于防止寫出過長的函數(shù)或者過深的嵌套,壞處是有時(shí)候不知為什么tab和空格就一起出現(xiàn)了,又或是多重if-else不知怎得就沒對齊,還是挺麻煩的。
回到for循環(huán)上,這種把每個(gè)元素拿出來的遍歷方式叫做for_each風(fēng)格,熟悉Java的話就不會(huì)陌生,C++11中也開始支持這種for循環(huán)方式。不過如果還是需要下標(biāo)呢?比如遍歷一個(gè)list的時(shí)候,希望把對應(yīng)下標(biāo)也打印出來,這時(shí)可以用enumerate:
names = ["Rick", "Daryl", "Glenn"]
# 依次輸出下標(biāo)和名字
for i, name in enumerate(names):
print(i, name)
需要注意的是,通過取下標(biāo)遍歷當(dāng)然是可行的,比如用len()函數(shù)獲得列表長度,然后用range()/xrange()函數(shù)獲得下標(biāo),但是并不推薦這樣做:
words = ["This", "is", "not", "recommended"]
# not pythonic :(
for i in xrange(len(words)):
print(words[i])
在使用for循環(huán)時(shí),有時(shí)會(huì)遇到這樣一種場景:我們需要對遍歷的每個(gè)元素進(jìn)行某種判斷,如果符合這種判斷的情況沒有發(fā)生,則執(zhí)行一個(gè)操作。舉個(gè)例子某神秘部門要審核一個(gè)字符串列表,如果沒有發(fā)現(xiàn)不和諧的字眼,則將內(nèi)容放心通過,一種解決辦法是下面這樣:
wusuowei = ["I", "don't", "give", "a", "shit"] # 無所謂
hexie = True # 默認(rèn)和諧社會(huì)
for x in wusuowei:
if x == "f**k":
print("What the f**k!") # 發(fā)現(xiàn)了不該出現(xiàn)的東西,WTF!
hexie = False # 不和諧了
break # 趕緊停下!不能再唱了
if hexie: # 未發(fā)現(xiàn)不和諧元素!
print("Harmonious society!") # 和諧社會(huì)!
這樣需要設(shè)置一個(gè)標(biāo)記是否發(fā)現(xiàn)不和諧因素的狀態(tài)變量hexie,循環(huán)結(jié)束后再根據(jù)這個(gè)變量判斷內(nèi)容是否可以放心通過。一種更簡潔不過有些小眾的做法是直接和else一起,如果for循環(huán)中的if塊內(nèi)的語句沒有被觸發(fā),則通過else執(zhí)行指定操作:
wusuowei = ["I", "don't", "give", "a", "shit"]
for x in wusuowei:
if x == "f**k":
print("What the f**k!")
hexie = False
break
else: # for循環(huán)中if內(nèi)語句未被觸發(fā)
print("Harmonious society!") # 和諧社會(huì)!
這樣不需要一個(gè)標(biāo)記是否和諧的狀態(tài)變量,語句簡潔了很多。
if和分支結(jié)構(gòu)
上一個(gè)例子中已經(jīng)出現(xiàn)if語句了,所以這部分講講if。Python的條件控制主要是三個(gè)關(guān)鍵字:if-elif-else,其中elif就是else if的意思。還是看例子:
pets =['dog', 'cat', 'droid', 'fly']
for pet in pets:
if pet == 'dog': # 狗糧
food = 'steak' # 牛排
elif pet == 'cat': # 貓糧
food = 'milk' # 牛奶
elif pet == 'droid': # 機(jī)器人
food = 'oil' # 機(jī)油
elif pet == 'fly': # 蒼蠅
food = 'sh*t' #
else:
pass
print(food)
需要提一下的是pass,這就是個(gè)空語句,什么也不做,占位用。Python并沒有switch-case的語法,等效的用法要么是像上面一樣用if-elif-else的組合,要么可以考慮字典:
pets = ['dog', 'cat', 'droid', 'fly']
food_for_pet = {
'dog': 'steak',
'cat': 'milk',
'droid': 'oil',
'fly': 'sh*t'
}
for pet in pets:
food = food_for_pet[pet] if pet in food_for_pet else None
print(food)
這里還用到了一個(gè)if-else常見的行內(nèi)應(yīng)用,就是代替三元操作符,如果鍵在字典中,則food取字典的對應(yīng)值,否則為None。
if表達(dá)式中的小技巧
通過鏈?zhǔn)奖容^讓語句簡潔:
if -1 < x < 1: # 相較于 if x > -1 and x < 1:
print('The absolute value of x is < 1')
判斷一個(gè)值是不是等于多個(gè)可能性中的一個(gè):
if x in ['piano', 'violin', 'drum']: # 相較于 if x == 'piano' or x == 'violin' or x =='drum':
print("It's an instrument!")
評論
查看更多