Variable vor for-Schleife?

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
Severus
User
Beiträge: 13
Registriert: Freitag 5. Januar 2018, 16:49

Hallo zusammen,

ich habe eine ziemliche Anfängerfrage, zu der ich aber keine Antwort ergoogeln kann (wahrscheinlich weil ich nicht weiß wie das Konstrukt heißt).

Was bedeuten der for-Schleife vorangestellte Elemente?

Beispielhaft wären da z.B.

Code: Alles auswählen

def delta_dach_nea(delta, q, w):
    R = {q}               
    for a in w:           
        R = {q for p in R          
               for q in delta[p,a]} 
    print(R)       
    return R
oder auch

Code: Alles auswählen

def powerset(S):
    P = {frozenset()}
    for e in S:
        P|= {R|{e} for R in P} 
    return P

Was bedeuten die Variablen q in Beispiel 1 bzw. die Menge {e} in Beispiel 2?

Was passiert also bei "a for i in ... "?

for-Schleifen ohne diesen Zusatz kenne ich, aber was bedeuten solch vorangestellte Elemente?

Dankeschön :wink:
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Severus hat geschrieben: for-Schleifen ohne diesen Zusatz kenne ich, aber was bedeuten solch vorangestellte Elemente?
Das ist vielleicht am einfachsten an einem Beispiel zu zeigen:

Code: Alles auswählen

In [1]: l = [i**3 for i in range(10)]

In [2]: l
Out[2]: [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]

In [3]: type(l)
Out[3]: list

In [4]: l = [i**3 for i in range(10) if i % 2]

In [5]: l
Out[5]: [1, 27, 125, 343, 729]

In [6]: l = [(i, j) for i in range(4) for j in 'abcd']

In [7]: l
Out[7]: 
[(0, 'a'),
 (0, 'b'),
 (0, 'c'),
 (0, 'd'),
 (1, 'a'),
 (1, 'b'),
 (1, 'c'),
 (1, 'd'),
 (2, 'a'),
 (2, 'b'),
 (2, 'c'),
 (2, 'd'),
 (3, 'a'),
 (3, 'b'),
 (3, 'c'),
 (3, 'd')]

In [8]: s = {i**3 for i in range(10) if i % 2}

In [9]: s
Out[9]: {1, 27, 125, 343, 729}

In [10]: type(s)
Out[10]: set

In [11]: d = {i: i**3 for i in range(10) if i % 2}

In [12]: d
Out[12]: {1: 1, 3: 27, 5: 125, 7: 343, 9: 729}

In [13]: type(d)
Out[13]: dict

In [14]: g = (i**3 for i in range(10) if i % 2)

In [15]: g
Out[15]: <generator object <genexpr> at 0x7f5b21c94f68>

In [16]: type(g)
Out[16]: generator

In [17]: for element in g:
    ...:     print(element)
    ...:     
1
27
125
343
729

Die ersten paar Beispiele zeigen Comprehensions (List-, Set- und Dictionarycomprehensions), das letzte ist ein Generatorausdruck. Comprehensions sind eine verkürzte Schreibweise, um Containerdatentypen zu befüllen, was auf dem "klassischen Weg" mehrere Zeilen-Code wären.
Generatorausdrücke sind eine Kurzschreibweise für einfache Generatoren, die man sonst ja als Funktion mit einem 'yield'-Statement definieren würde.
Severus
User
Beiträge: 13
Registriert: Freitag 5. Januar 2018, 16:49

Super, danke dir.

Kannst du mir noch sagen nach welchem Begriff ich suchen muss wenn ich mehr darüber lesen möchte?
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

Um nezzcarth zu ergänzen: Die Syntax und Semantik von List- und anderen Comprehensions in Python ist angelegt an die Set-Builder-Notation, mit der in der Mathematik Mengen definiert werden. Beispielsweise lässt sich die Menge der ersten zehn Kubikzahlen schreiben als { i^3 | i ∈ ℕ_0, i < 10 }. Der einzige Unterschied (wenn man von der unterschiedlichen Syntax absieht), ist dass es in der Mathematik keinen allgemein bekannten kurzen Ausdruck für die ersten n natürlichen Zahlen (`range`) gibt.

Die passenden Suchbegriffe sind List-Comprehension (bzw. Set- oder Dict-Comprehension) und Generatorausdruck...
Severus
User
Beiträge: 13
Registriert: Freitag 5. Januar 2018, 16:49

Vielen Dank :D
Antworten