it-swarm.com.de

Übergeben einer Liste als Eingabe einer Funktion in Python

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?

11
Arpan Das

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]
14
gtlambert

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
18
Hugh Bothwell

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]
6
Alexander

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])
3
Munir

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.

3
Tobias Kienzler

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.

2
richardlaborde

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,]
0
user2255757