2015-09-16 105 views
0

我試圖學習python和我正在使用的網站之一有一個問題,如下所示: 給定兩個int值,a和b,如果其中任一個是6,則返回True。或者如果它們的和或差是6有沒有更好,更短的代碼?

,這裏是我的代碼爲它

def love6(a, b): 
    diff = a-b 
    sum = a+b 
    if a==6 or b==6: 
    return True 
    elif sum==6 or abs(diff)==6: 
    return True 
    else: 
    return False 

這是精細和完美的作品 - 只是想知道如果這可以被進一步壓縮?

+4

BTW計算,這不是一個好主意將內置函數'sum'映射爲該名稱的變量。 –

+0

對,謝謝 - 我想這需要時間來掌握所有內置函數(雖然_sum_應該對我來說很明顯) – awkward101

+0

一個體面的編輯器,帶有語法突出顯示可以幫助你解決這類問題:如果你不小心使用內置的名稱,您可以獲得即時反饋,因爲它具有特殊的顏色。 –

回答

7

由於您if的兩個分支做同樣的事情,你可以通過與其他or連接它們將它們合併成一個:

if a==6 or b==6 or sum==6 or abs(diff)==6: 
    return True 
else: 
    return False 

但是這僅僅是:

return (a == 6 or b == 6 or sum==6 or abs(diff)==6) 

但是,由於所有他們正在測試相同的平等,你可以使用in這樣的運營商:

return 6 in (a,b,sum,abs(diff)) 

值得避免使用變量名稱sum,因爲這個名稱有一個內置函數。在這裏,你只使用了一次,操作相當簡單,所以你可以在清晰度完全刪除該變量沒有任何明顯的損失:

return 6 in (a,b,a+b,abs(a-b)) 
+2

正在等待某人使用'in'。我喜歡。但我不會使用它,因爲它不太直觀,而且可能較慢,因爲它必須構建元組。我會堅持第二個版本。 – spectras

+0

@spectras我..非常懷疑這裏的時差會很明顯。即使使用完全短路的版本,如PM 2Ring的答案(我的第二版仍然提前計算'sum'和'diff')很可能會在10個週期內測量時間差*。 – lvc

+0

Ofc。它更多的是它更直觀。出於好奇,我沒有時間。返回False時,差異約爲10%。不幸的是,隨着頻率縮放的開始,我不能計算帶有'timeit'的週期,但我完全同意它很短,這在任何真實世界的程序中都不會影響。 – spectras

6

爲什麼要浪費時間預先計算的總和&絕對差時,他們可能不需要?

def love6(a, b): 
    return a==6 or b==6 or a+b==6 or abs(a-b)==6 

Python的or操作者短路,因此上述試驗進行評估從左到右,並且一旦True值被發現,不執行更多的測試。例如,如果等於6,則不計算ab之和的絕對差只有當沒有a也不b等於6,他們的總和不應6

+0

沒有爭議,短路是一個有用的東西學習和知道,我不認爲'浪費時間'是一種很好的方式來構建它(時間差異將會變得微不足道)。 – lvc

+2

@lvc:公平點,雖然它不僅僅是保存了計算時間 - 還有時間和內存保存在不創建保存計算結果的臨時對象。當然,在這個例子中它都是小東西。但是如果我們這樣做了超過10億對'(a,b)'循環,那麼性能差異將會很明顯(儘管由於Python處理整數對象的方式,對RAM的影響可能不會那麼糟糕) 。 –

+0

兩個「int」的RAM成本大約爲60個字節。如果它們很大,這個數字會增加,所以如果總和和差別都是10^30(千億億),大約是80個字節。除了CPython的小整數緩存的效果外,只要函數返回,這些緩存就可以進行垃圾回收,所以調用次數並不重要。他們將是快速的本地人,因此CPython中的查找與「a」和「b」相同的C數組索引(恆定時間指針算術)。在編譯函數時,任何實際成本都會支付*一次*。 – lvc