Ich benutze Python und habe eine Funktion, die eine Liste als Argument verwendet. Zum Beispiel verwende ich die folgende Syntax:
def square(x,result= []):
for y in x:
result.append=math.pow(y,2.0)
return result
print(square([1,2,3]))
und die Ausgabe ist [1]
nur dort, wo ich [1,4,9]
bekommen soll.
Was mache ich falsch?
Sie geben derzeit einen Wert aus Ihrer Funktion in der ersten Iteration Ihrer for
-Schleife zurück. Daher finden die zweite und dritte Iteration Ihrer for
-Schleife niemals statt. Sie müssen Ihre return
-Anweisung wie folgt außerhalb der Schleife verschieben:
import math
def square(x):
result = []
for y in x:
result.append(math.pow(y,2.0))
return result
print(square([1,2,3]))
Ausgabe
[1.0, 4.0, 9.0]
Warum nicht gemeinsam mit dem Problem umgehen?
def square(vals):
return [v*v for v in vals]
Edit: Das erste Problem ist, wie mehrere Leute hervorgehoben haben, dass Sie Ihre for
-Schleife kurzschließen. Ihre return
sollte nach der Schleife kommen, nicht drin.
Das nächste Problem ist Ihre Verwendung von list.append
- Sie müssen es aufrufen, aber nicht zuweisen, dh result.append(y*y)
. result.append = y*y
überschreibt stattdessen die Methode mit einem numerischen Wert, der wahrscheinlich beim nächsten Aufruf einen Fehler ausgibt.
Wenn Sie das Problem behoben haben, tritt ein anderer, weniger offensichtlicher Fehler auf, wenn Sie Ihre Funktion wiederholt aufrufen:
print(square([1,2,3]) # => [1, 4, 9]
print(square([1,2,3]) # => [1, 4, 9, 1, 4, 9]
Da Sie ein veränderliches Element (eine Liste) als Standard übergeben, zeigt die weitere Verwendung dieses Standardelements auf die gleiche ursprüngliche Liste.
Versuchen Sie es stattdessen
def square(vals, result=None):
if result is None:
result = []
result.extend(v*v for v in vals)
return result
Wir verwenden sogar result
? Sie können ein Listenverständnis verwenden, um Ihr Ergebnis zu generieren, das Sie dann zurückgeben. Ich bin nicht sicher, warum Sie result
als Variable an die Funktion übergeben haben, da sie nicht verwendet wird.
Wenn Sie return result
in Ihrer Schleife haben, bedeutet das, dass die Funktion den Wert bei der ersten Iteration zurückgibt, also nur das Quadrat der ersten Zahl in der Liste.
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]
Sie sollten außerhalb der for-Schleife zurückkehren. Andernfalls wird es nach der ersten Iteration angehalten.
def square(x):
result=[]
for y in x:
result.append(math.pow(y,2.0)) # add to list after calculation
return result
print(square([1,2,3])
Möglicherweise möchten Sie yield
verwenden.
def square(x):
for y in x:
yield math.pow(y, 2.0)
auf diese Weise können Sie entweder anrufen
for sq in square(x):
...
dies erzeugt nicht die gesamte Liste der Quadrate auf einmal, sondern nur ein Element pro Iteration, oder verwenden Sie list(square(x))
, um auf Anfrage die vollständige Liste zu erhalten.
Dies ist eine lustige Gelegenheit, einen etwas funktionaleren Stil zu verwenden:
import math
map(lambda x:(math.pow(x,2)), [1,2,3])
Hierbei wird die map
-Funktion verwendet, die eine Liste und eine Funktion übernimmt und eine neue Liste zurückgibt, in der diese Funktion einzeln auf jedes Mitglied der Liste angewendet wurde. In diesem Fall wendet er die Funktion math.pow(x,2)
auf jedes Mitglied der Liste an, wobei jede Zahl x ist.
Beachten Sie, dass map(lambda x:(math.pow(x,2)), [1,2,3])
eine iterable zurückgibt, was sehr praktisch ist. Wenn Sie jedoch eine Liste zurückholen möchten, packen Sie die gesamte Anweisung in list()
ein.
ihr Code macht nirgends Sinn. Syntaxfehler am Ende fehlt die schließende Klammer für den Ausdruck, der Rückruf in der for-Schleife bedeutet, dass er nur einmal ausgeführt wird, und result.append ist eine Funktion und kein Konstruktor für den richtigen Aufruf
result.append(math.pow(y,2))
das einzige, was kein Problem ist, ist die Weitergabe der Liste, die Ihre Frage ist. Die Funktion empfängt die gesamte Liste, wenn Sie dies tun
def f(a):
print a
f([1,2,3])
aus
[1,2,3,]