2017-07-09 79 views
0

我寫返回的發生在輸入字符串不止一次不同,不區分大小寫字母字符和數字位的數的代碼。這裏是我的代碼:爲什麼括號會產生這樣的差異?

def duplicate_count(text): 
    sum_low = 0 
    dic_low = [] 
    sum_up = 0 
    dic_up = [] 
    sum_num = 0 
    dic_num = [] 
    total = 0 
    for i in text: 
    if i.isalpha(): 
     if i.islower() and text.count(i) > 1 and i not in dic_low: 
      dic_low.append(i) 
      sum_low = sum_low + 1 
     elif i.isupper() and text.count(i) > 1 and i not in dic_up: 
      dic_up.append(i) 
      sum_up = sum_up + 1 
    elif i.isdigit() and text.count(i) > 1 and i not in dic_num: 
     dic_num.append(i) 
     sum_num = sum_num + 1 
    total = sum_low + sum_up + sum_num 
    print (total) 

的問題是,我注意到,當我錯過了括號「如果i.isalpha()」這個代碼用字母完美地工作之後,但似乎忽略的數字,因此,例如,如果我通過「aabbcdeBBAA」打印「4」,但如果參數是「11336」,則打印「0」。後來我發現括號已經錯過並糾正了,代碼開始正常工作,但我仍然不明白問題所在。沒有任何TraceBack,所以我猜想問題在於缺少括號。它爲什麼會產生如此大的差異?

PS:如果對不起代碼過於怪異,我是新來的節目和剛開始學編碼。 謝謝!

+0

你可以給有和沒有括號的例子嗎?我不明白的地方,你把他們或者你忘了他們 –

回答

7

i.isalpha是一個對象(您的字符串i的方法isalpha)。這不是Null,也不對應於falsy值等0""[]等,因此,如果檢查其布爾值,它被評價爲True

只有通過增加(),你居然通話該方法。

實用提示:文件句柄有一個常見的初學者錯誤:myfile.close沒有關閉文件myfile,只有myfile.close()。但第一個語句在語法上是有效的,不會引發錯誤。你也許會想知道爲什麼你剛剛編寫的文件是空的......

+1

爲了使它更加明確,同時運行簡單化的風險,如果沒有括號,你正在評估函數對象本身('>>> i.isalpha'返回'<功能isalpha>'和'>>> bool(i.isalpha)'returns'True'),但是你沒有運行這個函數。通過添加圓括號,您正在運行該函數並獲得它對'i'的評估的返回值(不管它是否僅由字母字符組成)。 – berna1111

+0

非常感謝!一個非常清楚和簡單的解釋,現在我明白了! –

2

如果你寫i.isalpha意味着你指的是功能,而不是實際調用的函數,則需要在最後添加()通話功能

>>> i = 'some text' 
>>> obj = i.isalpha # just reference not actually call 
>>> obj 
<function str.isalpha> 
>>> obj() # adding '()' executes the function 
False 
>>> i.isalpha() 
False 
+0

謝謝你的解釋!一個非常明確的答案! –

+0

@YaroslavLee :)如果有幫助,不要忘記標記爲接受回答:) – ksai