有什麼辦法可以讓Python運算符使用「==」和「>」返回ints而不是bools。我知道我可以使用int函數(int(1 == 1)
)或添加0((1 == 1) + 0
),但我想知道是否有一個簡單的方法來做到這一點。就像你想要師返回花車一樣,你可以輸入from __future__ import division
。有沒有辦法與運營商返回整數?或者,我可以讓課程擴展到__future__._Feature
,這將會做我想要的嗎?Python運算符返回整數
回答
根據您的澄清,則可能會在比較操作更改爲類似:
stack.push(1 if stack.pop() > stack.pop() else 0)
這將轉換的>
到1
或0
布爾結果,你想。
此外,請注意在同一個表達式中調用stack.pop()
兩次。你不知道(可以肯定)參數的評估順序,Python的不同實現可能會以不同的順序彈出參數。您將需要使用臨時變量:
x = stack.pop()
y = stack.pop()
stack.push(1 if x > y else 0)
我在代碼中做了不同的'stack.pop(),但試圖在我的評論中壓縮它們。不過謝謝。 – None 2010-05-05 23:34:47
表達式的評估順序在語言參考(http://docs.python.org/reference/expressions.html#evaluation-order)中指定。 也就是說,在一個不平凡的表達式中有副作用的函數調用通常是一個壞主意。 – 2010-05-07 11:47:49
你不能覆蓋內置的比較函數。在某種意義上,比較運算符已經返回int
。 bool
是int
的子類,所以你可以對它做任何事情,你可以做一個int。這個問題就變成了爲什麼你想要比較返回int對象,而不是bool對象?
你可以有你的自定義類的比較操作符返回任何你喜歡的 - 簡單地執行相關方法(__eq__
,__ne__
,__gt__
,__lt__
,__ge__
,__le__
)返回你想要什麼。對於你不控制的對象,你不能改變這個,但不應該有:bools 是整數,因爲the Liskov substitution principle。注意內置類型'__eq__
方法返回的bool和任何其他整數之間的區別的代碼是使用錯誤的結果。
__future__
模塊在這裏不相關;你不能用它來做任何你想做的事情,你只能用它來改變添加到Python的特定設置。您可以將導入的__future__
導入真分區,因爲這是添加到Python中的內容。添加更多__future__
導入的唯一方法是修改Python本身。
在您自己的對象上,很容易覆蓋每個比較運算符。對於內置插件,重寫方法是「只讀」,所以我設置它們的所有嘗試都不會移出。
>>> class foo:
def __lt__(self, other):
return cmp(5, other)
>>> f = foo()
>>> f<3
1
>>> f<7
-1
>>> f<5
0
>>> j=""
>>> j.__lt__=lambda other: cmp(5, other)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'str' object attribute '__lt__' is read-only
把你的布爾投射到int?
>>> int(True)
1
>>> int(False)
0
或者強制轉換到海峽?
>>> str(int(True))
'1'
>>> str(int(False))
'0'
不,你不能。當Guido統一類型和類時,他發現了一種重寫內置類型行爲的方法(由於他實現的方式),但他宣稱它是一個bug並堵塞了漏洞。改變內置類型的行爲(除了你的例子 - 從未來導入分區,這是有原因的)被禁止。
對不起,但我找不到郵件列表文章。我記得它,因爲它很有趣。
- 1. Python整數除法運算符vs math.floor
- 2. 「=」運算符返回什麼?
- 3. 運算符的返回值++
- 4. 地址運算符 「&」 與函數返回
- 5. C++與&&運算符函數返回
- 6. vb.net函數返回運算符
- 7. Lexing求和運算符和帶符號整數的Python Python
- 8. (!!)運算符溢出整數
- 9. 整數移位運算符
- 10. 逗號運算符和賦值運算符 - 返回值
- 11. 所有的數學運算都以整數形式返回?
- 12. Python://運算符
- 13. Python:++運算符
- 14. Python:&=運算符
- 15. 運算符python參數
- 16. 三元運算符的單個返回
- 17. 參考返回賦值運算符
- 18. C++運算符重載返回指針
- 19. 運算符+()重載的返回值
- 20. 矩陣運算符* = C++返回錯誤
- 21. 返回與運算符重載
- 22. OR運算符不返回true
- 23. 賦值運算符返回值類型
- 24. 大於運算符jquery不返回true
- 25. 新運算符是否返回NULL?
- 26. C#NOT(〜)位運算符返回負值
- 27. 運算符返回值問題
- 28. ++(或 - )運算符返回什麼?
- 29. 重載運算符的返回值
- 30. 返回投擲三元運算符?
這似乎是一個很奇怪的要求,沒有明確的動機。你想多解釋一下爲什麼你認爲你需要這個? – 2010-05-05 23:11:45
我正在編寫一個基於堆棧的編程語言。如果使用大於或小於它的值,它會從堆棧中彈出兩個項目並執行類似'stack.push(stack.pop()> stack.pop())'的操作。如果我想打印這個整數,它會把堆棧的頂部,並使用'str(stack.pop())'將其轉換爲一個字符串,並打印出來。我希望打印1或0,但打印出「真」或「假」。這使得if語句等事情變得複雜。 – None 2010-05-05 23:17:11
在Python中修改基本運算符不是答案。你可能不想Python的>(寫你自己的函數),或者你需要不同的行爲來將布爾轉換爲字符串(編寫你自己的函數)。 – 2010-05-05 23:30:18