簡體   English   中英

如何在 IF 條件下分配一個變量,然后返回它?

[英]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 和直接支持ifwhile賦值的語言之間的音譯。 如果您在級聯中有“數百個”這樣的檢查和返回,那么做一些完全不同的事情會好得多:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM