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