我试过了:
>>> l = [1,2,3]
>>> x = 1
>>> x in l and lambda: print("Foo")
x in l && print "Horray"
^
SyntaxError: invalid syntax
一些谷歌搜索显示print
是python2
中的一个陈述,而python3
中有一个函数。但是,我已经在python3
中尝试了上面的剪辑,并抛出了SyntaxError异常。
有关如何在一行中进行操作的任何想法? (可读性或谷歌编程实践不是问题)
答案 0 :(得分:6)
l = [1, 2, 3]
x = 1
if x in l: print "Foo"
我不是一个自作聪明,这是在一行中做到这一点的方法。或者,如果您使用的是Python3:
if x in l: print("Foo")
答案 1 :(得分:2)
lambda
创造了一个lambda。需要调用来执行它。你不能这样做,因为Python在这个上下文中不允许语句,只允许表达式(包括函数调用)。
要在Python 2.x中创建print
函数,请尝试:
from __future__ import print_function
x in l and print('foo')
但要小心。如果您尝试:
x in l and print('foo') or print('bar')
它不起作用,因为print返回None
,因此第一个and
表达式为False,因此两个print
都将被执行。在Python 3.x中,您不需要导入。
如果您没有复杂的短路(即只有一个and
或or
),或者您知道您的功能或表达式不会让短路逻辑感到惊讶,那就没有错与代码。否则,尝试非短路1线:
print('foo') if x in l else print('bar')
仅当条件为True的概率/期望大于高于False时,才建议使用此表单。否则,简单的好if-else
就是你要走的路。
答案 2 :(得分:0)
使用from __future__ import print_function
消除print2作为Python2.x语句的缺点是第一步。然后以下所有工作:
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):
def check_and_print(x, l):
return x in l and not print("yes") or not not print("no")
那是丑陋的。要使打印透明,您可以定义另外两个版本
print,返回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")
答案 3 :(得分:0)
如果要在真假情况下打印不同的内容,请使用条件表达式创建要打印的值:print ('foo' if x in l else 'bar')
。
如果您只想在Python 2中输出一个函数,您可以尝试sys.stdout.write
(当然在您import sys
之后),但请记住,这远不是那么灵活;在这里,您将标准输出视为类文件对象(它是)。
lambda
几乎肯定在这里买不到任何东西。
使用和/或链接技巧是令人难以置信的非Pythonic。无论如何,人们都在努力克服这些黑客,知道他们有多糟糕,这正是为什么第1点的条件表达式被添加到语言中的原因。关于语法的讨论有很多 。