【问题标题】:Print "Foo" if an element is in a list如果元素在列表中,则打印“Foo”
【发布时间】:2012-02-18 23:44:48
【问题描述】:

我试过了:

>>> l = [1,2,3]
>>> x = 1
>>> x in l and lambda: print("Foo")
    x in l && print "Horray"
            ^
SyntaxError: invalid syntax

通过谷歌搜索发现printpython2 中的一个语句,而它是python3 中的一个函数。但是,我已经尝试了上面在python3 中的片段,它抛出了 SyntaxError 异常。

知道如何在一行中做到这一点吗? (可读性或谷歌编程实践在这里不是问题)

【问题讨论】:

  • 几个小时前有人问过similar question
  • 但是,我想做short-circuiting way
  • if x in l 确实 短路,因为它x 匹配l 中的第一个元素,它等于它,它不会评估其余部分元素
  • 他想短路外部布尔表达式,and 部分。喜欢x in l and foobar() or barbaz()
  • @Irfy 我误解了 OP 的意图。你的答案就是他想要的。

标签: python python-3.x python-2.x


【解决方案1】:
l = [1, 2, 3]
x = 1
if x in l: print "Foo"

我不是个聪明人,这是一行做到这一点的方法。或者,如果您使用的是 Python3:

if x in l: print("Foo")

【讨论】:

  • 但是,我想做short-circuiting way
  • +1 以获得正确的方法。我不知道人们对单行符有什么迷恋,我只能假设他们的环境中缺少换行符:-)
  • 有可能,虽然我不推荐,看我的回答。
  • Python 变得简单易读。这两个属性都存在于我发布的代码中,除非有正当理由使用短路评估,否则您只是在编写丑陋的代码。
【解决方案2】:

lambda 创建一个 lambda。需要调用来执行它。你不能那样做,因为 Python 不允许在这种上下文中使用语句,只允许表达式(包括函数调用)。

要使print 在 Python 2.x 中成为函数,请尝试:

from __future__ import print_function
x in l and print('foo')

不过要小心。如果你尝试:

x in l and print('foo') or print('bar')

不行,因为print返回None,所以第一个and表达式为False,所以prints都会被执行。在 Python 3.x 中,您不需要导入。

如果您没有复杂的短路(即只有一个 andor),或者您知道您的函数或表达式不会让短路逻辑感到惊讶,那么代码没有任何问题。否则,请尝试非短路 1-liner:

print('foo') if x in l else print('bar')

仅当条件为真的概率/预期大大高于为假时,才建议使用此形式。否则,普通的好老 if-else 是要走的路。

【讨论】:

  • 重构为print('foo' if x in l else 'bar')当然更明智。
【解决方案3】:

在Python2.x中使用from __future__ import print_function摆脱print作为语句的缺点是第一步。然后以下所有工作:

x in l and (lambda: print("yes"))()       # what an overkill!
(x in l or print("no")) and print("yes")  # note the order, print returns None
print("yes") if x in l else print("no")   # typical A if Cond else Y
print("yes" if x in l else "no")          # a more condensed form

为了更有趣,如果您对此感兴趣,可以考虑一下 - 打印并返回 True 或 False,具体取决于 x in l 条件(为了获得 False,我使用了 double not):

def check_and_print(x, l):
    return x in l and not print("yes") or not not print("no")

那太丑了。要使打印透明,您可以定义 2 个其他版本 打印,返回 True 或 False。这实际上可能对日志记录有用:

def trueprint(*args, **kwargs):
    print(*args, **kwargs)
    return True

def falseprint(*args, **kwargs):
    return not trueprint(*args, **kwargs)

result = x in l and trueprint("yes") or falseprint("no")

【讨论】:

    【解决方案4】:
    1. 如果您想在真假两种情况下打印不同的内容,请使用条件表达式创建要打印的值:print ('foo' if x in l else 'bar')

    2. 1234563在这里,您将标准输出视为类似文件的对象(它就是)。
    3. lambda 几乎可以肯定在这里什么都买不到。

    4. 使用和/或链接技巧令人难以置信地不符合 Python 风格。无论如何,人们都在与这些黑客作斗争,知道它们有多糟糕,这正是为什么将第 1 点中的那些条件表达式添加到语言中的原因。有很多关于语法的讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2014-11-30
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2012-09-09
      相关资源
      最近更新 更多