【发布时间】:2019-11-23 05:45:02
【问题描述】:
我遇到了这个问题...我有一些代码使用functools.partial,这样我就可以将无参数函数传递给后续函数。我所有的例子都来自random并返回整数,例如:
def main():
random.seed()
adist = functools.partial(random.uniform, 20, 2000) # no parameter function that returns int
tdist = functools.partial(random.randrange, 4096) # no parameter function returning int
这些随后在构造函数中使用,如下所示:
for n in range(4):
random.seed()
env = simpy.Environment() # Create the SimPy environment
line = runSim(env, adist, sdist, tdist) # dists expected to be ints
并且每次执行 runSim 时,我们都会根据partial 定义中描述的分布得到不同的随机值。我接下来要做的只是定义另一个分布偏函数,但这个函数使用random.choices(),它返回一个列表而不是一个整数——如果我们严格这样做,它会使该版本与需要数字类型的其余代码不兼容)
sdist = functools.partial(random.choices, population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])
我似乎想不通的是如何构建或修改部分函数,使其也返回一个整数。即使它返回一个列表,我也不能直接为可调用对象下标。我认为可能有一些方法可以组合部分(嵌套部分?部分部分?)但我无法弄清楚。
【问题讨论】:
-
这就是像
∘这样的函数组合运算符可以派上用场的地方:sdist = itemgetter(0) ∘ partial(random.choices, ...)。您可以使用lambda表达式更详细地编写此内容:sdist = lambda : itemgetter(0)(random.choices(...))。
标签: python functional-programming partials