Funktion mit Rückgabewert

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.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

Hallo Leute,

ich habe eine Funktion geschrieben die alle Ordner und Unterordner ausliest.
Das tut Sie auch. Wenn ich das Ergebnis mit return zurückgeben will.
Wird mir nur ein Ordner angezeigt. Mein Code:

Code: Alles auswählen

def ordner_unterordner_auslesen(quelle):
    for root, dirs, files in os.walk(quelle, topdown=True):
        for name in dirs:
            datei_pfad=(os.path.join(root,name)) 
            return datei_pfad
            
Den Aufruf mache ich so.

Code: Alles auswählen

src = r'C:\Temp'
ordner_unterordner_auslesen(src)
result = ordner_unterordner_auslesen(src)
print(result)
Als Ergebnis in der Ausgabe erhalte ich, C:\Temp
Die Funktion soll mir aber alle Ordner und Unterordner zurück geben ?
Kann mir irgendjemand behilflich sein ?

Danke...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn man mehrere Dinge zurueckgeben will, dann muss man die in einer Datenstruktur aufsammeln, und *die* zurueckgeben. Also zb eine Liste, und die dann mit append befuellen mit deinen Dateinamen.

Oder gleich pathlib.Path.rglob benutzen. Eine Zeile Code.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Montag 14. Februar 2022, 17:48 Wenn man mehrere Dinge zurueckgeben will, dann muss man die in einer Datenstruktur aufsammeln,
Hallo,

ich habe schon Beispiele aus dem Netz ausprobiert, return gibt mir immer nur einen Wert zurück.
Hast du ein Beispiel für mich ?

Bis dann...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

def funktion():
    schau_ganz_viele_werte = [1, 2, 3, 4]
    return schau_ganz_viele_werte

print(funktion())
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Montag 14. Februar 2022, 18:11

Code: Alles auswählen

def funktion():
    schau_ganz_viele_werte = [1, 2, 3, 4]
    return schau_ganz_viele_werte

print(funktion())
Hallo,
das ist mir klar das geht auch bei mir, sowas habe ich schon getestet.
Ich benutze aber eine For in schleife, diese geht alle Ordner und Unterordner durch.
Return gibt mir aber nur einen Ordner zurück, alles andere wird mir nicht angezeigt.

Rückgabe C:\Temp\1 ,so das wars. Obwohl in dem Ordner mehrere Verzeichnisse liegen.
Benutze ich Print in der Funktion wird mir alles angezeigt. Ich möchte das Return mir alle Durchläufe zurückgibt. Wie genau geht das. Hast du einen Link ?

Danke...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

An der Stelle, wo ein return steht, wird die Funktion beendet. So ist das nunmal. Also wenn das nicht das ist, was passieren soll - dann darf da eben kein return stehen, oder? Weswegen ich auch gesagt habe, dass du die Ergebnisse in einer Liste *aufsammeln* musst, mit append.

Und von der Vorstellung, dass fuer jedes deiner Problem ein fertiges Beispiel da draussen gibt, musst du dich mal verabschieden. Wobei so ganz stimmt das natuerlich nicht, sowas wurde dir speziell ja schon gezeigt - siehe zb

viewtopic.php?f=1&t=52726#p391542

Oder hier:

viewtopic.php?f=1&t=53259#p395199

Ueberall schon gezeigt, wie man Dinge in einer for-schleife in einer Liste aufsammelt.
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@PeterL: Du musst die einzelen Ergebnisse in einer Liste einsammeln und dann die Liste zurückgeben:

Code: Alles auswählen

def ordner_unterordner_auslesen(quelle):
    results = []
    for root, dirs, files in os.walk(quelle, topdown=True):
        for name in dirs:
            results.append(os.path.join(root, name))
    return results
Oder mittels einer List Comprehension:

Code: Alles auswählen

def ordner_unterordner_auslesen(quelle):
    return [
        os.path.join(root, name)
        for root, dirs, files in os.walk(quelle, topdown=True)
            for name in dirs
    ]
Alles ungetestet.
In specifications, Murphy's Law supersedes Ohm's.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Montag 14. Februar 2022, 18:39 An der Stelle, wo ein return steht, wird die Funktion beendet. So ist das nunmal. Also wenn das nicht das ist, was passieren soll - dann darf da eben kein return stehen, oder?

Und von der Vorstellung, dass fuer jedes deiner Problem ein fertiges Beispiel da draussen gibt, musst du dich mal verabschieden.

