x, temp = func()
    
2 个评论
我对这一点也很好奇,因为Matlab的类似概念是Ignore Function Outputs其中他们使用~作为语法来忽略一个特定的返回变量
AGP
你选择了错误的答案作为解决方案
python
function
tuples
Mat
Mat
发布于 2009-01-11
11 个回答
Luke Woodward
Luke Woodward
发布于 2017-10-19
已采纳
0 人赞同

你可以用x = func()[0]来返回第一个值,x = func()[1]来返回第二个,以此类推。

如果你想一次获得多个值,请使用类似x, y = func()[2:4]的东西。

这应该是公认的答案。 你也可以使用func()[2:4]这样的东西,如果你只想要some的返回值。
It doesn't call the function multiple times: >>> def test(): ... print "here" ... return 1,2,3 ... >>> a,b = test()[:2] here [edit: sorry that code didn't come through, aparently you only get one line in comments. For those not familiar >>> and ... are the start of a new line in the python shell]
@TylerLong:我认为_, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()不如多次调用函数来得清楚,但这只是我的看法。 如果你的函数返回那么多项目,我认为使用numpy会更合适。a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
@endolith 我觉得这样更好,不需要numpy,也不需要多次调用func()。【替换代码0【替换代码1b = result[25] ...
当你想忽略中间的一个或几个值时,这种风格就不好了,例如:x, __, y = func()
Brian Clapper
Brian Clapper
发布于 2017-10-19
0 人赞同

一个常见的惯例是用"_"作为你希望忽略的元组元素的变量名。比如说。

def f():
    return 1, 2, 3
_, _, x = f()
    
-1:当你在别人的代码中添加gettext功能时,这种 "惯例 "很糟糕(定义了一个名为'_'的函数),所以应该禁止它。
说得好--尽管gettext坚持安装一个名为""的函数,这一点值得商榷。"是个好主意。就我个人而言,我觉得它有点难看。 不管怎么说,使用""作为一个被抛弃的变量是普遍存在的。
-1: _在IPython中意味着 "最后输出"。 我永远不会给它分配东西。
好吧,我没有注意到 "I"--谢谢你的提醒。我认为,你不能指望别人不使用一个变量,就因为一个 Python 应用程序为它定义了自己的神奇用途。
一些IDE,如PyDev,会在这方面给你一个警告,因为你有未使用的变量。
Winston Chuen-Shih Yang
Winston Chuen-Shih Yang
发布于 2017-10-19
0 人赞同

如果你使用的是 Python 3,你可以在一个变量前使用星号 (在一个赋值的左边),让它在解包时成为一个列表。

# Example 1: a is 1 and b is [2, 3]
a, *b = [1, 2, 3]
# Example 2: a is 1, b is [2, 3], and c is 4
a, *b, c = [1, 2, 3, 4]
# Example 3: b is [1, 2] and c is 3
*b, c = [1, 2, 3]       
# Example 4: a is 1 and b is []
a, *b = [1]
    
THN
你也可以用a, *_ = f()来忽略a之后的任意数量的返回值。
lackadaisical
lackadaisical
发布于 2017-10-19
0 人赞同

通常的做法是使用虚拟变量_(单下划线),之前很多人在这里表示过。

然而,为了避免与该变量名称的其他用途发生冲突(见this响应),用__(双下划线)代替作为弃用变量可能是更好的做法,如图所示ncoghlan. E.g.:

x, __ = func()
    
完全不是一个坏主意。但是,'_ _'会在命名空间中声明一个变量。而'_'不会声明,除非像上面那样在赋值语句的左侧特别使用(例如:a, _, _ = 1,8,9)。在这之前,它存储的是最后执行的语句的结果,如果你想捕捉,你通常会用一个变量来存储这个值。这就是为什么建议用'_'这个变量名来捕捉垃圾值。'_' 的值在另一条语句执行后很快就会被覆盖掉。在'_ _'的情况下,值会留在那里,直到GC将其清除。
Evan Fosmark
Evan Fosmark
发布于 2017-10-19
0 人赞同

记住,当你返回一个以上的项目时,你实际上是返回一个元组。所以你可以这样做。

def func():
    return 1, 2
print func()[0] # prints 1
print func()[1] # prints 2
    
对语法很有用。这方面的一个问题是,它需要多次调用该函数。对于这样一个微不足道的函数,这没什么大不了的。但是,在更复杂的函数中,这可能是不可取的。很高兴知道有很多方法....
S.Lott
S.Lott
发布于 2017-10-19
0 人赞同

Three simple choices.

Obvious

x, _ = func()
x, junk = func()

Hideous

x = func()[0]

而且有办法用装修公司来做这件事。

def val0( aFunc ):
    def pick0( *args, **kw ):
        return aFunc(*args,**kw)[0]
    return pick0
func0= val0(func)
    
