it-swarm.com.de

Wie genau funktioniert ein Generatorverständnis?

Was leistet das Generatorverständnis? Wie funktioniert es? Ich konnte kein Tutorial dazu finden.

71
NONEenglisher

Verstehen Sie Listenverständnisse? Wenn ja, ist ein Generatorausdruck wie ein Listenverständnis, aber anstatt alle Elemente zu finden, die Sie interessieren und in die Liste zu packen, wartet er und gibt jedes Element einzeln aus dem Ausdruck.

python2-Version:

>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print filtered_list
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
... 
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print filtered_gen  # notice it's a generator object
<generator object at 0xb7d5e02c>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
... 
>>> filtered_gen.next()
5
>>> filtered_gen.next()
9
>>> filtered_gen.next()
6
>>> filtered_gen.next() # Should be all out of items and give an error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
... 
>>> # Let's prove it gives the same results as our list comprehension
... 
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print gen_to_list
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>> 

python3-Version:

next() in __next__() ändern

Da ein Generatorausdruck immer nur ein Element ergeben muss, kann dies zu erheblichen Einsparungen bei der Speichernutzung führen. Generatorausdrücke sind in Szenarien am sinnvollsten, in denen Sie jeweils ein Element nehmen, viele Berechnungen auf der Grundlage dieses Elements durchführen und dann zum nächsten Element übergehen müssen. Wenn Sie mehr als einen Wert benötigen, können Sie auch einen Generatorausdruck verwenden und mehrere Werte gleichzeitig erfassen. Wenn Sie alle Werte benötigen, bevor Ihr Programm ausgeführt wird, verwenden Sie stattdessen ein Listenverständnis.

116
gotgenes

Ein Generatorverständnis ist die faule Version eines Listenverständnisses.

Es ist wie ein Listenverständnis, nur dass es statt der Liste einen Iterator zurückgibt, dh ein Objekt mit der next () - Methode, die das nächste Element liefert.

Wenn Sie mit Listenverständnissen nicht vertraut sind, siehe hier und für Generatoren siehe hier .

16
rz.

Listen-/Generator-Verständnis ist ein Konstrukt, mit dem Sie aus einer vorhandenen Liste eine neue Liste/Generator erstellen können.

Angenommen, Sie möchten die Liste der Quadrate jeder Zahl von 1 bis 10 generieren. Sie können dies in Python tun:

>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

hier generiert range(1,11) die Liste [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], aber die Funktion range ist vor Python 3.0 kein Generator. Daher ist das Konstrukt, das ich verwendet habe, ein Listenverständnis.

Wenn ich einen Generator erstellen wollte, der dasselbe tut, könnte ich es so machen:

>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>

In Python 3 ist range jedoch ein Generator. Daher hängt das Ergebnis nur von der verwendeten Syntax ab (eckige Klammern oder runde Klammern).

4
Can Berk Güder

Generatorenverständnis ist eine einfache Möglichkeit, Generatoren mit einer bestimmten Struktur zu erstellen. Nehmen wir an, Sie möchten ein generator, das nacheinander alle geraden Zahlen in your_list ausgibt. Wenn Sie es mit dem Funktionsstil erstellen, würde es so aussehen:

def allEvens( L ):
    for number in L:
        if number % 2 is 0:
            yield number

evens = allEvens( yourList )

Sie können mit diesem Generator-Verständnisausdruck dasselbe Ergebnis erzielen:

evens = ( number for number in your_list if number % 2 == 0 )

In beiden Fällen erhalten Sie beim Aufruf von next(evens) die nächste gerade Nummer in your_list

2
Cristian Garcia

Ein weiteres Beispiel für das Verständnis des Generators:

print 'Generator comprehensions'

def sq_num(n):
    for num in (x**2 for x in range(n)):    
        yield num

for x in sq_num(10):
    print x 
0
AMIT KUMAR

Generatorverständnis ist ein Ansatz, um iterierbare Elemente zu erstellen, ähnlich wie ein Cursor, der sich auf einer Ressource bewegt. Wenn Sie den Mysql-Cursor oder den Mongodb-Cursor kennen, ist Ihnen möglicherweise bewusst, dass die gesamten tatsächlichen Daten niemals gleichzeitig, sondern nur einmal in den Speicher geladen werden. Der Cursor bewegt sich vor und zurück, aber es ist immer ein Element mit einer Zeile/Liste im Speicher. 

Kurz gesagt, durch das Verständnis der Generatoren können Sie leicht Cursor in Python erstellen.

0
Muatik