05 November, 2008

Python Idiom: in

這次將介紹 in 這個關鍵字, in 最常出現在下面的用法
for key in d:
    print key
其中 d 的型態可以是 list, tuple, set, string, dictionary 等。 要檢查一個字串是否含有某子字串,通常會想到下面的做法
sentence = "fly me to the moon"
if sentence.find("fly") != -1:
     print "successful"
其實更好的方法是用 in
if "fly" in sentence:
     print "successful"
是不是更好閱讀,打字也更快呢? 要把一個 dictionary 的 key 印出來,一般的想法是
school = {'NCKU':'Tainan', 'NSYSU':'Kaohsiung',
          'NTU':'Taipei'}
for k in school.keys():
     print k
其實只要用
for k in school:
     print k
即可,但是如果迴圈內會改變 dictionary 的值,就必須用 .keys(),例如
for k in school.keys():
     del school[k]
原因是迴圈在跑時不允許 dictionary 改變大小,所以
for k in school:
     del school[k]
會出現 RuntimeError。 而之前的例子不會,因為 school.keys() 會傳回一個包含 school 所有 key 的 list, 迴圈在跑時改變的是 dictionary 而不是這個 list。 如果要檢查 dictionary 是不是含有某個 key,要用
if "NSYSU" in school:
     print "yes"
而不要用
if school.has_key("NSYSU"):
     print "yes"
原因是打字較快,容易閱讀,還有 polymorphic, 許多內建的型態都支援 in,只有 dictionary 支援 has_key, 如果是自己寫 class, 想要支援 if x in y 的語法就改寫 __contains__, 想要支援 for x in y 的語法就改寫 __iter__。

No comments: