Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;“反思”;函数中的预期返回量_Python_Python 3.x_Function Calls - Fatal编程技术网

Python &引用;“反思”;函数中的预期返回量

Python &引用;“反思”;函数中的预期返回量,python,python-3.x,function-calls,Python,Python 3.x,Function Calls,大家好, 我目前正在开发一个python模块,该模块提供了供同事使用的工具,我试图提供的一些函数可以返回相当多的有用信息(比如,5个返回值),但在大多数情况下,只需要前两个 我知道python非常适合编写高度动态的程序,特别是因为我们可以询问有关当前运行的系统的信息,所以我想搜索一下,但似乎找不到。(我发现有很多有趣的讨论,但实际上没有讨论我的问题。) 是否有办法从函数内部了解预期返回值的数量? 例如,可能有以下功能: def lazyOdd(): return 1, 3, 5, 7,

大家好,
我目前正在开发一个python模块,该模块提供了供同事使用的工具,我试图提供的一些函数可以返回相当多的有用信息(比如,5个返回值),但在大多数情况下,只需要前两个

我知道python非常适合编写高度动态的程序,特别是因为我们可以询问有关当前运行的系统的信息,所以我想搜索一下,但似乎找不到。(我发现有很多有趣的讨论,但实际上没有讨论我的问题。)

是否有办法从函数内部了解预期返回值的数量?

例如,可能有以下功能:

def lazyOdd():
    return 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21
这将使用
one,three,five=lazyOdd()
调用

编辑:很显然,我一点也不清楚,我在寻找什么:

def lazyReturn():
    return (val1, val2) if expectedReturns == 2 else (val1, val2, val3, val4)
我知道,在这种情况下,这肯定不是最好的方法,几乎任何类型的iterable都可以做到,但是对于没有链接的值,它就不会那么简单了。如果可能的话,因为大多数用例将只使用两个结果,我希望避免返回一个大元组,因为许多同事甚至不知道函数返回其他值,而且它很容易出错

我可以这样做吗

编辑:另外,我不介意解决方案是否包含一些开销,因为我很可能会因为不处理最后三个值而赢得很多时间


Edit²:也许最好的方法是传递另一个参数,指定期望值的数量

我不太明白你想做什么。元组中由函数返回的元素数量由函数决定,或者更具体地说由编写函数的程序员决定。如果您的同事只对前两个要素感兴趣,他们可以这样做:

one, three, *_ = lazyOdd()
_是存储元组其余部分的垃圾变量。

缓存 很难从你的描述中分辨出来,但似乎你需要

这样,您可以编写多个函数。一个用于繁重的计算,另一个输出正确的格式和数值。如果使用相同的输入值再次调用繁重的计算,则返回先前的结果

from functools import lru_cache

@lru_cache(maxsize=32)
def heavy_common_calculation(x):
    print("HEAVY CALCULATION FOR %d. Should only be done once!" % x)
    result = x**2
    return result

def get_two_values(x):
    return x, heavy_common_calculation(x)

def get_four_values(x):
    y = heavy_common_calculation(x)
    return x, y, y**2, y**3

print(get_two_values(3))
# HEAVY CALCULATION FOR 3. Should only be done once!
# (3, 9)
print(get_four_values(3))
# (3, 9, 81, 729)
发电机 您想实现一个新的应用程序吗

如果你想要一个值,它会被计算出来。如果你不需要它,什么都不会发生,也没有什么是徒劳的

len(奇数根)
未定义,因为它将启动无限循环

关键字参数 可以使用参数告诉函数需要多少结果:

def f(x, detail='low'):
    a, b = x, x**2
    if detail == 'high':
        return a, b, 'something', 'else'
    else:
        return a, b


print(f(3))
# (3, 9)
print(f(3, detail='high'))
# (3, 9, 'something', 'else')

我想你把自己弄糊涂了。“我希望避免返回一个大元组”。试试
type(lazyOdd())
@Alceste\u。他的观点是,不管你如何处理它,你都会返回“一个大元组”。无论是显式创建元组(即
tuple=(a,b,c)
并返回该元组,还是只说
返回a,b,c
,都没有区别,在这两种情况下,您最终得到的是完全相同的元组。很抱歉,这太神秘了:它已经返回了
tuple
。您应该能够通过
len查看返回值的数量(懒散的)
。我知道,我的问题是允许它返回较小的元组,我将对其进行编辑,使其更清晰。我不知道您可以这样做,将所有不需要的返回保留在一个变量中,这肯定很有趣,可能会被证明很有用,但不如从被调用的func中获取预期的返回量方便这个例子被简化了,因为我不允许发布我的工作,但是正如它下面解释的那样,我需要返回根本没有链接的值。@ AlcStest.如果这些值没有链接,也许你应该考虑写两个不同的函数?>事实上,它们都需要进行相同的超大计算来确定它们。返回值的另一半需要另一个与前一半不同的处理块。@Alceste\uz:那么听起来你需要缓存。请看updateYeah,这看起来很棒,很遗憾,我需要尊重当前的结构,不能有multiple函数用于此任务。但我认为问题的答案(粗体)是无法实现的,我需要默认值参数。既然您也给出了该参数,我可能会接受您的答案。-尽管我会稍等,以防有人来直接给出明确的答案(我的帖子里有这么多xy,我想我真的不够清晰)。
def f(x, detail='low'):
    a, b = x, x**2
    if detail == 'high':
        return a, b, 'something', 'else'
    else:
        return a, b


print(f(3))
# (3, 9)
print(f(3, detail='high'))
# (3, 9, 'something', 'else')