Lambda表达式产生SyntaxError

时间:2018-08-22 20:14:57

标签: python string lambda

我正在寻找一个lambda表达式来打印整数,如果给定的字符串在给定的句子中用/分隔。这是我写的声明:

hunter = udf(lambda x : 'opened' in x.lower().split() print(10) elif 'clickedurl' in x.lower().split() print(20)  else print("null"))
s= it/is/opened/memory/tae
hunter(s)

我遇到以下错误

 File "/home/main.py", line 1                                                                                         
    hunter = udf(lambda x : 'opened' in x.lower().split() print(10) elif 'clickedurl' in x.lower().split() print 20  el
se print("null"))                                                                                                      
                                                              ^                                                        
SyntaxError: invalid syntax 

1 个答案:

答案 0 :(得分:3)

您的代码中存在多个语法错误,您必须修复所有这些错误。


首先,lambda表达式(像所有表达式一样)中不能包含语句,只能是表达式。

其中包括您似乎正在使用的Python 2的print语句。

如果要编写包含语句的函数,则需要使用def语句,而不是lambda表达式。


第二,如果您试图编写一个if-else表达式,那么您将获得该错误的语法。您需要先输入true表达式,然后输入if,然后输入要检查的条件,然后输入else,然后输入false表达式。

您似乎一直在尝试将条件放在true表达式之前,

'opened' in x.lower().split() print(10)

您不能那样做。这就是您所问的第一个SyntaxError的来源。


第三,您不能在elif表达式中使用if-else。您必须将其写入if-else表达式中,并将另一个if-else表达式作为假值。

这看起来会很恐怖。如果您发现自己有此需要,则几乎可以肯定要将其分解为if语句。


此外,尽管它不是非法,但使用if-else表达式产生副作用是非常令人误解的if-else表达式与选择一个或另一个值有关,而不是与产生一组副作用或其他副作用有关。如果需要后者,则需要一个if语句。

lambda也是如此。那是关于定义计算值的函数。仅因副作用而被调用的函数应该几乎总是def


所以,你想要的是这个

def thingy(x):
    if 'opened' in x.lower().split():
        print(10)
    elif 'clickedurl' in x.lower().split():
        print(20)
    else:
        print('null')

hunter = udf(thingy)

请注意,这使您有机会通过避免重复来改进内容(可读性和性能):

def thingy(x):
    words = x.lower().split()
    if 'opened' in words:
        print(10)
    elif 'clickedurl' words:
        print(20)
    else:
        print('null')

尽管您当然不希望使用xthingy之类的名称。我不知道这些东西代表什么,但是可以肯定。

最后,我不知道那个udf函数是什么,但是我无法想象它在调用总是返回None的函数时会返回任何有用的东西,所以我敢打赌除了这些问题之外,您还有其他问题,但希望您可以从这里解决。


当然,一旦解决所有问题,下一行也是 语法错误:

s= it/is/opened/memory/tae

这是试图分割一堆东西。即使itopenedmemorytae都是具有相关值的变量,is当然不是,因为它是内置运算符,因此您无法将其除以任何东西。

您可能在这里想要一个字符串。

此外,因为您不带任何参数调用split(),所以这只会拆分用空格分隔的内容。因此,您需要上面的split('/'),或这里想要空白。

所以:

s = 'it is opened memory tae'

如果您真的想做出这样一个巨大的表达,那是可能,但这将非常非常丑陋。

首先,您必须用函数调用替换该print语句。当然可以from __future__ import print_function,但是否则,您需要编写一个可以执行所需功能或使用已经存在的功能。

第二,您可能需要在if-else内插入一个if-else作为该函数的参数,或者需要在{{1 }}。我认为第一个不太可怕。

所以:

if-else

当然在表达式中,空格并不重要,因此您可以自由地重写它,以使其更加丑陋:

if-else

…或:

lambda x: sys.stdout.write(
    str(10 if 'opened' in x.lower().split() else (
             20 if 'clickedurl' in x.lower().split() else 'null'))
    + '\n')

我无法想象您为什么想要后者,但是后来我也无法想象您为什么想要前者,但是您似乎正在尝试编写尽可能多的类似内容,因此…。