偏函数:如何归一化两个局部的输出类型?

问题描述 投票:0回答:2

我对此感到麻烦...我有一些代码使用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(),它返回list而不是integer -如果我们严格执行此操作,则会使它版本与其余代码不兼容,需要使用数字类型)

sdist = functools.partial(random.choices, population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])

我似乎无法弄清楚如何构建或修改部分函数,​​使其也返回整数。我无法直接对可调用对象进行下标,即使它返回了列表。我认为可能有一些方法可以合并部分(嵌套部分?部分部分?),但我一直无法弄清楚。

python functional-programming partials
2个回答
1
投票

而不是partial,只需编写一个不包含任何参数并以所需形式返回所需值的包装函数:

def sdist():
    return random.choices(population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])[0]

如果要使细线成一行,只需使用lambda关键字:

sdist = lambda: random.choices(population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])[0]

1
投票

您想要的是function composition,在Python中实现此目标的一种方法如下:

import functools
import random

from operator import itemgetter

random.seed(42)


def compose(f, g):
    def composition():
        return f(g())

    return composition


sdist = functools.partial(random.choices, population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])

new_sdist = compose(itemgetter(0), sdist)

print(new_sdist())

输出

536

0
投票

所以我设法使它起作用,但我并不所有人都认为这是一个好方法。我最终添加了一个辅助函数来显式转换结果:

def firstElem(L):
    return L[0]

imixDistList = functools.partial(random.choices, population=[64, 536, 1300, 1500], weights=[0.4, 0.02, 0.02, 0.2])
imixDist = functools.partial(firstElem, imixDistList())

@@ jsbueno:我曾在其他地方使用过您的第一个示例,但它也是在试图理解部分用法,而不是“仅仅”解决问题。如果这是最蟒蛇般的方法是使用包装器的事情之一,那将是有道理的……只是[[似乎部分基础设施在这里会更有意义。

© www.soinside.com 2019 - 2024. All rights reserved.