我正在寻找一个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
答案 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')
尽管您当然不希望使用x
和thingy
之类的名称。我不知道这些东西代表什么,但是可以肯定。
最后,我不知道那个udf
函数是什么,但是我无法想象它在调用总是返回None
的函数时会返回任何有用的东西,所以我敢打赌除了这些问题之外,您还有其他问题,但希望您可以从这里解决。
当然,一旦解决所有问题,下一行也是 语法错误:
s= it/is/opened/memory/tae
这是试图分割一堆东西。即使it
,opened
,memory
和tae
都是具有相关值的变量,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')
我无法想象您为什么想要后者,但是后来我也无法想象您为什么想要前者,但是您似乎正在尝试编写尽可能多的类似内容,因此…。