Python'daki bir işlevden iki değeri nasıl döndürebilirim?


195

İki ayrı değişkente bir fonksiyondan iki değer döndürmek istiyorum. Örneğin:

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

Ve bu değerleri ayrı ayrı kullanmak istiyorum. Kullanmaya çalıştığımda return i, card, a döndürür tupleve bu istediğim şey değildir.


Lütfen bu beklenen işlevi çağırmak ve dönüş değerlerini kullanmak için bir örnek verin, böylece neden tuples istemediğinizi netleştirir.
bereal

2
While döngüsünün amacı nedir?
Sven Marnach

else: continuedönüş beyanlarından önce bir olmalıdır
makine özlemi


Yanıtlar:


399

İki değer döndüremezsiniz, ancak çağrıdan sonra a tupleveya a döndürebilir listve paketten çıkarabilirsiniz :

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

my_i, my_card = select_choice()

On line return i, card i, cardbir demet oluşturmak demektir. Parantez gibi de kullanabilirsiniz return (i, card), ancak tizler virgül tarafından oluşturulur, bu nedenle parenler zorunlu değildir. Ancak kodunuzu daha okunabilir hale getirmek veya grubu birden çok satıra bölmek için parens kullanabilirsiniz. Aynısı çizgi için de geçerlidir my_i, my_card = select_choice().

İkiden fazla değer döndürmek istiyorsanız, adlandırılmış bir demet kullanmayı düşünün . İşlevin aracının döndürülen değerin alanlarına daha okunabilir şekilde erişmesine izin verir. Dizinin öğelerine yine de dizine göre erişebilirsiniz. Örneğin, Schema.loadsyöntemde Marshmallow çerçevesi UnmarshalResultbir namedtuple. Böylece şunları yapabilirsiniz:

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

veya

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

Diğer durumlarda dictişlevinizden a döndürebilirsiniz :

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

Ancak, verilerinizi saran bir yardımcı program sınıfının örneğini döndürmeyi düşünebilirsiniz:

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)

27

İki ayrı değişkente bir fonksiyondan iki değer döndürmek istiyorum.

Arayan tarafta nasıl görünmesini beklersiniz? Yazamazsınız a = select_choice(); b = select_choice()çünkü bu işlevi iki kez çağırır.

Değerler "değişkenlerde" döndürülmez; Python böyle çalışmaz. Bir işlev değerleri (nesneleri) döndürür. Değişken, yalnızca belirli bir bağlamdaki bir değerin adıdır. Bir işlevi çağırıp bir yere dönüş değeri atadığınızda, yaptığınız şey alınan değere çağrı bağlamında bir ad vermektir. İşlev sizin için "bir değişkene" değeri koymaz, atama yapar (değişkenin değer için "depolama" değil, yine sadece bir ad olduğunu unutmayın).

Kullanmaya çalıştığımda return i, card, bir döndürür tupleve bu istediğim değil.

Aslında, tam olarak istediğiniz şey. Tek yapman gereken tupletekrar parçalara ayırmak.

Ve bu değerleri ayrı ayrı kullanmak istiyorum.

Yani sadece değerleri tuple.

Bunu yapmanın en kolay yolu ambalajından çıkarmaktır:

a, b = select_choice()

1
"Neden böyle olduğunu" açıkladığınız için teşekkür ederiz. En iyi cevap imo.
Edward Coelho

17

Sanırım istediğin şey bir demet. Kullanırsanız return (i, card), şu iki sonucu elde edebilirsiniz:

i, card = select_choice()

8
def test():
    ....
    return r1, r2, r3, ....

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

şimdi istediğiniz her şeyi tupunuzla yapabilirsiniz.


5
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

2

Ve bu bir alternatiftir.Liste olarak dönüyorsanız, değerleri almak basittir.

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

values = select_choice()

print values[0]
print values[1]

2

bunu deneyebilirsin

class select_choice():
    return x, y

a, b = test()

1

Listeyi kullanarak birden fazla değer döndürebilirsiniz. Aşağıdaki kodu kontrol edin

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.