2

如果我想从 Python 中的函数返回多个变量,我一直在执行以下操作:

def foo():
    firstName = 'Bob'
    lastName = 'Jones'
    return [firstName, lastName]

然后,如果我只想找到第一个名字,我会这样做

[firstName, dummy] = foo()

但是,假设我最初拥有该功能

def fooInitial():
    firstName = 'Bob'
    return firstName

我从我的代码的许多部分调用它,如果我想以lastName我一直在做的方式将它添加为另一个输出,我将不得不在我的代码中调用它的其他地方进行更改。

有没有办法做类似于 Matlab 的事情,其中​​调用a = foo()给了我名字(不是列表中的第一个和最后一个)并[a,b]=foo()给我第一个和最后一个?

4

3 回答 3

6

不,没有。您最好更改所有代码调用fooInitial(),或者添加一个返回两个参数并使用该方法的不同方法:fooInitial()

def barInitial():
    first_name, last_name = 'Bob', 'Jones'
    return first_name, last_name

def fooInitial():
    return barInitial()[0]

请注意,您也可以只返回一个元组而不是一个列表;元组只需要一个逗号来定义,因此语法更轻(不需要方括号)。解压返回值时也可以这样做:

first_name, last_name = barInitial()
于 2013-08-09T10:34:37.437 回答
1

你可以这样做:

def foo(last=None):
    # current behaviour, change no code
    If not last:
        return 'bob'

    # new behaviour return first and last list
    return ['bob', 'jones']

使用默认参数添加命名关键字可为您提供您不想更改的代码的当前行为,以及您希望第一次和最后一次返回的新代码,您将使用

first, last = foo(last=true)
于 2013-08-09T12:23:27.117 回答
0

这是可能的,但我不建议这样做。

# WARNING: Breaks iteration over chars

class StrOrPair(str):
    def __new__(cls, name, lastname):
        return str.__new__(cls, name)

    def __init__(self, name, lastname):
        str.__init__(self, name)
        self.lastname = lastname

    # __iter__ is used for unpacking
    def __iter__(self):
        yield self
        yield self.lastname

def foo():
    return StrOrPair('Bob', 'Jones')

name = foo()
[first, second] = foo()

print(name) # Bob
print(first) # Bob
print(second) # Jones

# broken iteration over chars:
for c in name:
    print(c) # expect 'B', 'o', 'b' but get 'Bob', 'Jones'
于 2013-08-09T10:58:18.233 回答