2015-12-01 2 views
1

В Python, можно сделать несколько заданий следующим образом (или, скорее, есть сокращенная):Многократное назначение из функции

import random 

def random_int(): 
    return random.randint(1, 100) 

a, b = # for each variable assign the return values from random_int 
+0

создать словарь, добавить переменные к нему и возвращает словарь, то вы можете получить доступ к словарю индивидуальным переменному в вызывающей программе –

+0

@Allen мне было интересно, есть ли сокращенный. – blackened

+0

Зависит от того, что вы пытаетесь сделать ... – skyking

ответ

2

Вы хотите назначить различные возвращаемые значения из двух разных вызовов вашей случайной функции или одного значения двух переменных, порождаемых одним вызова функции.

Для первых, используйте кортеж распаковки

t = (2,5) 
a,b = t #valid! 

def random_int(): 
    return random.randint(1, 100) 
#valid: unpack a 2-tuple to a 2-tuple of variables 
a, b = random_int(), random_int() 
#invalid: tries to unpack an int as a 2-tuple 
a, b = random_int() 

#valid: you can also use comprehensions 
a, b = (random_int() for i in range(2)) 

Для второго, вы можете цепь задание назначить одинаковые значения для нескольких переменных.

#valid, "normal" way 
a = random_int() 
b = a 

#the same, shorthand 
b = a = random_int() 
+0

Кажется, что нет встроенного сокращения, поэтому я иду, чтобы перейти на a, b = (random_int() для i в диапазоне (2)) ' – blackened

-1

В моем тесте, если у вас есть ровно столько, сколько переменные как элементы в вашем возврате, то он работает.

def algo(): 
    return range(5) 

a5 = algo()      # works 
b1,b2,b3,b4,b5 = algo()   # works 
c1,c2,c3 = algo()     # doesn't work 
d1,d2,d3,d4,d5,d6 = algo()  # doesn't work. 
0

словарей являются хорошим способом, или же вы можете использовать namedtuples из коллекций в питоне, попробовать что-то вроде этого, вы получите несколько результатов обработки вызовов в одной переменных сказать

num = namedtuple("num", "b c d") 
a = num(random_int(),random_int(),random_int()) 
print a.b,a.c,a.d 

импорта:

from collections import namedtuple 
0

Вы можете вернуть любой объект, в том числе список и кортежа, которые могут быть upacked по заданию:

import random 

def random_ints(): 
    return random.randint(1, 100), random.randint(1, 100) 

a, b = random_ints() 
print(b, a) 

на самом деле это a, b ярлык для кортежа, а также, когда вы делаете несколько назначений разделенного запятыми списка переменных слева является кортежем тоже и может быть записан в виде:

(а, Ь) = диапазон (2)

0

Моим личным фаворитом было бы преобразование вашей функции в генератор (при условии, что оно хорошо вписывается в вашу программу).

Пример:

>>> import random 
>>> 
>>> def rnd_numbers(how_many=1): # assuming how_many is positive 
...  for _ in range(how_many): # use xrange() in Python2.x 
...   yield random.randint(1, 100) 
... 
>>> x, y, z = rnd_numbers(3) 
>>> x 
98 
>>> y 
69 
>>> z 
16 
>>> a,b = rnd_numbers(2) 
>>> a 
52 
>>> b 
33 
Смежные вопросы