如何在 IF 条件中分配一个变量,然后返回它?

Posted

技术标签:

【中文标题】如何在 IF 条件中分配一个变量,然后返回它?【英文标题】:How to assign a variable in an IF condition, and then return it? 【发布时间】:2010-12-05 17:28:11 【问题描述】:
def isBig(x):
   if x > 4: 
       return 'apple'
   else: 
       return 'orange'

这行得通:

if isBig(y): return isBig(y)

这不起作用:

if fruit = isBig(y): return fruit

为什么第二个不起作用!?我想要一个 1 班轮。除了,第一个将调用函数 TWICE。

如何在不调用函数两次的情况下使其成为 1 行?

【问题讨论】:

你为什么要单线?程序不会因为行数减少而变得更好。 同***.com/questions/1513436/… 你有 100 个这样的?你不会碰巧在写解析器吧?请参阅 Ned Batchelder 网站上的此列表 (nedbatchelder.com/text/python-parsers.html)。 【参考方案1】:

Python 3.8 开始,并引入 assignment expressions (PEP 572)(:= 运算符),现在可以将条件值 (isBig(y)) 捕获为变量 (x) 以便重新使用它在条件的主体内:

if x := isBig(y): return x

【讨论】:

【参考方案2】:

您可以使用生成器:

def ensure(x):
    if x: yield x

for fruit in ensure(isBig(y)):
    return fruit

【讨论】:

【参考方案3】:
print "apple" if x > 4 else "orange"

【讨论】:

这与问题无关。【参考方案4】:

如果您想用 php(或 C)编写代码,请在其中编写代码。不要试图将其方法强加到另一种语言上。

Python 背后的基本原则之一(在我看来)是它的可读性。你应该使用:

fruit = isBig(y)
if fruit: return fruit

我还要提一下,你对isXXX() 的使用很奇怪;它通常用于返回布尔值。尤其是在这种情况下,您在 IF 语句中使用它。

【讨论】:

我不认为这两个版本或多或少具有可读性,但也许这是经验。此外,恕我直言,使其成为表达式更加一致,因为= 看起来像(并且被解释器和人类解析为)运算符(隐式表达式),而不是函数(隐式声明,尽管这在技术上并不正确)。 坦率地说,你不能总是在项目中使用你想要的语言,这是我见过的最没有帮助的答案之一。如果我能投票给你十几次,我会的。 Rabbit,如果您因任何原因需要使用特定语言,您应该正确使用它。试图硬塞其他语言结构是一个愚蠢的想法。我在 C 代码中看到了诸如 #define begin 这样奇怪的东西,因为 Pascal 程序员不想适应。这种行为使代码在两种语言中都毫无用处。【参考方案5】:

我看到其他人已经指出了我的旧“分配和设置”食谱食谱,其最简单的版本归结为:

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是不满足谓词时的正确返回值等

几乎总是,使用(甚至希望使用;-)Holder 技巧/非习语是一种“设计味道”,它建议寻找一种不同的、更 Pythonic 的方法——Holder 的一种情况是justified 正是我设计它的特殊情况,即您希望在 Python 代码和某些非 Python 代码之间保持密切对应的情况(您正在用 Python 转译参考算法并希望它在重构之前先工作)成更 Pythonic 的形式,或者您正在编写 Python 作为原型,一旦它有效工作,它将被音译成 C++、C#、Java 等)。

【讨论】:

【参考方案6】:

一个衬线不起作用,因为在 Python 中,赋值 (fruit = isBig(y)) 是一个语句,而不是一个表达式。在 C、C++、Perl 和无数其他语言中,它是一个表达式,你可以将它放在 ifwhile 或任何你喜欢的地方,但在 Python 中不行,因为 Python 的创建者认为这是太容易被误用(或滥用)来编写“聪明”的代码(就像你正在尝试的那样)。

另外,你的例子很愚蠢。 isBig() 将始终评估为 true,因为唯一错误的字符串是空字符串 (""),因此您的 if 语句在这种情况下是无用的。我认为这只是对您尝试做的事情的简化。只需这样做:

tmp = isBig(y)
if tmp: return tmp

真的有那么糟糕吗?

【讨论】:

谢谢。顺便说一句,当你有 100 个这样的情况时,情况会更糟:) 当你有 100 行这样的行时,听起来你的解决方案是次优的,但我不能不知道你在做什么。 至少,将您的测试用例输入一个列表并对其进行迭代以避免像那样将它们全部写出来。 如果是elif呢? @xuhdev 我希望elif 具有与if 相同的行为。【参考方案7】:

问题是赋值操作不能被评估为具有布尔值。 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

【讨论】:

(我没有投反对票,但是)缺少布尔返回并不是无法在if() 语句中使用它的原因。这两个限制都是语言将赋值定义为语句而不是表达式的副作用

以上是关于如何在 IF 条件中分配一个变量,然后返回它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Smarty 修饰符函数中分配新变量?

如何查找变量是在堆栈还是堆中分配?

如何在蒸汽叶中分配变量?

如何在测试中使用在 beforeAll() 钩子中分配了值的变量

ORACLE:在同一条语句中分配和检查

PHP:在if语句中分配多个变量