我必须创建一个函数列表,每个函数都非常相似,但是有一个不同的常量。
例如,我想要一个类似“乘法”的列表。
我需要数百个函数,所以我使用了一个for,问题是我创建的函数乘以当前的"i“值,而不是被声明函数时的"i”值。
如何获得所需的结果(例如,函数的第一列表)?
def main():
#method one (working)
multiplication = []
multiplication.append(lambda z:z*0)
multiplication.append(lambda z:z*1)
multiplication.append(lambda z:z*2)
multiplication.append(lambda z:z*3)
# moltiplication: 2*4
print(multiplication[2](4))
#output: 8
#method two (not working)
multiplication_2 = []
for i in range(4):
multiplication_2.append(lambda z:z*i)
#supposed to multiply 2*4 but multiply 4*i instead
print(multiplication_2[2](4))
#output: 12
i = 22
print(multiplication_2[2](4))
#output: 88
if (__name__ == '__main__'):
main()我知道我可以把一个参数传递给函数,但这只是一个例子,可以引导我解决我的问题。在实际用例中,需要像这样创建函数
发布于 2022-02-01 19:41:31
诀窍是确保在定义lambda时计算i,而不是在lambda的主体内(只有在lambda被调用时才会对其进行评估):
multiplication_2 = []
for i in range(4):
multiplication_2.append(lambda z, i=i: z * i)
print(multiplication_2[2](4))
#output: 8
i = 22
print(multiplication_2[2](4))
#output: 8i=i“技巧”之所以有效,是因为计算了右边(因此它在循环中获得了i的当前值),然后被用作lambda中i参数的默认参数值(跟踪i在外部作用域中可能具有的任何新值)。
如果参数不那么混乱,您可以为参数指定一个与默认参数不同的名称,例如:
multiplication = [(lambda z, j=i: z * j) for i in range(4)]
print([f(4) for f in multiplication]) # [0, 4, 8, 12]在上面的示例中,j是lambda中的参数,每个lambda对于j都有一个不同的默认值,相当于在创建lambda时i拥有的值。
https://stackoverflow.com/questions/70946541
复制相似问题