2016-01-31 14 views
11

Używam Python i mam funkcję, która pobiera listę jako argument. Na przykład, używam następującą składnię,Jak przekazać listę jako dane wejściowe funkcji w Pythonie

def square(x,result= []): 
    for y in x: 
     result.append=math.pow(y,2.0) 
     return result 

print(square([1,2,3])) 

i wyjście jest [1] tylko gdzie ja powinienem dostać [1,4,9].

Co robię źle?

+13

1. Nie zmieniaj domyślnych argumentów. 2. Możesz "zwrócić" tylko raz. – jonrsharpe

+1

Następnie w jaki sposób mogę zwrócić tablicę jako dane wyjściowe. Czy możesz dać mi jakiś pomysł? Dziękujemy –

+3

Przenieś wyjście z pętli for. –

Odpowiedz

14

Aktualnie zwracania wartości z funkcji w pierwszej iteracji pętli swojej for. Z tego powodu druga i trzecia iteracja twojej pętli for nigdy nie będzie miała miejsca. Trzeba przenieść swoje oświadczenie return zewnątrz pętli w następujący sposób:

import math 

def square(x): 
    result = [] 
    for y in x: 
     result.append(math.pow(y,2.0)) 
    return result 

print(square([1,2,3])) 

Wyjście

[1.0, 4.0, 9.0] 
+0

Jako że ktoś używał oparcia w programowaniu bazującym zamiast na wcięciach, muszę powiedzieć, że zmiana pojedynczej zakładki, z której funkcja powraca, jest czymś, co uważam za okropnie nieintuicyjne. – Pharap

+0

Ale nadal wcinasz swój kod, nawet jeśli używasz nawiasów klamrowych, prawda? – Matthias

18

Dlaczego problem nie występuje całkowicie na boku?

def square(vals): 
    return [v*v for v in vals] 

Edit: Pierwszym problemem, jak kilka osób podkreśliło, że jesteś zwarcie swoją pętlę for. Twój return powinien pochodzić z pętli, a nie w niej.

Następnym problemem jest korzystanie z list.append - należy do niego zadzwonić, a nie przypisać do niego, tj. result.append(y*y). result.append = y*y zamiast tego nadpisuje metodę wartością numeryczną, prawdopodobnie powodując błąd przy następnej próbie wywołania.

Po naprawić, można znaleźć innego mniej oczywisty błąd występuje, jeśli zadzwonisz czynność wielokrotnie:

print(square([1,2,3])  # => [1, 4, 9] 
print(square([1,2,3])  # => [1, 4, 9, 1, 4, 9] 

Bo zdać zmienny element (lista) jako domyślny, wszystkie dalsze stosowanie tego Domyślna pozycja wskazuje na tę samą oryginalną listę.

Zamiast próbować

def square(vals, result=None): 
    if result is None: 
     result = [] 
    result.extend(v*v for v in vals) 
    return result 
+2

To naprawdę nie mówi OP, gdzie się nie zgadzają i jest tylko jedną linią, jak wyrównać tablicę – ShaneQful

+1

@ShaneQful: proszę spojrzeć jeszcze raz. –

+0

Przepraszam, mój wstępny komentarz powyżej został oparty na wstępnej, zwięzłej odpowiedzi. Mieć głos w górę :) – ShaneQful

3

Należy zwrócić zewnątrz pętli for. W przeciwnym razie zatrzyma się po pierwszej iteracji.

def square(x): 
    result=[] 
    for y in x: 
     result.append=math.pow(y,2.0) 
    return result 

print(square([1,2,3]) 
+0

Append to funkcja, której nie chcesz tutaj nadpisywać. –

6

Używamy nawet result? Możesz użyć rozumienia listy, aby wygenerować wynik, który następnie zwrócisz. Nie jestem pewien, dlaczego przekazałeś result jako zmienną do funkcji, ponieważ nie jest ona używana.

Ponadto, mając return result wewnątrz pętli, funkcja zwraca wartość w pierwszej iteracji, więc zwraca po prostu kwadrat pierwszej liczby na liście.

import math 

def square(x): 
    return [math.pow(y, 2) for y in x] 

>>> print(square([1,2,3])) 
[1.0, 4.0, 9.0] 
+0

Cóż, na przykład może być postrzegana jako wartość początkowa. Być może OP miał na celu 'square ([1,2,3], [100,200,300])', aby zwrócić '[100,200,300,1,4,9]'. – muru

0

Twój kod nie ma sensu. błąd składniowy na końcu brakuje nawiasu zamykającego dla wydruku, wywołanie zwrotne wewnątrz pętli for, co oznacza, że ​​wykonuje się tylko jeden raz i wynik.Dołącz jest funkcją nie jest konstruktor sp prawidłowego wezwania jest

result.append(math.pow(y,2)) 

jedyną rzeczą, która nie jest problemem jest odejście od wykazu, który jest pytanie, funkcja odbiera całą listę, jeśli nie

def f(a): 
    print a 
f([1,2,3]) 

się

[1,2,3,] 
3

Możesz być zainteresowany wykorzystaniem yield

def square(x): 
    for y in x: 
     yield math.pow(y, 2.0) 

ten sposób można też nazwać

for sq in square(x): 
    ... 

które nie będzie generować całą listę pól na raz, ale raczej jeden element za iteracji lub użyj list(square(x)) aby uzyskać pełną listę na żądanie.

2

To jest zabawa możliwość korzystania styl nieco bardziej funkcjonalne:

import math 
map(lambda x:(math.pow(x,2)), [1,2,3]) 

ta wykorzystuje funkcję map, która pobiera listę i funkcję i zwraca nową listę, gdzie funkcja ta została zastosowana indywidualnie do każdego członka listy. W takim przypadku stosuje się funkcję math.pow(x,2) do każdego członka listy, gdzie każda liczba to x.

Zauważ, że map(lambda x:(math.pow(x,2)), [1,2,3]) zwraca wartość iterowalną, co jest bardzo wygodne, ale jeśli chcesz odzyskać listę, po prostu zapisz całą instrukcję w list().

Powiązane problemy