Seite 1 von 1

Übergabeparameter als Liste, geht das?

Verfasst: Sonntag 29. Juli 2018, 12:35
von danilani
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 ;-)

Re: Übergabeparameter als Liste, geht das?

Verfasst: Sonntag 29. Juli 2018, 12:49
von nezzcarth
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.

Re: Übergabeparameter als Liste, geht das?

Verfasst: Dienstag 31. Juli 2018, 10:58
von Coder94
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
>>>

Re: Übergabeparameter als Liste, geht das?

Verfasst: Dienstag 31. Juli 2018, 11:18
von __blackjack__
`list` ist unnötig restriktiv weil `sum()` jedes iterierbare Objekt nimmt. Typannotationen sind Mist.

Re: Übergabeparameter als Liste, geht das?

Verfasst: Dienstag 31. Juli 2018, 11:46
von DeaD_EyE
__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.

Re: Übergabeparameter als Liste, geht das?

Verfasst: Dienstag 31. Juli 2018, 11:51
von kbr
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.

Re: Übergabeparameter als Liste, geht das?

Verfasst: Dienstag 31. Juli 2018, 12:34
von Coder94
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.

Re: Übergabeparameter als Liste, geht das?

Verfasst: Dienstag 31. Juli 2018, 22:32
von bwbg
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.

Re: Übergabeparameter als Liste, geht das?

Verfasst: Mittwoch 1. August 2018, 00:20
von pillmuncher
@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.