我正在写一个更高的顺序,它需要一个lambda表达式,一个数字,然后它必须重复的次数。这就是我所拥有的:
#Square Root
sqrt = lambda x: x ** (1/2)
#Repeat
def repeat(f,x,r):
return [f(i) for r in x]下面是它应该做的事情:
>>> repeat(sqrt, 2, 0)
2
>>> repeat(sqrt, 2, 1)
1.4142135623730951
>>> repeat(sqrt, 2, 2)
1.189207115002721以下是错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "main.py", line 66, in repeat
return [f(i) for r in x]
TypeError: 'int' object is not iterable这不是重复,因为我问的是如何修复我的代码,而不是如何解决问题。这也不是家庭作业,它只是一个项目,更好地理解更高层次的功能。
发布于 2020-04-13 17:07:47
如果您使用for循环,这样的操作将有效。
#Square Root
sqrt = lambda x: x ** (1/2)
#Repeat
def repeat(f,x,r):
for i in range(r):
x = f(x)
return x
print(repeat(sqrt, 2, 2))发布于 2020-04-13 17:16:42
在这里,理解列表并不是正确的工具。你想要一个单一的值-一个列表理解总是创建一个列表。
由于这似乎是一项练习,为了与lambdas和高阶函数的样式保持一致,您可以使用以下内容进行递归:
sqrt = lambda x: x ** (1/2)
rep = lambda f, x, r: f(x) if r < 1 else f(rep(f, x, r - 1))
rep(sqrt, 2, 0)
# 1.4142135623730951
rep(sqrt, 2, 1)
# 1.189207115002721但是,如果r很大,则可能存在递归深度问题。
您也可以使用functools.reduce
from functools import reduce
sqrt = lambda x: x ** (1/2)
rep = lambda f, x, r: reduce(lambda n, _: f(n), range(r+1), x)
rep(sqrt, 2, 0)
# 1.4142135623730951
rep(sqrt, 2, 1)
# 1.189207115002721发布于 2020-04-13 17:09:13
def repeat(f,x,r):
return [f(i) for r in range(x)]您正在尝试迭代不可能的数字。
https://stackoverflow.com/questions/61192814
复制相似问题