2013-07-17 99 views
-2

我實際工作對蟒蛇的編碼蝙蝠。這是我遇到的問題:http://codingbat.com/prob/p107863。不確定問題是否與他們實際存在。這是我的代碼。它用於將所有不等於13的輸入相加。可能有更好的方法。但是,我真正想知道的是如果以前的IF語句的條件不符合,如何評估下一個IF語句。多if語句 - 代碼停止之後,如果條件得不到滿足

def lucky_sum(a, b, c): 
    results=0 
    if a != 13: 
    results= results + a 
    if b != 13: 
    results= results + b 
    if c != 13: 
    results= results + c 
    return results #EDIT: Indented this 2 spaces to correct OP formatting error -sequoia 

如果您運行此lucky_sum(1, 13, 3)它返回1而不是4.我相信這是很容易解決的。

+0

你的代碼是好的!也許你只需要正確縮進! – Guido

+0

@尼爾你的代碼沒有考慮到部分問題,請參閱我的更新答案。 –

+0

@Neil作爲未來的參考,也考慮看看[多個ifs和elifs之間的差異](http://stackoverflow.com/questions/9271712/difference-between-multiple-ifs-and-elifs-python)。在這裏,多個「if」是一種有效的方法,但並不總是如此。 – Schorsch

回答

2

我真正想知道的是如果以前的IF語句的條件不符合,如何評估下一個IF語句。

如果if語句的條件不滿足,它會跳過縮進邏輯並移動到相同縮進的下一行的if語句,在這種情況下是另一個if語句。所以你的代碼按預期工作。

只是正常縮進return語句。

如果你運行這個lucky_sum(1,13,3)返回1,而不是4

事實並非如此。你的代碼返回4,但它應該返回1!您錯過了這一問題:

但是,如果其中一個值是13,那麼它不會計入總和而其右側的值不計算在內。

所以,如果一個值是13,你不會想在右邊添加值,你也可以。

+0

我覺得啞巴...哈哈。謝謝。我錯誤地閱讀了結果。 – Neil

6

編寫函數的更好方法是使用non-keyword arguments。只需在生成器表達式上使用sum()函數即可返回總和。

>>> def lucky_sum(*nkwargs): 
...  return sum(x for x in nkwargs if x != 13) 

>>> lucky_sum(1, 13, 3) 
4 

在你的原代碼,有壓痕錯誤的問題。您的退貨聲明沒有正確縮進。


根據您的修改,上面的代碼,和一個在你的問題不會對編碼蝙蝠問題的工作。在找到等於13的值時,需要停止添加。

爲此,您可以修改原始函數返回if塊中的sum,其中值爲13。我會在這裏給我的功能進行相應的修改:

>>> def lucky_sum(*nkwargs): 
...  try: 
...   index = nkwargs.index(13) 
...   return sum(nkwargs[:index]) 
...  except ValueError: 
...   return sum(nkwargs) 

>>> lucky_sum(1, 3, 4) 
8 
>>> lucky_sum(1, 3, 13, 4) 
4 
+1

@vikingosegundo。在這種情況下,您將不得不在列表中傳遞參數。使用非關鍵字參數,您可以傳遞值。 –

+0

是的,我意識到,我按下的時刻發送 – vikingosegundo

+0

這應該是一個評論。 – Gumbo

1

我不相信發佈的代碼是您的真實代碼。

def lucky_sum(a, b, c): 
    results=0 
    if a != 13: 
    results= results + a 
    if b != 13: 
    results= results + b 
    if c != 13: 
    results= results + c 
return results #<--- This would result in an error 

但是,如果要正確地縮進返回值,那麼代碼將確實評估每個if語句,而不管前一個if語句正文是否已輸入。正確縮進,您確實會從lucky_sum(1, 13, 3)中獲得4個(請參閱:http://ideone.com/FIvEnk)。

然而,更好的方法來做到這一點是:

def lucky_sum(a, b, c): 
    acc = 0 
    for n in (a,b,c): 
     if n != 13: acc += n 
    return acc 

你也可以採取可變數目的使用語法def lucky_sum(*some_args):參數。我把它留給你來弄清楚如何在你的函數中使用它。

你的問題是,你誤會了,你正在使用的教程網站:它要求你做你說什麼你想要的正好相反,它希望你(錯誤地)說,你的代碼產生的結果,不是你錯誤地相信它想要的結果。

下面的代碼符合他們要求的規格:

def lucky_sum(a, b, c): 
    acc = 0 
    for n in (a,b,c): 
     if n == 13: break 
     acc += n 
    return acc 
+0

我在我的問題開始處添加了更多細節。 – Neil

+0

@尼爾我不在乎你在做什麼課程。正確縮進的代碼完成你所說的任務。 – Marcin

+0

@Neil事實上,這裏的證明:http://ideone.com/FIvEnk – Marcin

0

「不過,我真正想知道的是如何評價未來IF如果前面的IF語句的條件不滿足聲明。」

的答案是使用else和/或elif

if a != 13: 
    print("a is not 13, but b and c might be") 
elif b != 13: 
    print("b is not 13, but a is, and c might be") 
elif c != 13: 
    print("c is not 13, but a and b are") 
+0

原始代碼評估是否未滿足先前的「if」條件;當且僅當不符合原始條件時才這樣做。 – Marcin

+0

是的,確實如此,並且(1)OP還聲明原始代碼不是他想要的; (2)Python沒有'iff'語句; (3)詢問「如果前一個語句的條件不符合,我該如何評估下一個if語句,而且如果它是?則評估下一個if語句?是一個完整的非問題。 –

相關問題