[英]How to assign a variable in an IF condition, and then return it?
def isBig(x):
if x > 4:
return 'apple'
else:
return 'orange'
這有效:
if isBig(y): return isBig(y)
這不起作用:
if fruit = isBig(y): return fruit
為什么第二個不起作用? 我想要一個 1-liner,Except。 第一個將兩次撥打 function。
如何在不調用 function 兩次的情況下使其成為 1 個班輪?
從Python 3.8
開始,並引入賦值表達式 (PEP 572) ( :=
運算符),現在可以將條件值( isBig(y)
)捕獲為變量( x
)以便在正文中重新使用它條件:
if x := isBig(y): return x
我看到其他人已經指出了我舊的“分配和設置”食譜食譜,它最簡單的版本歸結為:
class Holder(object):
def set(self, value):
self.value = value
return value
def get(self):
return self.value
h = Holder()
...
if h.set(isBig(y)): return h.get()
然而,這主要是為了簡化 Python 和直接支持if
或while
賦值的語言之間的音譯。 如果您在級聯中有“數百個”這樣的檢查和返回,那么做一些完全不同的事情會好得多:
hundreds = isBig, isSmall, isJuicy, isBlah, ...
for predicate in hundreds:
result = predicate(y)
if result: return result
甚至像
return next(x for x in (f(y) for f in hundreds) if x)
如果不滿足謂詞,則可以獲取 StopIteration 異常,或者
return next((x for x in (f(y) for f in hundreds) if x)), None)
如果None
滿足謂詞時None
是正確的返回值,等等。
幾乎無一例外,使用(甚至希望為;-)的Holder
伎倆/非成語是“設計異味”這表明尋找一個不同的,更Python的方法-其中一個案例Holder
是合理的正是對於特殊情況這是我設計的,即,您希望在 Python 代碼和某些非 Python 代碼之間保持密切對應的情況(您在 Python 中音譯一個參考算法,並希望它在將其重構為更 Pythonic 的形式之前首先工作,或者您正在編寫 Python 作為原型,一旦它有效工作,它將被音譯為 C++、C#、Java 等)。
one liner 不起作用,因為在 Python 中,賦值( fruit = isBig(y)
)是一個語句,而不是一個表達式。 在 C、C++、Perl 和無數其他語言中,它是一個表達式,你可以把它放在if
或 a while
或任何你喜歡的地方,但在 Python 中不行,因為 Python 的創造者認為這太容易被誤用了(或濫用)編寫“聰明”的代碼(就像你想的那樣)。
另外,你的例子很愚蠢。 isBig()
將始終評估為true
,因為唯一為 false 的字符串是空字符串 ( ""
),因此您的if
語句在這種情況下是無用的。 我認為這只是您嘗試做的事情的簡化。 只需這樣做:
tmp = isBig(y)
if tmp: return tmp
真的有那么糟糕嗎?
如果您想用 PHP(或 C)編寫代碼,請在其中編寫代碼。 不要試圖將其方法強加到另一種語言上。
Python 背后的基本原則之一(在我看來)是它的可讀性。 你應該使用:
fruit = isBig(y)
if fruit: return fruit
我還應該提到你對isXXX()
使用很奇怪; 它通常用於返回布爾值。 特別是在這種情況下,您在IF
語句中使用它。
您可以使用生成器:
def ensure(x):
if x: yield x
for fruit in ensure(isBig(y)):
return fruit
由於故意的語言設計,此方法不起作用,但是您可以使用此技巧來繞開此決定
問題是賦值操作不能被評估為具有布爾值。 if
語句依賴於能夠評估布爾值。 例如,
>>> fruit = 'apple'
>>> bool(fruit = 'apple')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/Users/jem/<ipython console> in <module>()
TypeError: 'fruit' is an invalid keyword argument for this function
>>> bool('a')
True
print "apple" if x > 4 else "orange"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.