Python 如何在lambda中指定参数类型?

Python 如何在lambda中指定参数类型?,python,lambda,Python,Lambda,对于常用函数,可以按如下方式注释类型 def my_function(arg1: int) 在lambda我该怎么做 lambda a: int, b: int : a+b 给出语法错误。对于您的特定问题,让我们看看reduce是如何工作的: lambda a, b : a[0] + b[0] 这里,a是上一次迭代的结果,b是当前元素 现在,让我们看看您的程序: functools.reduce(lambda a, b : a[0] + b[0], [[0,1], [2,3]]) 详情:

对于常用函数,可以按如下方式注释类型

def my_function(arg1: int)
在lambda我该怎么做

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

给出语法错误。

对于您的特定问题,让我们看看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 
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). 
它起作用了

但当你这样做的时候:

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 #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]
回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:“int”对象不可下标


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

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


问题是
reduce
将计算

result1 = func(x1, x2)
result2 = func(result1, x3)
...
函数接受两个
列表并返回一个数字,因此在第二次调用时函数失败(除非只提供两个元素)

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

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

答案是:你不能

从:

lambda的语法不支持注释。lambda的语法可以更改为支持注释,方法是在参数列表周围加括号。但是,决定[12]不进行此更改,因为:

这将是一个不相容的变化。 Lambda的已经绝育了。 lambda始终可以更改为函数


仅供参考:

但这并不能回答问题。这是“如何在python lambda中指定参数类型”,而不是“我如何才能做到这一点”。@Rightleg,你现在怎么看?答案更新了。这不是一个坏答案,只是没有回答主要问题。虽然它确实解决了OP的问题,但我还是投了反对票。如果Python告诉您
'int'对象不可订阅
,这意味着您要求它在
int
上调用
[]
。告诉这些对象是列表不会改变任何东西,因为它们仍然是实际的整数。此外,我认为,在Python中指定参数类型只不过是生成自文档代码的工具。据我所知,当遇到类型已声明的对象时,Python解释器不会有某些特殊的行为。类型注释不会修复类型错误。@jornsharpe-Man这是一个严厉的批评edit@Rightleg有两个完全不同的问题;因为这两个问题都有答案,所以我选择了一个似乎没有被其他“如何减少”问题愚弄的问题。@Jornsharpe必须删除所有与该部分相关的答案,然后