Verständnisproblem... Funktion unbestimmte Zahl an Werten ..

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
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Freitag 7. September 2007, 19:03

Hi,
komm irgendwie nicht dahinter.
Möchte gerne os.path.join eine unbestimmte Zahl an Ordnern übergeben.
Ich habe die Ordner in einer Liste:

Code: Alles auswählen

List=["Ordner1","Ordner2","Ordner3"]
und möchte diese Ordner von os.path.join verknüpfen lassen. Wie mache ich das? Die Liste übergeben

Code: Alles auswählen

os.path.join(List)
funktioniert natürlich nicht...

Danke
Stolzi
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Freitag 7. September 2007, 19:38

ansonsten könnt man's sich auch selber basteln...

Code: Alles auswählen

def join_(l):
	p = ""
	while len(l):
		p = j(p, l.pop(0))
	return p
Gehts auch als Einzeiler? Eher nicht, oder?
BlackJack

Freitag 7. September 2007, 20:30

Es geht natürlich (noch) als Einzeiler:

Code: Alles auswählen

In [54]: reduce(os.path.join, ['a', 'b', 'c'])
Out[54]: 'a/b/c'
Hat aber beides den Nachteil das `os.path.join()` mehrfach aufgerufen wird und immer Pfade als Zwischenergebnisse entstehen.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Samstag 8. September 2007, 09:14

Danke! Würd es nur noch gerne verstehen :-/ Was genau macht denn "*Liste"?

Danke
Stolzi
BlackJack

Samstag 8. September 2007, 09:45

Das Sternchen "entpackt" das "iterable" `Liste` auf die Argumente der Funktion.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Sonntag 9. September 2007, 11:34

Stolzi hat geschrieben:Danke! Würd es nur noch gerne verstehen :-/ i
http://docs.python.org/ref/calls.html
If the syntax "*expression" appears in the function call, "expression" must evaluate to a sequence. Elements from this sequence are treated as if they were additional positional arguments; if there are postional arguments x1,...,xN , and "expression" evaluates to a sequence y1,...,yM, this is equivalent to a call with M+N positional arguments x1,...,xN,y1,...,yM.

Code: Alles auswählen

>>> a = [1,2,3] # oder auch (1,2,3)
>>> foo(*a) # identisch mit foo(1,2,3)
>>> #oder auch
>>> foo(*(1,2,3)) # Wenngleich das auch ziemlich sinnlos ist
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Sonntag 9. September 2007, 13:55

....und ugekehrt kann eine funktion auch den sternchen benutzen um alle gegebenen argumente einzusameln:

Code: Alles auswählen

>>> def foo(*args):
    return args[0] + args[-1]

>>> foo(1,2,3,4)
5
>>> foo('foo','s', 'bar')
'foobar'
>>> foo(*xrange(100000))
99999
>>> 
cp != mv
Antworten