是否可以将值分解为几个函数?

时间:2019-11-22 12:46:53

标签: python python-3.x

是否可以在python中解包元素并将其直接传递给几个函数,而无需先将它们分配给变量? e。 g。

def my_function():
    return (1, 2)

# Not sure how the syntax would look like?
(function_1(#first element here), function_2(#second element here)) <= my_function()

3 个答案:

答案 0 :(得分:1)

有可能不将输出分配给任何变量,例如通过两次调用该函数,从理论上讲,仅当该函数是纯函数时才有意义。但是,我找不到任何有用的示例。我很好奇您为什么要这样做。

答案 1 :(得分:1)

有一种方法可以实现该目标。 这将需要您创建自己的方法来实现。

这是您可能想要执行此操作的简单方法。 在我的示例中,有一个名为dissolve_args_to_fns的函数可以接受函数,还有一个list可以保存输入函数的值。

dissolve_args_to_fns实施

from typing import Tuple, Any
from collections.abc import Iterable

def dissolve_args_to_fns(*fns, inputs: Tuple[Any, ...]):
    # If there are more inputs than there are functions, and vice-versa, throw error
    if len(fns) != len(inputs):
        raise ValueError('The numbers of functions dont match the number of inputs each function')

    # Holds the output corresponding to each function
    outputs = []
    for i, fn in enumerate(fns):
        # Individual input for each function
        inp = inputs[i]

        # Checks if the input for the function is an iterable
        # If so, then its probably for an argument that need multiple arguments
        if isinstance(inp, Iterable) :
            fn_out = fn(*inp)
        else:
            fn_out = fn(inp)

        outputs.append(fn_out)

    # returns an output if, there is any function that has an output
    # This extra checking step is not necessary
    if any(map(lambda x: x is not None, outputs)):
        return outputs

现在功能已完成,我们可以开始对其进行测试。 下面是3个自定义函数,其中一些具有输出,而其他则没有输出

def show(value):
    print("Here is", value)

def blink(value, blink_count:int = 2):
    print(f" *blink* {value}" *  blink_count)

def full_name(first_name, last_name) -> str:
    return "%s %s" % (first_name, last_name)

我还将使用sum内置函数来显示此实现可以使用的范围

_, name, _, _sum = dissolve_args_to_fn(show, full_name, blink, sum, inputs=(1, 2, ("Mike", "Tyson"), ([10, 5],)))

print("My name is", name)
print("Sum is:", _sum)

就是这样。现在,这个简单的功能就像魔术一样。

快乐的编码。

PS:如您所见,简单的实现不适用于关键字参数,但可以随意随意修改代码

答案 2 :(得分:0)

以下是对您在进一步评论中描述的内容的影响:

list1 = []
list2 = []


def my_function():
    return (1, 2)


def function_1(x1):
    list1.append(x1)


def function_2(x2):
    list2.append(x2)


lam = lambda x: (function_1(x[0]), function_2(x[1]))
lam(my_function())

验证:

>>> print(list1)
[1]
>>> print(list2)
[2]