簡體   English   中英

給定一個輸出列表的函數,是否可以在 Python 中為每個組件提取一個函數?

[英]Given a function that outputs a list, is it possible in Python to extract a function for each component?

例如,假設我有一個將 R2 映射到 R2 的向量函數,例如:

fun = lambda x1, x2: [x1**2 + 1, x2**2 - x1]

我想要一些可以讓我這樣做的東西:

for f in components(fun):
    print(f(2,3))  # Print first 5, then 7

注意:我不是在問如何迭代 one out 的組件,這是微不足道的(對於 f(2,3): 中的 val),而是如何迭代計算輸出中每個組件的函數。 這可能嗎?

好吧,您可以做一些技巧,盡管您需要明確說明預期的組件數量,因為無法確定 Python 函數將具有多少輸出(除非您使用測試值執行“探測”函數之類的操作,這也是一種可能性,但更復雜):

def components(fun, n):
    for i in range(n):
        yield lambda *args, **kwargs: fun(*args, **kwargs)[i]

那么你的循環可能是:

for f in components(fun, 2):
    print(f(2,3))

如果你想避免重復計算,你可以使用某種記憶。 在 Python 3 中,您可以使用lru_cache

from functools import lru_cache

def components(fun, n):
    # You can tune lru_cache with a maxsize parameter
    fun = lru_cache()(fun)
    for i in range(n):
        yield lambda *args, **kwargs: fun(*args, **kwargs)[i]

我認為不可能按照您的要求進行操作,因為在這種情況下沒有兩個不同的功能。 它是一個以列表作為輸出的函數,將兩個參數作為輸入。

您可以創建兩個不同的函數並將其連接到一個大函數中,以獲得您對兩個單獨函數的訪問權限:

fun_1 = lambda x1: x1**2 + 1
fun_2 = lambda x1, x2: x2**2 - x1
fun = lambda x1, x2: [fun_1(x1), fun_2(x1, x2)]

我發現 sympy 將此類函數轉換為 sympy 表達式列表,因此我最終執行了以下操作:

from inspect import signature
import sympy

def components(function):
    # Determine number of argument function takes
    n_args = len(signature(function).parameters)
    # Allocate n symbols like x1, x2, ..., xn
    symbols = [sympy.Symbol("x"+str(i)) for i in range(1, n_args+1)]
    # Get list of expressions for the components of the input function
    expression_list = function(*symbols)

    # Convert each expression into a function and yield
    for expr in expression_list:
        yield lambda *args: sympy.lambdify(symbols, expr)(*args)

    return None

fun = lambda x1, x2: [x1**2 + 1, x2**2 - x1]

for f in components(fun):
    print(f(2,3))  # prints 5, 7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM