Seite 1 von 1

Funktion abbrechen

Verfasst: Donnerstag 10. April 2014, 16:54
von Tobs
Ich habe gehört, dass eine Funktion ihre Arbeit abbricht/sofort beendet, wenn sie einen Wert zurückgibt.
Bei einer Funktion die ich geschrieben habe, sollte das eigentlich auch der Fall sein, aber die Funktion gibt in
100% aller Fälle True zurück, obwohl ich ihr Beispiele gebe dir nur Falsch sein können.
(Die Funktion soll überprüfen ob in jeder der Listen in der Liste "liste" immer die gleichen strings enthalten sind)

Code: Alles auswählen

def MeineFunktion(liste):

    for ding in liste:
        for d in ding:
            if d != ding[0]:
                return False
    return True
Danke für eure Hilfe im vorraus! :-)

Re: Funktion abbrechen

Verfasst: Donnerstag 10. April 2014, 17:25
von BlackJack
Beispiel bei dem `False` heraus kommt:

Code: Alles auswählen

In [14]: MeineFunktion(['ab', 'cd'])
Out[14]: False
Was übergibst Du denn wo Du `False` erwartest, aber `True` bekommst?

Re: Funktion abbrechen

Verfasst: Donnerstag 10. April 2014, 18:58
von Tobs
Danke für die Antwort.

Ich übergebe meiner Funktion eine Liste, die nochmal Listen enthält, die je vier Strings enthalten.
Insgesamt gibt es 6 verschiedene Strings, von jeder Sorte 4. In jeder der 6 Unterlisten sind 4 Strings.
Wenn alle 4 Strings in allen unterlisten gleich sind, soll er True zurückgeben, ansonsten False.

Im Prinzip sind die Unterlisten Schubladen und die Strings Legosteine, und die Funktion soll mir True
zurückgeben, wenn alle Legosteine nach Farbe(Stringinhalt) aufgeteilt, in getrennten Schubladen liegen, dabei ist es egal welche Schublade welche Farbe enthält.

Was die Funktion bekommt ist im Prinzip das Regal mit den Schubladen, oder halt die Hauptliste, die die Unterlisten enthält

Vom Code her ist alles(oder eben nicht) richtig, nun wollte ich die Funktion auf ihre Effiziens testen und habe die Zeit gestoppt, um die Funktion 1 Mio.-mal an zufälligen Schubladen zu testen.
Dabei habe ich einen Counter, der bei jedem Durchgang +1 addiert, damit mir das Programm am Ende sagen kann wie viel Prozent der Schubladen richtig sortiert waren.
Seltsamerweise kommt da immer 100% heraus :-( , so als ob er die Funktion nicht nach return False abbrechen würde...

Das mit dem Funktion abbrechen ist deshalb so wichtig, da die Funktion möglichst schnell ablaufen muss, da ich verdammt viele Regale habe

Vielleicht spielt es eine Rolle, dass die Funktion aus einem anderen Modul importiert wurde. Wenn man sie in diesem Modul an Einzelfällen ausführt funktioniert es.

EDIT:

Sagt mir bitte wie man dieses Thema löschen kann. *facepalm* Es war ein totel einfacher Fehler im Hauptprogramm. sry... :-/
Die Schubladen waren nicht zufällig, sondern alle gelöst. (Ich hab einen Fehler bei der if-Anweisung der zufälligen Steine-Vertausch-Funktion gemacht)

Trotzdem danke für eure Antworten :-)

Re: Funktion abbrechen

Verfasst: Freitag 11. April 2014, 16:39
von Sirius3
noch eine kompaktere Lösung des Problems:

Code: Alles auswählen

def all_elements_equal(liste):
    return all(len(set(dinge)) <= 1 for dinge in liste)

Re: Funktion abbrechen

Verfasst: Samstag 12. April 2014, 11:55
von Tobs
Sieht professionell aus, aber leider sind mir noch nicht alle Schlüsselworte, die du verwendest bekannt,
da muss ich mich mal erkundigen :-/

Kannst du mir mal kurz den Sinn der einzelnen Schlüsselwörter (außer len() und for:) erklären?

z.B. was bewirkt all() und seit wann kann man vor der for-Schleife etwas einfügen, hat das mit all() zu tun?

Re: Funktion abbrechen

Verfasst: Samstag 12. April 2014, 13:09
von kbr
Tobs hat geschrieben:was bewirkt all()
Zu Python gibt es eine tolle Dokumentation - da lässt sich sowas prima nachlesen (und anschließend ausprobieren):
https://docs.python.org/2/library/functions.html

Re: Funktion abbrechen

Verfasst: Samstag 12. April 2014, 14:16
von BlackJack
Die Dokumentation zu den Funktionen findet man anhand der Funktionsnamen sehr leicht, aber für die ``for``-Syntax an der Stelle braucht man vielleicht noch den Hinweis, das es sich um einen Generatorausdruck handelt: https://docs.python.org/2.7/glossary.ht ... expression

Im Grunde ist das eine „list comprehension” mit runden statt eckigen Klammern und die Elemente werden „lazy” erzeugt, also nicht alle auf einmal, sondern bei bedarf.

Re: Funktion abbrechen

Verfasst: Samstag 12. April 2014, 15:14
von cofi
BlackJack hat geschrieben:Im Grunde ist das eine „list comprehension” mit runden statt eckigen Klammern und die Elemente werden „lazy” erzeugt, also nicht alle auf einmal, sondern bei bedarf.
Und in dem Fall noch ohne Klammern, weil es das einzige Argument fuer eine Funktion ist.
So, jetzt sollten wir aber alle Infos zusammenhaben :)