2017-09-03 21 views
0

我试图复制C++式单线条件语句在Python像这样:单行条件句

我有一个函数定义:isPalidrome (mystr) - 返回True如果mystr是palidrome,False否则。该功能起作用。

现在我有一个简单的主要功能如下所示:

mystr ='' 
isitapalindromealready = lambda : if isPalindrome(mystr) ==True: return "" else return 'not' 
while mystr != 'quit': 
    mystr = input("enter a string: ") 
    print ('{} is {} a palindrome'.format(mystr, isitapalindromealready()) 

,但我得到一个语法错误 -

File "scratch1.py", line 45 
    isitapalindromealready = lambda : if isPalindrome(mystr) ==True: return "" else return 'not' 
            ^
SyntaxError: invalid syntax 

我做了检查非常接近复制我上面的逻辑类似的线程(它只是不会将lambda作为函数的任何地方)。

Conditional statement in a one line lambda function in python?

但是,没有一个答案解释了为什么这是一个语法错误。如果忽略PEP 8,则语法有效,除非您不能在与if相同的行中包含else

任何帮助,选项,替代考虑? 顺便说一句:我写了这个简单的程序来检查此功能,以减少更大的模块的逻辑大小。我非常清楚,如果在isPalindrome函数中检查其回文是否可以脱身。那不是我的问题的重点。

+1

@DYZ:请注意,您的上一次编辑使发布的错误消息无效,所以我将其回滚。 –

+0

[Python是否有三元条件运算符?](https://stackoverflow.com/questions/394809/does-python-have-a-ternary-conditional-operator) –

回答

3

你可以将你的条件放在一行上,当然。这是你如何在Python中做到这一点。

isitapalindromealready = lambda x: "" if isPalindrome(x) else "not" 

当然,你可以让lambda使用全局变量,但这不是我推荐的做法。一个写得很好的lambda应该是一个纯函数,这意味着你可以将参数传递给它。此外,暗示lambda不需要return。现在,你必须致电lambda作为这样的:

isitapalindromealready(mystr) 

isitapalindromealready = lambda x: "" if isPalindrome(x) else "not" 
while mystr != 'quit': 
    mystr = input("enter a string: ") 
    print ('{} is {} a palindrome'.format(mystr, isitapalindromealready(mystr)) 
-1

我希望他的解释帮助你。从doc

lambda_expr :: =“拉姆达” [parameter_list]:表达

lambda_expr_nocond :: =“拉姆达” [parameter_list]:expression_nocond

Lambda表达式(有时称为拉姆达形式)用于创建 匿名函数。表达式lambda参数:表达式 产生一个函数对象。该不愿透露姓名的对象表现如同定义的函数 对象:

DEF(参数): 返回表达式

所以,你必须将表达式传递给拉姆达。 A Conditional expressions(使用if/else关键字)是一个有效的表达式。你不能只传递一个if/else句子。一个有效的代码可能是:

isitapalindromealready = lambda x: "" if isPalindrome(x) else "not" 
+0

感谢它的工作 - 我犯的错误 - 是1)用C++来思考 - 我在想lambda是一个#defines而不是它们自己的函数表达式2)忘记if的特殊形式 - “”if ... 3)在if语句中包含分号:)。 – ssscld

+0

@ssscld很高兴能够提供帮助。 –