如何在Python中迭代函数来创建数组?

2024-10-01 05:07:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在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迭代方法的方法?在


Tags: 方法函数inforasuniform数组温度
3条回答

使用itertools.accumulate可以生成等效程序:

from itertools import accumulate

accumulate(range(0, 100), lambda x, y => estimateTemp(x))

这里我们有一个累加器x,它被更新,y参数(它是iterable的下一个元素)被忽略。我们用它来迭代100次。在

你可以把你的函数变成一个无限的生成器,然后取一个适当的部分:

import random as rnd    
from itertools import islice

def estimateTemp(startTemp):
    while 1:
        yield startTemp
        startTemp = (startTemp * rnd.uniform(0.8, 1.2) + rnd.uniform(-1.0, 1.0))

temperature = list(islice(estimateTemp(0.0), 0, 100))

不幸的是,itertools没有内置此功能。Haskell和Scala都有这个功能,这也让我很困扰。我正在开发的一个名为Alakazamitertools包装有一些附加的帮助函数,包括前面提到的iterate函数。在

使用Alakazam的可运行示例:

import random as rnd
import alakazam as zz

def estimateTemp(previousTemp):
    return( previousTemp * rnd.uniform(0.8, 1.2) + rnd.uniform(-1.0, 1.0))

Temperature = zz.iterate(estimateTemp, 0.0).take(100).list()
print(Temperature)

相关问题 更多 >