2011-12-13 21 views
6

Mam funkcję, w której zwracam dwie wartości. Chciałbym umieścić dwie wartości bezpośrednio w dwóch różnych tablicach. Wiem, jak zwrócić dane wyjściowe jako dwie różne wartości, które zostaną później dodane do tablicy, ale nie chcę mieć tych tymczasowych obiektów. Przykład jest pokazany poniżej.Python - zwracanie wielu wartości z funkcji do różnych tablic

def two_outputs(): 
    output_one = 5 
    output_two = 6 
    return output_one, output_two 

one_array = []  # initialize array 
two_array = []  # initialize array 

a, b = two_outputs() # get values 

one_array.append(a) # store first value in first array 
two_array.append(b) # store second value in first array 

Idealnie nie chciałbym używać aib i musiałem dołączyć na później w kodzie. Chciałbym dodać wyjście funkcji bezpośrednio do dwóch tablic. Czy to możliwe?

Dzięki za pomoc. Mam nadzieję, że zrobiłem to poprawnie, ponieważ jest to mój pierwszy post. Bardzo mi pomogliście już z problemami z programowaniem.

AKTUALIZACJA: Zgaduję na podstawie poniższych odpowiedzi, że nie można tego zrobić bezpośrednio. Dziękuję za pomoc wszystkich w znalezieniu innych sposobów na osiągnięcie celu.

+2

dlaczego chcesz to zrobić? co jest nie tak z tymczasowymi posiadaczami miejsc? – tkone

+1

Robię dużo pracy zbierając informacje z bazy danych, tworząc funkcje, które zwracają wiele wartości. Nie podoba mi się tymczasowe miejsce, ponieważ dodaje kroki do kodu i chcę, aby kod był mniejszy/krótszy. Poza tym nie ma żadnego technicznego powodu. Jestem ciekawy, czy jest możliwe, aby wyjście funkcji bezpośrednio do dwóch różnych tablic (lub więcej). Na podstawie poniższych odpowiedzi wygląda na to, że nie jest to możliwe. – ruffryder

Odpowiedz

1

Zakładając, że rozumiem cię poprawnie, musisz zdefiniować swoje tablice przed deklaracją funkcji.

one_array, two_array = [], [] 

def two_outputs(): 
    one_array.append(5) 
    two_array.append(6) 

#call function 
two_outputs() 

print one_array, two_array 
#[5] [6] 
5

Co powiesz na używanie funkcji pomocnika?

def zippend(lists, values): 
    assert len(lists) == len(values) 
    for l,v in zip(lists, values): 
    l.append(v) 

zippend((one_array, two_array), two_outputs()) 

Funkcja zippend przyjmuje dwa parametry. Pierwszym z nich jest iterable z List s (to, co masz na myśli jako "tablice" są faktycznie List s w python). Drugi to wartości, które należy dołączyć do tych list.

Może zawierać dowolną liczbę list i wartości, o ile liczba list odpowiada liczbie wartości (jedna wartość na liście).

EDIT: Jeśli two_outputs() miały powrócić krotką List s być łączone na one_array i two_array, a następnie można zmienić funkcję użyć extend zamiast append:

def zextend(lists, values): 
    assert len(lists) == len(values) 
    for l,v in zip(lists, values): 
    l.extend(v) 

Lub, jeśli naprawdę chciał można użyć pojedynczej funkcji z instrukcją if, która sprawdzała, jakie wartości pobierała i odpowiednio edytowała.

+2

Proponuję nazwę "zippend". –

+0

@ Laurence Podoba mi się! Edytowane! – dhg

+0

To wygląda całkiem interesująco. Czy możesz wyjaśnić nieco więcej tego? Zakładam, że możesz użyć tylu tablic i wyjść, ile chciałeś? – ruffryder

1

Zawsze możesz zmienić swoją funkcję, aby powrócić krotki list:

def test(): 
    # some code 
    return [a], [b] 

a, b = test() 

które pozwoli obu wykazach A i B, gdy są zwracane

0

można zrobić w jednej linii z następujących generator. Wywołanie "any" jest takie, że generator jest zużywany, a zatem wyrażenia w nim są wykonywane.

NB. Ja nie polecam ten styl programowania - to staje się trudniejsze do odczytania. Prawdopodobnie, jeśli to gdzie zbyt częsty idiom, bym napisać krótki funkcję pomocniczą dla przypisanie jak:

def multi_append(lists, multi_function, *args, **kw): 
    for lst, result in zip(lists, multi_function(*args, **kw)): 
     lst.append(result) 

A w „ciele” kodu, wystarczy napisać:

multi_append((array_one, array_two), two_outputs) 

W celu uzupełnienia, dodaję sugestię, która pozwoliłaby ci użyć operatora przypisania.

W tym przypadku potrzebny jest niestandardowy obiekt listy, który ma właściwość, która wykonuje dołączanie. Tworzenie takiej klasy to 2 linijka, ale wtedy listy w twoim kodzie musiałyby należeć do tej klasy:

class MList(list): 
    last = property(lambda s:s[-1], list.append) 

array_one, array_two = MList(), MList() 

array_one.last, array_two.last = two_outputs() 
+0

To jest interesująca metoda. Muszę trochę czytać na zajęciach ... – ruffryder

Powiązane problemy