从函数中访问对象和元组

3

我有一种感觉,应该有一种非常简单的方法可以从一个已评估的函数中访问特定元素。我试图实现的一个非常简单的例子是

def func(x):
    a = 2*x
    b = x*x
    return 1, 10, 100, (a,b)

我定义了一个变量x,函数返回一组值和一个元组。我想检索(例如)第一个元素和元组。代码如下:

hello, cello = func(2)[[0,3]]

返回一个错误。但是我可以单独访问这些元素。
bello = func(2)[3]

例如。
我正在使用的函数需要一段时间来评估,因此使其运行两次并不是一个理想的选择。此外,如果可能的话,我不想为元组的每个单独元素(包含许多个)创建一堆变量。
本质上,我希望有一个解决方案,类似于:
hello, cello = func(2)[[0,3]]

Where,

hello = 1
cello = (4,4)

谢谢。

3
只需解包并忽略您不需要的元素即可:hello,_,_,cello = func(2) - AChampion
我并不能真正理解你在问什么。这与函数无关;[[0,3]] 只是 Python 中无效的语法。如果你省略函数,只处理一个元组 (1, 10, 100, (2, 3)) ,它也无法工作。 - Daniel Roseman
Numpy数组允许像x[[0,3]]一样进行索引,但列表和元组不行。 - hpaulj
嗨,AChampion。虽然我可以执行您建议的解决方案,但我的函数实际上返回了相当多的变量。(我真的应该将它们分成更易管理的部分)。例如,是否有替代方法来键入像_,,,,,hello,,,,,cello,,,_,bello = func(2)这样的内容?@DanielRoseman和hpaulj。你们是完全正确的,该函数返回一个元组。我正在尝试通过索引访问较大元组中的元素和元组,因为我的较大元组可能非常大。 - kevqnp
你知道 RHS 拆包可以这样用吗:x,_,_,(_,b)=func(3)?但我觉得像这样的函数应该返回一些复合对象(元组或字典的元组),而不是一个很长的元组。期望从一个长元组中获取第三个和第十个项目是在自找麻烦。 - hpaulj
3个回答

3
所以您可以解压并忽略:
hello, _, _, cello = func(2)

但是如果结果更为复杂,可以使用 operator.itemgetter

from operator import itemgetter
hello, cello, bello = itemgetter(0, 3, 15)(func(2))

更详细地说:

或者更冗长地说:

my_results = itemgetter(0, 3, 15)
hello, cello, bello = my_results(func(2))

我不知道 itemgetter 可以使用 *args,而且它可以与字典以及列表/元组一起使用。我想知道它是否比列表推导式更快。在这个功能被添加之前,我学习了大部分的 Python(而且 numpy 也不需要它)。 - hpaulj
我查了一下 itemgetter,它是 Python 代码。itemgetter([1,2,3])(foo()) 等同于 obj=foo(); tuple([obj[i] for i in [1,2,3]])。这可能很方便,但并不会提高速度。 - hpaulj

0

标准解决方案是将返回值打包成字典,并使用它来分离结果。

这样可以避免计算下划线的数量,代码更易读。

return {iteration: iter, Result: res....}

Erg=func(....)

并在后面使用

Erg[iteration]


0

尝试

hello, cello = [func(2)[i] for i in [0,3]]

但这会在每次迭代i时运行func - hpaulj
itemgetter 重写了这个函数,以便 func(2) 只被计算一次。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接