为了账号安全,请及时绑定邮箱和手机立即绑定

产生 SyntaxError 的 Lambda 表达式

产生 SyntaxError 的 Lambda 表达式

一只萌萌小番薯 2021-05-30 00:15:44
我正在寻找一个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/taehunter(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  else print("null"))                                                                                                                                                                    ^                                                        SyntaxError: invalid syntax 
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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


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


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


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


其次,如果你试图写一个if-else表达式,你的语法是错误的。您需要先放置真表达式,然后是if,然后是要检查的条件,然后是else,然后是假表达式。


您似乎一直在尝试将条件放在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-elseas作为该函数的参数,要么需要在一个if-else中的an的每个分支中调用该函数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')

当然,在表达式中,空格无关紧要,因此您可以根据需要自由地将其重写为更丑陋:


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

… 或者:


lambda x: sys.stdout.write(str

       (10 

  if 'opened' in x.

            lower

           (

         ).

     split() else (20

   if 'clickedurl' in x.lower().split() else 'null'))+ '\n')

我无法想象你为什么想要后者,但是后来我无法想象你为什么想要前者,但是你似乎正在尝试写尽可能多的东西,所以……它。


查看完整回答
反对 回复 2021-06-01
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信