viewtopic.php?f=1&t=52726#p391542

Oder hier:

viewtopic.php?f=1&t=53259#p395199

Ueberall schon gezeigt, wie man Dinge in einer for-schleife in einer Liste aufsammelt.
Hallo,

wie gesagt wie man mit Listen arbeitet weis ich.
Ich Wuste nur nicht das Return am ende aufgerufen wird. Ich dachte man kann die Pfade
mit Return zurückgeben innerhalb einer For schleife

Also so: 'return Pfad' bei jedem Durchlauf den aktuellen Pfad zurückgeben.
Wie gesagt Listen erstellen hatte ja geklappt nur die Ausgabe mit return nicht.
Ich habe es so versucht:

Code: Alles auswählen

 Das ist richtig : results.append(os.path.join(root, name)) ,und das ist falsch : results(root,name)


trotzdem danke für deine Hilfe.
Ich lese immer zuerst bei Google und in diesem Forum.
Es sind manchmal nur Kleinigkeiten, wo man nicht weiter kommt, weil man etwas falsch gemacht hat, und es nicht merkt, wo der Fehler ist. Nun habe ich fast 5 Stunden damit verbracht den Fehler zu finden. 8)

Bis die Tage...
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

pillmuncher hat geschrieben: Montag 14. Februar 2022, 18:41 @PeterL: Du musst die einzelen Ergebnisse in einer Liste einsammeln und dann die Liste zurückgeben:

Code: Alles auswählen

def ordner_unterordner_auslesen(quelle):
    results = []
    for root, dirs, files in os.walk(quelle, topdown=True):
        for name in dirs:
            results.append(os.path.join(root, name))
    return results
Oder mittels einer List Comprehension:

Code: Alles auswählen

def ordner_unterordner_auslesen(quelle):
    return [
        os.path.join(root, name)
        for root, dirs, files in os.walk(quelle, topdown=True)
            for name in dirs
    ]
Alles ungetestet.
Hallo ,

Ok, danke für deinen Tipp.
Ich hatte es mit return so ausgegeben results(root,name) da lag der Fehler.
Und ich Wuste nicht das return immer am ende ausgeführt wird.

Es läuft danke...
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

PeterL hat geschrieben: Montag 14. Februar 2022, 19:44 Und ich Wuste nicht das return immer am ende ausgeführt wird.
Wenn du derart grundlegende Sachen nicht weißt, solltest du das offizielle Tutorial durcharbeiten.
In specifications, Murphy's Law supersedes Ohm's.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

pillmuncher hat geschrieben: Montag 14. Februar 2022, 19:47
PeterL hat geschrieben: Montag 14. Februar 2022, 19:44 Und ich Wuste nicht das return immer am ende ausgeführt wird.
Wenn du derart grundlegende Sachen nicht weißt, solltest du das offizielle Tutorial durcharbeiten.
Hallo ,
ok ich habe den Link gespeichert.
Ich habe auf YouTube ein Video gesehen wie man Funktionen macht.
Das return am Ende ausgeführt wird, wurde eigentlich in keinem Video das ich gesehen hatte gesagt. Ok nun weis ich es.

Ich habe ein weitere Problem für das ich leider keine Lösung finde.
Ich habe eine Funktion die mir das Datum Uhrzeit mit Sekunden ausgibt.
Leider wird mir die Rückgabe mit return verweigert.

Code: Alles auswählen

from datetime import datetime 

def formatiert_datum_uhrzeit():
    now = datetime.now()
    format_time_date = now.strftime("%d_%m_%Y_%H_%M_%S")
    
    return format_time_date
    

Code: Alles auswählen

x = (formatiert_datum_uhrzeit())
print(x())
 
Fehlermeldung:
print(x())
TypeError: 'str' object is not callable

Ich habe alles versucht um mit Print die Rückgabe auszugeben. Geht aber nicht.
Bei anderen Funktionen geht das ohne Probleme.

Hast du einen Tipp für mich ?
Bis dann...
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

Hallo,

ich habe die Lösung gefunden dank Google.

Code: Alles auswählen

print(str(x))
Jetzt wird mir das ausgegeben.

Code: Alles auswählen

14_02_2022_22_05_56
https://itsmycode.com/python-typeerror- ... -solution/

