filter() fragen

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
Farol
User
Beiträge: 1
Registriert: Samstag 6. Juni 2020, 20:37

Hi, ich lerne gerade das built-in filter. wie ich verstanden habe, referenziert die filter nur an die ürsprungliche liste "letters". Sowei so gut,
aber ich habe eine Frage: warum kann ich eine filter object nur einmal seine Werten auslesen?

unten findet ihr eine klassische Beispiel eines Filters. aber sobal ich ausgeführt habe, meine For-Loop ist leer

Was passiert mit dem filter objekt?

<code>
letters = ['a', 'b', 'd', 'e', 'i', 'j', 'o']


def filterVowels(letter):
vowels = ['a', 'e', 'i', 'o', 'u']

if letter in vowels:
return True
else:
return False


filteredVowels = filter(filterVowels, letters)
list_filteredVowels = list(filteredVowels) # if I run this line, the for-loop is empty! If I run this line after the for-loop is the list empty!


print('The filtered vowels are:')
for vowel in filteredVowels:
print(vowel)
</code>
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Farol: Ist halt so. So sind Iteratoren in Python definiert. Man hat eine `next()`-Funktion, die man so oft aufrufen kann wie der Iterator ein nächstes Element hat und wenn er am Ende angekommen ist, dann gibt's jedes mal eine `StopIteration`-Ausnahme. Iterieren geht nur in eine Richtung und nur einmal.

``for`` schleifen machen am Anfang nicht irgendwie etwas besonderes was dem Iterator sagen würde das da jetzt eine neue ``for``-Schleife anfängt. Das kann ja auch nützlich sein, wenn man beispielsweise vor der Schleife ein oder mehrere Elemente des Iterators anders verarbeiten oder überspringen möchte. Das hat man öfter bei Dateien wo man am Anfang eine Kopfzeile anders verarbeiten oder ignorieren möchte.

Ausserdem gibt es viele Iteratoren die man gar nicht neu starten kann. Was sollte ``for`` dann machen? Es wäre inkonsistent wenn das bei einigen Iteratoren funktioniert wenn schon Elemente vor der Schleife abgefragt wurden, und bei anderen nicht.

Anmerkungen zum Code: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Also `filter_vowels()`, wobei der Name inhaltlich auch falsch ist. Die Funktion filtert nichts, die testet ob das übergebene Zeichen ein Vokal ist.

Grunddatentypen wie `list` haben nichts in Namen zu suchen.

Der Test ist zu umständlich. Falls ``letter in vowels`` den Wert `True` ergibt, gibst Du `True` zurück und falls der Test `False` ergibt, gibst Du `False` zurück. Also immer den gleichen Wert der bei dem Test selbst bereits heraus kommt. Da kann man auch gleich das Ergebnis des Tests zurückgeben, ohne ``if``/``else``:

Code: Alles auswählen

#!/usr/bin/env python3


def is_vowel(letter):
    return letter in ["a", "e", "i", "o", "u"]


def main():
    filtered_vowels = list(filter(is_vowel, "abdeijo"))
    print("The filtered vowels are:")
    for vowel in filtered_vowels:
        print(vowel)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten