在Scala中——因为它是一种函数式编程语言——我可以从一个起始值开始按顺序迭代一个函数,以创建一个数组[f(initial)、f(f(initial))、f(f(f(initial)),…]。 例如,如果我想根据当前温度预测未来温度,我可以在Python中执行如下操作:
import random as rnd
def estimateTemp( previousTemp):
# function to estimate the temperature, for simplicity assume it is as follows:
return( previousTemp * rnd.uniform(0.8, 1.2) + rnd.uniform(-1.0, 1.0))
Temperature = [0.0 for i in range(100)]
for i in range(1,100):
Temperature[i] = estimateTemp( Temperature[i-1] )
前面的代码的问题是它使用for循环,需要预定义的温度数组,在许多语言中,可以用迭代器替换for循环。例如,在Scala中,通过使用iterate方法创建列表,您可以轻松地完成上一个示例:
^{pr2}$这样的实现很容易理解并且写得很清楚。在
Python已经实现了itertools模块来模仿一些函数式编程语言。itertools模块中有没有模仿Scala迭代方法的方法?在
使用
itertools.accumulate
可以生成等效程序:这里我们有一个累加器
x
,它被更新,y
参数(它是iterable的下一个元素)被忽略。我们用它来迭代100次。在你可以把你的函数变成一个无限的生成器,然后取一个适当的部分:
不幸的是,
itertools
没有内置此功能。Haskell和Scala都有这个功能,这也让我很困扰。我正在开发的一个名为Alakazam的itertools
包装有一些附加的帮助函数,包括前面提到的iterate
函数。在使用Alakazam的可运行示例:
相关问题 更多 >
编程相关推荐