Bis dann...
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PeterL: Was Du da verlinkt hast ist keine Lösung zu Deinem Problem. Dort wird `str` an eine Zeichenkette gebunden. Das ist in Deinem Code nicht der Fall. *Du* musst einfach nur nicht versuchen eine Zeichenkette aufzurufen als wäre es eine Funktion. Dazu musst Du nicht einen weiteren Aufruf hinzufügen und den Aufruf der Zeichenkette weglassen, sondern einfach nur den Aufruf der Zeichenkette weglassen. Das `str()` hat da nix zu suchen.

Edit: Man muss auch nicht jedes noch so kleine Zwischenergebnis an einen Namen binden. Das macht in diesem Fall nichts verständlicher.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

PeterL hat geschrieben: Montag 14. Februar 2022, 19:44 Und ich Wuste nicht das return immer am ende ausgeführt wird.
Diese Formulierung ist komisch und vertauscht Ursache und Wirkung. return wird nicht am Ende ausgeführt, sondern return beendet die Funktion.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

/me hat geschrieben: Dienstag 15. Februar 2022, 11:53
PeterL hat geschrieben: Montag 14. Februar 2022, 19:44 Und ich Wuste nicht das return immer am ende ausgeführt wird.
Diese Formulierung ist komisch und vertauscht Ursache und Wirkung. return wird nicht am Ende ausgeführt, sondern return beendet die Funktion.
Hallo und guten Tag,

komisch finde ich nur, das man in einer Funktion nicht in Echtzeit wie es print macht etwas ausgeben kann, oder besser gesagt zurückzugeben. Man muss erst alles in einer Liste Speichern, und die dann mit return zurückgeben. Dann ist die For schleife aber schon beendet.

Bis dann...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie soll es denn gehen etwas zurueckzugeben, ohne die Funktion zu verlassen? Aber dann laeuft sie weiter? Das ist eine absurde Vorstellung davon, wie Funktionen ausgefuehrt werden.

Ein Generator kann sowas aenhliches, aber auch den muss man dann innerhalb einer for-schleife ausfuehren, damit man alles bekommt. Oder eine Liste machen.

Code: Alles auswählen

def aufzaehlen():
     for i in range(1000):
         yield i

for nummer in aufzaehlen():
     print(nummer)
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Man muss erst alles in einer Liste Speichern, und die dann mit return zurückgeben. Dann ist die For schleife aber schon beendet.
Du kannst aber innerhalb der for-Schleife eine andere Funktion aufrufen und dieser Funktion den zu betrachtenden Wert mitgeben.
Gruss Peter
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PeterL: Was ist daran komisch? Wie sollte das denn anders laufen wenn ``return`` die Funktion nicht beenden würde, wie sollte denn dann genau der Programmablauf sein? Was ist denn ”in Echtzeit”? Wenn das ``return`` wie `print()` *sofort* einen Effekt hat, der Programmfluss sofort zum Aufrufer zurückkehrt, denn sonst hätte das ja gerade *nicht* wie `print()` ”in Echtzeit” einen Effekt, aber irgendwie ja doch nicht, denn der Aufrufer kann ja noch gar nicht weiter machen wenn er das gesamte Ergebnis noch nicht hat — wie soll das funktionieren?

Wenn die Funktion nicht beendet werden soll wenn ein Teilergebnis fest steht, dann kann man eine Generatorfunktion schreiben. Das ist dann ``yield`` und nicht ``return``. Allerdings muss dann auch der Aufrufer anders mit dem Ergebnis — dem Generatorobjekt — umgehen, weil das Ergebnis dann ja nicht das Ergebnis *ist*, sondern die Teilergebnisse erst liefert wenn man ”danach fragt”, also beispielsweise darüber iteriert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

peterpy hat geschrieben: Dienstag 15. Februar 2022, 15:40
Man muss erst alles in einer Liste Speichern, und die dann mit return zurückgeben. Dann ist die For schleife aber schon beendet.
Du kannst aber innerhalb der for-Schleife eine andere Funktion aufrufen und dieser Funktion den zu betrachtenden Wert mitgeben.
Gruss Peter
Hallo,
aber wie soll der übergebene Wert zum Aufrufer zurückkommen ?
Die andere Funktion sendet doch sein das return zur aufrufenden Funktion ?

Bis dann.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Vorschlag vom anderen Peter war fuer sowas wie logging gedacht. Der aendert nicht ploetzlich die Semantik von Python. return funktioniert, wie return funktioniert. Deine Vorstellung da ist falsch gewesen.
Antworten