【问题标题】:How can I return two values from a function in Python?如何从 Python 中的函数返回两个值?
【发布时间】:2012-04-02 22:08:14
【问题描述】:

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

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 时,它返回一个tuple,这不是我想要的。

【问题讨论】:

标签: python list function return return-value


【解决方案1】:

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

i, card = select_choice()

【讨论】:

    【解决方案2】:

    你不能返回两个值,但你可以返回一个tuple 或一个list 并在调用后解包:

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

    在线return i, cardi, card 表示创建一个元组。您也可以使用像return (i, card) 这样的括号,但元组是由逗号创建的,因此括号不是强制性的。但是您可以使用括号使您的代码更具可读性或将元组拆分为多行。这同样适用于my_i, my_card = select_choice() 行。

    如果要返回两个以上的值,请考虑使用named tuple。它将允许函数的调用者按名称访问返回值的字段,这样更具可读性。您仍然可以按索引访问元组的项目。例如,在Schema.loads 方法中,Marshmallow 框架返回一个UnmarshalResult,它是一个namedtuple。所以你可以这样做:

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

    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)
    

    【讨论】:

      【解决方案3】:
      def test():
          ....
          return r1, r2, r3, ....
      
      >> ret_val = test()
      >> print ret_val
      (r1, r2, r3, ....)
      

      现在你可以用你的元组做任何你喜欢的事情了。

      【讨论】:

        【解决方案4】:

        我想在两个单独的变量中从一个函数返回两个值。

        您希望它在呼叫端是什么样子?你不能写a = select_choice(); b = select_choice(),因为那样会调用函数两次。

        值不会“在变量中”返回;这不是 Python 的工作方式。函数返回值(对象)。变量只是给定上下文中值的名称。当您调用函数并在某处分配返回值时,您所做的是在调用上下文中为接收到的值命名。该函数不会为您将值“放入变量中”,赋值会(不要介意该变量不是值的“存储”,而只是一个名称)。

        当我尝试使用return i, card 时,它返回一个tuple,这不是我想要的。

        实际上,这正是您想要的。您所要做的就是再次拆开tuple

        我希望能够单独使用这些值。

        所以只需从tuple 中获取值。

        最简单的方法是解包:

        a, b = select_choice()
        

        【讨论】:

        • 感谢您解释“为什么会这样”。最佳答案 imo。
        【解决方案5】:

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

        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
        

        【讨论】:

          【解决方案6】:

          这是另一种选择。如果您以列表形式返回,那么获取值很简单。

          def select_choice():
              ...
              return [i, card]
          
          values = select_choice()
          
          print values[0]
          print values[1]
          

          【讨论】:

            【解决方案7】:
            def test():
                r1 = 1
                r2 = 2
                r3 = 3
                return r1, r2, r3
            
            x,y,z = test()
            print x
            print y
            print z
            
            
            > test.py 
            1
            2
            3
            

            【讨论】:

              【解决方案8】:

              你可以试试这个

              class select_choice():
                  return x, y
              
              a, b = test()
              

              【讨论】:

                猜你喜欢
                • 2021-04-13
                • 1970-01-01
                • 1970-01-01
                • 2016-05-07
                • 2014-06-28
                • 2010-09-30
                • 1970-01-01
                • 2011-04-18
                • 1970-01-01
                相关资源
                最近更新 更多