Generatorausdrücke in Python
Ein Generatorausdruck beschreibt ein Iterables mit Hilfe einer Bildungsvorschrift (Bildungsregel, comprehension, Komprehension, ).
- Syntax von Gneratorausdrücken
generator_expression ::= "(" expression comp_for ")"
comprehension ::= expression comp_for
comp_for ::= ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter ::= comp_for | comp_if
comp_if ::= "if" expression_nocond [comp_iter]
Die ungewohnte Syntax kann man sich zunächst vereinfacht so merken:
Eine Bildungsvorschrift besteht aus einem Ausdruck, einer for-Spezifikation und einer optionalen if-Spezifikation.
Die gebildeten Werte bestehen aus den Werten des Ausdrucks für alle von der for-Spezifikation erzeugten Werte der for-Variablen, welche die if-Spezifikation erfüllen.
- Konsolenprotokoll
k = \
( f'"{chr(i)}"'
for i in range( 65, 65+26 )
if chr( i )not in "AEIOU" )print( ", ".join( k ))
"B", "C", "D", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"
print( ", ".join( k ))
Jeder Generator ist ein Iterator, kein Iterables.
Da Generatoren verbraucht werden können, wird davon abgeraten, sie in Variablen zu halten, und empfohlen Ausdrücke, welche bei jeder Auswertung einen neuen Generator erzeugen, zu verwenden.
- Konsolenprotokoll
g =( i**2 for i in range( 9 ) if i % 2 )
print( next( g ))
1
print( next( g ))
9
print( next( g ))
25
print( next( g ))
49
print( next( g ))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
type( g )
<class 'generator'>
- Beispiel
k =( i for i in range( 3, 5 ) )
sum( k )
7
- Beispiel
from operator import add
k =( i for i in range( 3, 5 ))
add( *k )
7
- Beispiel
min( i for i in range( 3 ))
0
- Beispiel
max( i for i in range( 3 ))
2
- Beispiel
sum( i for i in range( 3, 5 ))
7
- Beispiel
print( *( x**2 for x in range( 1, 5 )))
1 4 9 16
- Beispiel
[ d for d in dir( [] ) if '__' not in d ]
['append', 'clear', 'copy', …]
- Beispiel
bytes( c for c in range( 65, 69 ))
b'ABCD'
- Beispiel
import random
import string
print( ''.join( random.choice( string.ascii_letters )for i in range( 8 )))
enAfqETk
print( ''.join( random.choice( string.ascii_letters )* 8 ))
TTTTTTTT