Seite 1 von 1

Variable vor for-Schleife?

Verfasst: Samstag 6. Januar 2018, 12:57
von Severus
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:

Re: Variable vor for-Schleife?

Verfasst: Samstag 6. Januar 2018, 13:10
von nezzcarth
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.

Re: Variable vor for-Schleife?

Verfasst: Samstag 6. Januar 2018, 13:35
von Severus
Super, danke dir.

Kannst du mir noch sagen nach welchem Begriff ich suchen muss wenn ich mehr darüber lesen möchte?

Re: Variable vor for-Schleife?

Verfasst: Samstag 6. Januar 2018, 13:42
von narpfel
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...

Re: Variable vor for-Schleife?

Verfasst: Samstag 6. Januar 2018, 14:37
von Severus
Vielen Dank :D