我想从两个独立变量的函数中返回两个值。 例如:

def select_choice():
    loop = 1
    row = 0
    while loop == 1:
        print('''Choose from the following options?:
                 1. Row 1
                 2. Row 2
                 3. Row 3''')

        row = int(input("Which row would you like to move the card from?: "))
        if row == 1:
            i = 2
            card = list_a[-1]
        elif row == 2:
            i = 1
            card = list_b[-1]
        elif row == 3:
            i = 0
            card = list_c[-1]
        return i
        return card

我希望能够单独使用这些值。当我尝试使用return I, card时,它返回一个元组,这不是我想要的。


当前回答

你不能返回两个值,但你可以返回一个元组或一个列表,并在调用后解包:

def select_choice():
    ...
    return i, card  # or [i, card]

my_i, my_card = select_choice()

line return i, card i, card表示创建一个元组。你也可以像return (i, card)一样使用圆括号,但是元组是由逗号创建的,所以圆括号不是强制性的。但是您可以使用paren使您的代码更具可读性,或者将元组分割为多行。同样适用于行my_i, my_card = select_choice()。

如果希望返回两个以上的值,可以考虑使用命名元组。它将允许函数的调用者通过名称访问返回值的字段,这样可读性更强。您仍然可以通过索引访问元组的项。例如,在Schema中。Marshmallow框架返回一个UnmarshalResult,它是一个命名元组。所以你可以这样做:

data, errors = MySchema.loads(request.json())
if errors:
    ...

or

result = MySchema.loads(request.json())
if result.errors:
    ...
else:
    # use `result.data`

在其他情况下,你可以从函数中返回dict:

def select_choice():
    ...
    return {'i': i, 'card': card, 'other_field': other_field, ...}

但你可能想要考虑返回一个实用程序类的实例(或Pydantic/dataclass模型实例),它包装了你的数据:

class ChoiceData():
    def __init__(self, i, card, other_field, ...):
        # you can put here some validation logic
        self.i = i
        self.card = card
        self.other_field = other_field
        ...

def select_choice():
    ...
    return ChoiceData(i, card, other_field, ...)

choice_data = select_choice()
print(choice_data.i, choice_data.card)

其他回答

我想你想要的是一个元组。如果你使用return (i, card),你可以得到这两个结果:

i, card = select_choice()

使用list也可以返回多个值。检查下面的代码

def newFn():    #your function
  result = []    #defining blank list which is to be return
  r1 = 'return1'    #first value
  r2 = 'return2'    #second value
  result.append(r1)    #adding first value in list
  result.append(r2)    #adding second value in list
  return result    #returning your list

ret_val1 = newFn()[1]    #you can get any desired result from it
print ret_val1    #print/manipulate your your result

你不能返回两个值,但你可以返回一个元组或一个列表,并在调用后解包:

def select_choice():
    ...
    return i, card  # or [i, card]

my_i, my_card = select_choice()

line return i, card i, card表示创建一个元组。你也可以像return (i, card)一样使用圆括号,但是元组是由逗号创建的,所以圆括号不是强制性的。但是您可以使用paren使您的代码更具可读性,或者将元组分割为多行。同样适用于行my_i, my_card = select_choice()。

如果希望返回两个以上的值,可以考虑使用命名元组。它将允许函数的调用者通过名称访问返回值的字段,这样可读性更强。您仍然可以通过索引访问元组的项。例如,在Schema中。Marshmallow框架返回一个UnmarshalResult,它是一个命名元组。所以你可以这样做:

data, errors = MySchema.loads(request.json())
if errors:
    ...

or

result = MySchema.loads(request.json())
if result.errors:
    ...
else:
    # use `result.data`

在其他情况下,你可以从函数中返回dict:

def select_choice():
    ...
    return {'i': i, 'card': card, 'other_field': other_field, ...}

但你可能想要考虑返回一个实用程序类的实例(或Pydantic/dataclass模型实例),它包装了你的数据:

class ChoiceData():
    def __init__(self, i, card, other_field, ...):
        # you can put here some validation logic
        self.i = i
        self.card = card
        self.other_field = other_field
        ...

def select_choice():
    ...
    return ChoiceData(i, card, other_field, ...)

choice_data = select_choice()
print(choice_data.i, choice_data.card)

你可以试试这个

class select_choice():
    return x, y

a, b = test()
def test():
    ....
    return r1, r2, r3, ....

>> ret_val = test()
>> print ret_val
(r1, r2, r3, ....)

现在您可以对元组做任何您喜欢的事情。