我正在写一个接受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
这不是重复,因为我在问如何修正我的代码,而不是如何解决问题。而且这不是家庭作业,它只是一个可以更好地理解高阶函数的项目。
答案 0 :(得分:1)
如果使用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))
答案 1 :(得分:0)
列表理解不是这里的正确工具。您只需要一个值-列表理解总是创建一个列表。
由于这似乎是一种练习,因此与lambda的样式和高阶函数保持一致,因此您可以使用类似以下内容的方法进行递归:
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
答案 2 :(得分:0)
#Square Root
sqrt = lambda x: x ** (1/2)
#Repeat
def repeat(f,x,r):
if r > 0:
return repeat(f,f(x),r-1)
else:
return x
print(repeat(sqrt, 2, 2))
>> 1.189207115002721
使用递归的解决方案
答案 3 :(得分:-1)
def repeat(f,x,r):
return [f(i) for r in range(x)]
您正在尝试迭代不可能的数字