Übergabeparameter als Liste, geht das?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
danilani
User
Beiträge: 1
Registriert: Sonntag 29. Juli 2018, 12:28

Hallo ich habe eine schnelle Frage die ich leider nicht in Google gefunden habe.

Ich habe einfach Funktion z.B:

Code: Alles auswählen

def testfkt(a, b, c, d):
    return a+b+c+d
wenn ich diese aufrufe muss ich ja 4 Parameter übergeben also z.b. so:

Code: Alles auswählen

print(testfkt(1,2,3,4))
In Python geht aber doch auch so eine zuweisung:

Code: Alles auswählen

a,b,c,d = [4,5,6,7]
.
Wenn ich jetzt also folgendes mache z.b.:

Code: Alles auswählen

z = [1,2,3,4]
und mit z dann die Funktion aufrufen will so:

Code: Alles auswählen

print(testfkt(z))
geht das nicht xD
Gibt es eine Möglichkeit das die Parameter dann quasi genau wie in der Zuweisung

Code: Alles auswählen

z = [1,2,3,4]
automatisch richtig erkannt werden und zugeteilt werden.

Ich hoffe ihr wisst was ich mein. Ich frage einfach nur aus Interesse das ganze hat keinen Vorteile für mich ich bin nu am Anfang und es erschien mir logisch das es auch so gehen könnte.

Gruß Dani ;-)
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Ja, mit einfachen Positionsargumenten geht das:

Code: Alles auswählen

In [1]: def f(x,y,z):
   ...:     return x + y + z
   ...: 
   ...: 

In [2]: l = [1, 2, 3]

In [3]: f(*l)
Out[3]: 6
Würde ich aber nur in Ausnahmefällen verwenden. Wenn man zusammengehörige Werte wie eine Liste verwenden möchte, passt man die Funktionssignatur entsprechend an und übergibt eine Liste.
Coder94
User
Beiträge: 6
Registriert: Donnerstag 21. Juni 2018, 12:26

nezzcarth hat geschrieben: Sonntag 29. Juli 2018, 12:49 Ja, mit einfachen Positionsargumenten geht das:

Code: Alles auswählen

In [1]: def f(x,y,z):
   ...:     return x + y + z
   ...: 
   ...: 

In [2]: l = [1, 2, 3]

In [3]: f(*l)
Out[3]: 6
Würde ich aber nur in Ausnahmefällen verwenden. Wenn man zusammengehörige Werte wie eine Liste verwenden möchte, passt man die Funktionssignatur entsprechend an und übergibt eine Liste.
Das könnte z.B. so aussehen:

Code: Alles auswählen

def summe(werte: list):
	return sum(werte)
Bzw. wenn man es ausführt:

Code: Alles auswählen

>>> def summe(werte: list):
... 	return sum(werte)
...
>>> test = [1,2,3,4,5]
>>> summe(test)
15
>>>
"Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." - John Woods
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`list` ist unnötig restriktiv weil `sum()` jedes iterierbare Objekt nimmt. Typannotationen sind Mist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1016
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

__blackjack__ hat geschrieben: Dienstag 31. Juli 2018, 11:18 Typannotationen sind Mist.
An den richtigen Stellen nicht.
Die Meinungen gehen da sehr stark auseinander.
Für Anfänger halte ich das aber auch etwas übertrieben zwanghaft.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Um type-annotations konsequent zu verwenden, sollte auch der Rückgabewert mit einbezogen werden. Das macht die Sache noch weniger flexibel. Sind Typ-Definitionen bei Cython sinnvoll, so sehe ich den Vorteil bei Python nur selten bis gar nicht.
Coder94
User
Beiträge: 6
Registriert: Donnerstag 21. Juni 2018, 12:26

DeaD_EyE hat geschrieben: Dienstag 31. Juli 2018, 11:46
__blackjack__ hat geschrieben: Dienstag 31. Juli 2018, 11:18 Typannotationen sind Mist.
An den richtigen Stellen nicht.
Die Meinungen gehen da sehr stark auseinander.
Für Anfänger halte ich das aber auch etwas übertrieben zwanghaft.
Generell schließe ich mich da gerne an. In diesem Fall war beabsichtigt aufzuzeigen, dass es absolut kein Problem darstellt, eine Liste zu übergeben. Natürlich hätte man das an dieser Stelle auch ohne 'list' machen können.

Aus dem beruflichen Alltag entnehme ich: Am besten so wenig Typannotationen wie möglich. Also wenn immer möglich, darauf verzichten.
"Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." - John Woods
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Typ-Annotationen fallen m. E. in die Kategorie "gut gemeint". Bei den Rückgabewerten sind sie hilfreich zur Dokumentation. Bei Parametern sehe ich sie kritisch, da diese häufig dem Duck-Typing entgegen läuft.

Hier wird eine statische Typprüfung vorgegaukelt, welche weder existiert noch gewollt ist.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@bwbg: Jede Neuerung in einer Sprache sollte ein spezifisches Problem lösen. Typ-Annotationen tun genau das. Sie lösen das Problem, das Python nicht genug wie Java ist. Siehe auch PEP 572.
In specifications, Murphy's Law supersedes Ohm's.
Antworten