我真的更喜欢_这个变量。这很明显,你忽略了一个值
你的例子是倒过来的。 替换代码0】很难看,而x = func()[0]很明显。 赋值给一个变量,然后不使用它? 这个函数返回的是一个元组;像元组一样索引它。
Joe
在模式匹配语言中,Python 从这些语言中派生出这种模式,"明显的 "方法确实是明显的,不是狰狞的,而且是规范的。尽管在这些语言中,通配符是一个被支持的语言特性,而在 Python 中,它是一个真正的变量,并被绑定,这有点令人不快。
对于列表处理语言,Python 是由它衍生出来的 ;),列表访问器,如 a[0]。替换代码2】(列表复制)、a[::2](每两个元素)和a[i:] + a[:i](旋转列表),确实也是明显的和典型的。
cglacet
cglacet
发布于 2017-10-19
0 人赞同

最好的解决办法可能是为事物命名,而不是返回无意义的图元(除非在返回的项目的顺序背后有一些逻辑)。例如,你可以使用一个字典。

def func():
    return {'lat': 1, 'lng': 2}
latitude = func()['lat']

You could even use 命名元组如果你想添加关于你要返回的东西的额外信息(它不仅仅是一个字典,它是一对坐标)。

from collections import namedtuple 
Coordinates = namedtuple('Coordinates', ['lat', 'lng'])
def func():
    return Coordinates(lat=1, lng=2)
latitude = func().lat

如果你的 dictionary/tuple 中的对象是紧密联系在一起的,那么为它定义一个类可能是个好主意。这样,你就可以定义更复杂的操作。随之而来的一个自然问题是。我应该在什么时候使用 Python 中的类?

大多数最新版本的python(≥3.7)都有数据类目你可以用非常少的几行代码来定义类。

from dataclasses import dataclass
@dataclass
class Coordinates:
    lat: float = 0
    lng: float = 0
def func():
    return Coordinates(lat=1, lng=2)
latitude = func().lat

The primary advantage of 数据类目 over 命名元组 is that its easier to extend, but there are other differences. Note that by default, 数据类目 are mutable, but you can use @dataclass(frozen=True) instead of @dataclass to force them being immutable.

这里有一段视频这可能有助于你为你的用例挑选正确的数据类。

这是唯一能抓住这个问题所隐藏的核心的答案。如果你想从一个函数的元组输出中选择一个,它们可能不应该在一个元组中。元组是为那些以有序方式 "在一起 "的东西准备的。在OP的例子中,它们(可能)是 "质量不同 "的输出,并且应该以某种方式命名。在没有自然排序的情况下,要求读者理解第一个和第二个输出指的是什么,是一个麻烦的秘诀。
klozovin
klozovin
发布于 2017-10-19
0 人赞同

This seems like the best choice to me:

val1, val2, ignored1, ignored2 = some_function()

它并不隐晦或丑陋(像func()[index]方法),而且清楚地说明了你的目的。

Chrigi
Chrigi
发布于 2017-10-19
0 人赞同

如果这是一个你一直在使用的函数,但总是丢弃第二个参数,我认为用lambda为这个函数创建一个没有第二个返回值的别名,会比较不乱。

def func():
    return 1, 2
func_ = lambda: func()[0] 
func_()  # Prints 1 
    
1-ijk
1-ijk
发布于 2017-10-19
0 人赞同

这不是对该问题的直接回答。相反,它回答了这个问题。"我如何从许多可能的选项中选择一个特定的函数输出?"。

如果你能够编写这个函数(即它不在你不能修改的库中),那么添加一个输入参数,表明你想从这个函数中得到什么。让它成为一个有默认值的命名参数,这样在 "普通情况 "下,你甚至不需要指定它。

    def fancy_function( arg1, arg2, return_type=1 ):
        ret_val = None
        if( 1 == return_type ):
            ret_val = arg1 + arg2
        elif( 2 == return_type ):
            ret_val = [ arg1, arg2, arg1 * arg2 ]
        else:
            ret_val = ( arg1, arg2, arg1 + arg2, arg1 * arg2 ) 
        return( ret_val )

这种方法给函数提供了关于所需输出的 "预先警告"。因此,它可以跳过不需要的处理,只做获得所需输出的必要工作。同样因为Python是动态类型的,所以返回类型可以改变。注意这个例子是如何返回一个标量、一个列表或一个元组的......任何你喜欢的东西!

jeannej
jeannej
发布于 2017-10-19
0 人赞同

当你有很多函数的输出,而你又不想多次调用它时,我认为选择结果的最清楚的方法是:

results = fct()
a,b = [results[i] for i in list_of_index]

作为一个最起码的工作例子,也证明了函数只被调用一次。

def fct(a):
    b=a*2
    c=a+2
    d=a+b
    e=b*2
    f=a*a
    print("fct called")
    return[a,b,c,d,e,f]
results=fct(3)
> fct called
x,y = [results[i] for i in [1,4]]

而这些数值与预期的一样。

results
> [3,6,5,9,12,9]

为了方便,也可以使用Python列表索引。