【问题标题】:How to specify argument type in lambda? [duplicate]如何在 lambda 中指定参数类型? [复制]
【发布时间】:2016-12-06 07:15:37
【问题描述】:

对于常用的函数,可以如下注释类型

def my_function(arg1: int)

如何在 lambda 中执行此操作?

lambda a: int, b: int : a+b

给出语法错误。

【问题讨论】:

  • 如果 Python 告诉您 'int' object is not subscriptable,这意味着您要求它在 int 上调用 []。告诉这些对象是列表不会改变任何事情,因为它们仍然是实际的整数。此外,我相信,在 Python 中指定参数的类型只不过是一种生成自记录代码的工具。据我所知,Python 解释器在遇到类型已声明的对象时不会有某些特殊行为。
  • 类型注释不能修复 TypeErrors。
  • @jonrsharpe 人编辑很苛刻
  • @Rightleg 有两个完全不同的问题;由于这两个问题都有答案,我选择了一个似乎不会被其他“我如何减少”问题的问题。
  • @jonrsharpe 必须删除与该部分相关的所有答案,然后

标签: python lambda


【解决方案1】:

问题是:“如何在 python lambda 中指定参数类型?”。 尽管其他答案都不错,但它们并不能回答这个主要问题。

答案是:你不能。

来自PEP specification of function annotations

lambda 的语法不支持注解。可以通过在参数列表周围使用括号来更改 lambda 的语法以支持注释。然而,决定 [12] 不进行此更改,因为:

这将是一个不兼容的更改。 无论如何,Lambda都是绝育的。 lambda 始终可以更改为函数。

供参考:https://stackoverflow.com/a/33833896/7051394

【讨论】:

    【解决方案2】:

    问题是reduce 会计算

    result1 = func(x1, x2)
    result2 = func(result1, x3)
    ...
    

    您的函数接受两个lists 并返回一个数字,因此第二次调用该函数失败(除非您只提供两个元素)。

    为了能够使用reduce,该函数应该接受两个参数并返回一个参数类型相同的值,因为该函数的输出将在下一次重新用作输入迭代。

    【讨论】:

      【解决方案3】:

      针对您的特定问题,让我们看看 reduce 是如何工作的:

      lambda a, b : a[0] + b[0]
      

      这里,a 是上一次迭代的结果,b 是当前元素。

      现在,让我们看看你的程序:

      functools.reduce(lambda a, b : a[0] + b[0], [[0,1], [2,3]])
      

      详情:

      iter #1: a = [0,1], b = [2,3], so, a[0] + b[0] = 0 + 2 =3 
      

      有效。

      但是当你这样做时:

      functools.reduce(lambda a, b : a[0] + b[0], [[0,1], [2,3], [4,5]]) 
      

      详情:

      iter #1: a = [0,1], b = [2,3], so, a[0] + b[0] = 0 + 2 =3 
      iter #2: a = 3, b = [4,5], so, a[0] + b[0] = Error, as you can't subscript an integer `3` (3[0] > Error). 
      

      错误再生:

      >>> a = 1
      >>> a[0]
      

      Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 TypeError: 'int' 对象不可下标


      您可以通过以下方式获得所需的结果:

      a = [[0,1], [2,3], [4,5]]
      print sum(map(lambda x:x[0],a))
      

      或者,

      print sum(i[0] for i in a)
      

      【讨论】:

      • 这并没有回答这个问题。它是“如何在 python lambda 中指定参数类型”,而不是“我该怎么做”。
      • @Rightleg,你现在怎么想?答案已更新。
      • 这不是一个糟糕的答案,它只是没有回答主要问题。虽然它确实解决了 OP 的问题,所以我收回了我的反对意见。
      猜你喜欢
      • 2020-09-24
      • 1970-01-01
      • 2018-01-28
      • 2018-07-20
      • 2021-05-16
      • 2019-11-04
      • 1970-01-01
      • 2011-11-26
      • 2023-03-04
      相关资源
      最近更新 更多