@Tuedelue: Das `thread`-Modul ist veraltet und sollte nicht mehr verwendet werden, deshalb hatte ich das `threading`-Modul genannt.
Veränderbare Datenstrukturen auf Modulebene sind keine gute Idee. Das wird sehr unübersichtlich und die Funktionen die so etwas verwenden sind keine in sich geschlossenen Einheiten mehr sondern tauschen auf undurchsichtige Weise Daten aus. Alles was in Funktionen oder Methoden verwendet wird und keine Konstante ist, sollte als Argument übergeben werden. Und auf Modulebene sollten nur Konstanten, Funktionen, und Klassen definiert werden.
Der Name `Ergebnisse` deutet von seiner Schreibweise auf einen Datentyp hin, es ist aber kein Typ sondern ein Exemplar. Siehe
Style Guide for Python Code.
Die `input()`-Funktion ist irgendwas zwischen schwer beherrschbar bis gefährlich und sollte nicht benutzt werden. Der Benutzer kann dort beliebige Python-Ausdrücke eingeben, die dann ausgewertet werden. Dabei können alle Möglichen Ausnahmen auftreten. Und der Benutzer kann natürlich auch absichtlich Code eingeben der Schaden anrichtet, oder Einfluss auf den Programmablauf nimmt, der so nicht vorgesehen war.
Nach einem ``return`` wird kein Code mehr ausgeführt, denn die Ausführung der Funktion wird durch die ``return``-Anweisung ja beendet. Es ist auch nicht wirklich sinnvoll das Funktionsobjekt auszugeben. Und die Definition von `negativ()` entspricht nicht den üblichen Erwartungen — die meisten Leute werden die 0 als positiv sehen.
Die ersten beiden Zeilen in der `filterung()`-Funktion haben keinen Effekt ausser Rechenzeit zu verbrauchen.
Da die `filterung()` parallel zur Eingabe von neuen Werten und der ``while``-Schleife weiter unten läuft, haben wir hier ausserdem eine „race condition”: Jederzeit können neue Werte hinzukommen oder der Inhalt der Liste gelöscht werden. Du filterst die Liste vier mal und jedes mal kann der Listeninhalt anders aussehen, trotzdem vergleichst Du die Ergebnisse, die sich potentiell auf andere Werte beziehen.
Wenn die beiden Tests exakt das Gegenteil prüfen, also zusammen den gesamten Wertebereich der Elemente in `Ergebnisse` abdecken, braucht man auch gar nicht zweimal filtern. Der jeweils andere Wert lässt sich ja aus der Anzahl der Elemente und der Länge der gefilterten Werte berechnen. Wenn man 10 Elemente hat, und 8 davon positiv sind, dann weiss man das zwei negativ sein müssen, auch ohne die tatsächlich zu filtern und zu zählen.
`filterung()` ist auch ein schlechter Name für eine Funktion im allgemeinen und diese Funktion im besonderen. Funktionen tun etwas, darum eignen sich Tätigkeiten besser als Beschreibung. Und diese Funktion filtert nicht. Nicht als eigentliche Hauptaufgabe. Sie wertet die Ergebnisse aus.
Der Ausdruck ``0 == 0`` ergibt `True`:
Das Ergebnis kann man also auch gleich direkt als Bedingung der ``while``-Schleife verwenden.
Die ``while``-Schleife halte ich aber insgesamt für einen Fehler. Es sollen ja eigentlich zwei Sachen parallel gemacht werden: Die Werte erfassen, und sie auswerten. Die ``while``-Schleife läuft *zusätzlich*. Die startet alle drei Sekunden einen neuen Thread der 5 Eingaben entgegennimmt, auch wenn ein oder mehrerer solcher Threads schon laufen! Und die konkurrieren dann um die Standardeingabe.
Und sie startet die `filterung()`-Funktion in einem Thread und wartet dann eine Sekunde. Warum rufst Du da die Funktion nicht einfach normal auf? Der asynchrone Start macht absolut keinen Sinn.
Ausserdem kann es passieren dass die `Ergebnisse` nicht geleert werden und die Liste immer weiter anwachsen kann. Man braucht nur warten bis mindestens zwei Threads auf Benutzereingaben warten und kann dann innerhalb der drei Sekunden bis der Test auf Länge gleich 5 gemacht wird *mehr als 5 Werte eingeben*!