首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复高阶函数

重复高阶函数
EN

Stack Overflow用户
提问于 2020-04-13 17:01:39
回答 3查看 80关注 0票数 0

我正在写一个更高的顺序,它需要一个lambda表达式,一个数字,然后它必须重复的次数。这就是我所拥有的:

代码语言:javascript
复制
#Square Root
sqrt = lambda x: x ** (1/2)

#Repeat
def repeat(f,x,r):
    return [f(i) for r in x]

下面是它应该做的事情:

代码语言:javascript
复制
>>> repeat(sqrt, 2, 0)
2
>>> repeat(sqrt, 2, 1)
1.4142135623730951
>>> repeat(sqrt, 2, 2)
1.189207115002721

以下是错误消息:

代码语言:javascript
复制
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

这不是重复,因为我问的是如何修复我的代码,而不是如何解决问题。这也不是家庭作业,它只是一个项目,更好地理解更高层次的功能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-13 17:07:47

如果您使用for循环,这样的操作将有效。

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2020-04-13 17:16:42

在这里,理解列表并不是正确的工具。你想要一个单一的值-一个列表理解总是创建一个列表。

由于这似乎是一项练习,为了与lambdas和高阶函数的样式保持一致,您可以使用以下内容进行递归:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-04-13 17:09:13

代码语言:javascript
复制
def repeat(f,x,r): 
    return [f(i) for r in range(x)]

您正在尝试迭代不可能的数字。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61192814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档