Python 3 脚本中的控制流程有很多步骤
Python 3 control flow in script with lots of steps
我正在 Python 中编写一个算法(学习它只是为了编写这个算法)并且我将它分解成小块或模块以便于理解。
在Python中,有没有一种干净的方法可以运行通过一组函数,最后一个传入前一个的值?
我现在有了这个,但可能还需要十几步才能使它看起来像一个巨大的金字塔和 fo:
calculate_excess_returns(
calculate_returns(
get_monthly_historical_returns('./assets/monthly_historical_returns.csv')
)
)
我也可以这样做,但我发现它的可读性较差:
monthly_historical_returns = get_monthly_historical_returns('./assets/monthly_historical_returns.csv')
calculated_returns = calculate_returns(monthly_historical_returns)
calculated_excess_returns = calculate_excess_returns(calculated_returns)
在 JavaScript 中,我们有一个名为 "promises" 的通用控制流,如下所示:
getJSON('story.json')
.then(function(story) {
return getJSON(story.chapterUrls[0]);
}).then(function(chapter1) {
console.log("Got chapter 1!", chapter1);
});
你可以看到结果一来就传递,很容易遵循流程:getJSON of story then getJSON of first chapter then 告诉用户他们已进入第 1 章。
如果能够在我的算法脚本中执行类似的操作,那就太好了:
SomeModuleOrPackage
.startWith(get_monthly_historical_returns('./assets/monthly_historical_returns.csv'))
.then(calculate_returns)
.then(calculate_excess_returns)
只是非常清楚每一步是什么。也许是某种循环的函数数组,并以某种方式将值传递给下一个?
您可以将它们放入 list
或 tuple
并循环遍历它们:
var = './assets/monthly_historical_returns.csv'
for func in (get_monthly_historical_returns,
calculate_returns,
calculate_excess_returns):
var = func(var)
基本上,您想要一种更好看的方式来组合函数。我建议您使用一些函数式编程包,例如 funcy
或 fn
。这是使用第一个包的示例。
import funcy
pipeline = funcy.rcompose(
get_monthly_historical_returns,
calculate_returns,
calculate_excess_returns
)
result = pipeline('./assets/monthly_historical_returns.csv')
或者如果你不打算多次使用管道,你可以直接计算结果:
result = funcy.rcompose(
get_monthly_historical_returns,
calculate_returns,
calculate_excess_returns
)('./assets/monthly_historical_returns.csv')
函数从左到右执行。一个函数的输出作为第一个参数传递给下一个 one.You 可以使用标准库中的 functools.partial
为您的函数提供额外的参数,如果它们需要多个参数,例如
import funcy
from functools import partial
composition = funcy.rcompose(
partial(func1, additional_arg_name=something),
...
)
我想你明白了。关于您的 getJSON
示例,您可以将匿名函数 (lambda
) 传递给 rcompose
以使代码看起来与您的 JavaScript 示例几乎相同。
您可以通过 pip 安装软件包:pip install funcy
我正在 Python 中编写一个算法(学习它只是为了编写这个算法)并且我将它分解成小块或模块以便于理解。
在Python中,有没有一种干净的方法可以运行通过一组函数,最后一个传入前一个的值?
我现在有了这个,但可能还需要十几步才能使它看起来像一个巨大的金字塔和 fo:
calculate_excess_returns(
calculate_returns(
get_monthly_historical_returns('./assets/monthly_historical_returns.csv')
)
)
我也可以这样做,但我发现它的可读性较差:
monthly_historical_returns = get_monthly_historical_returns('./assets/monthly_historical_returns.csv')
calculated_returns = calculate_returns(monthly_historical_returns)
calculated_excess_returns = calculate_excess_returns(calculated_returns)
在 JavaScript 中,我们有一个名为 "promises" 的通用控制流,如下所示:
getJSON('story.json')
.then(function(story) {
return getJSON(story.chapterUrls[0]);
}).then(function(chapter1) {
console.log("Got chapter 1!", chapter1);
});
你可以看到结果一来就传递,很容易遵循流程:getJSON of story then getJSON of first chapter then 告诉用户他们已进入第 1 章。
如果能够在我的算法脚本中执行类似的操作,那就太好了:
SomeModuleOrPackage
.startWith(get_monthly_historical_returns('./assets/monthly_historical_returns.csv'))
.then(calculate_returns)
.then(calculate_excess_returns)
只是非常清楚每一步是什么。也许是某种循环的函数数组,并以某种方式将值传递给下一个?
您可以将它们放入 list
或 tuple
并循环遍历它们:
var = './assets/monthly_historical_returns.csv'
for func in (get_monthly_historical_returns,
calculate_returns,
calculate_excess_returns):
var = func(var)
基本上,您想要一种更好看的方式来组合函数。我建议您使用一些函数式编程包,例如 funcy
或 fn
。这是使用第一个包的示例。
import funcy
pipeline = funcy.rcompose(
get_monthly_historical_returns,
calculate_returns,
calculate_excess_returns
)
result = pipeline('./assets/monthly_historical_returns.csv')
或者如果你不打算多次使用管道,你可以直接计算结果:
result = funcy.rcompose(
get_monthly_historical_returns,
calculate_returns,
calculate_excess_returns
)('./assets/monthly_historical_returns.csv')
函数从左到右执行。一个函数的输出作为第一个参数传递给下一个 one.You 可以使用标准库中的 functools.partial
为您的函数提供额外的参数,如果它们需要多个参数,例如
import funcy
from functools import partial
composition = funcy.rcompose(
partial(func1, additional_arg_name=something),
...
)
我想你明白了。关于您的 getJSON
示例,您可以将匿名函数 (lambda
) 传递给 rcompose
以使代码看起来与您的 JavaScript 示例几乎相同。
您可以通过 pip 安装软件包:pip install funcy