Python 益智題:如何讓這個函數返回 True


Python 益智題:如何讓這個函數返回 True

有這樣一個函數:

<code>def check(x):
if x+1 is 1+x:
return False
if x+2 is not 2+x:
return False
return True/<code>

提供一個輸入,使得 1 加上它,還是和它是同個對象的實例,但是 2 加上它不再是同個對象的實例。

解決方案 1:自定義類

我個人認為解決此挑戰的方式是:

<code>def check(x):
if x+1 is 1+x:
return False
if x+2 is not 2+x:
return False
return True

class Test(int):
def __add__(self, v):
if v == 1:
return 0
else:
return v

print(check(Test()))
# output: True/<code>

讓我解釋一下它是如何工作的。在 Python 中,當我們使用 + 運算符時,Python 會根據對象在運算符的哪一側來調用不同的特殊方法。如果對象在運算符的左側,則將調用 __ add __ ;如果在右側,則將調用 __ radd __。

如果調用了 Test()+ 1 則返回 0,如果調用 Test() + 1 則返回 1。訣竅在於,我們只重載其中一種特殊方法,而另一種不變。這將幫我們通過第一個 if 條件。如果再看一遍,您會發現它也幫助我們通過了第二次的 if 檢查,因為如果輸入不是 1 的話,直接返回輸入,所以 Test()+2 永遠等價於 2 + Test()。

但是,在看了評論之後,我發現了另一個不需要自定義類的解決方案。

解決方案 2:唯一的整數

用戶 /u/SethGecko11 提出了出奇簡單的答案:

<code>def check(x):
if x+1 is 1+x:
return False
if x+2 is not 2+x:
return False
return True

print(check(-7))
# output: True/<code>

只有 -7 可行。任何一個其他的數字都不會返回 True。如果您對為什麼這樣做感到困惑,那麼您並不孤單。我必須閱讀評論以找出原因。

很顯然,在 Python 中,整數 -5 到 256 是預分配的。當您執行任何操作且結果在該範圍內時,您將獲得預分配的對象。這些都是單例,因此 is 運算符將返回 True。如果您嘗試使用不屬於此範圍的整數,則會得到一個新實例。

預分配這些整數的內存要求不是很高,但是顯然性能提升是巨大的。

因此,當您使用 -7 作為輸入時,將得到一個新的 -6 實例,但當答案為 -5 時將獲得相同的實例。正是由於 if 語句的構造方式,所以這對上限 (256) 無效。如果檢查功能是這樣實現的,則 255 可以作為答案:

<code>def check(x):
if x+1 is not 1+x:
return False
if x+2 is 2+x:
return False
return True/<code>

希望您在本文中學到了新東西。我認為您永遠都不會在任何代碼庫中使用此功能,但是它是一個非常好的腦筋急轉彎,甚至可以使經驗豐富的 Python 開發人員措手不及。

編程愉快!


分享到:


相關文章: