Listen sind geordnete Sammlungen von beliebigen Objekten.
```{code-block}
...
...
@@ -68,8 +68,8 @@ Negative Indizes zählen von rechts:
a[-1]
```
(slicing)=
### Teil-Listen (Slices)
<aid="slicing"></a>
```{code-block}
liste[start:stop]
```
...
...
@@ -277,8 +277,9 @@ a
`b` ist ein neuer Name für **dasselbe Objekt**, das `a` referenziert. Wird dieses z.B. über `b.append` verändert, so ändert sich auch `a`.
(tupel)=
## Tupel
<aid="tupel"></a>
```{code-block}
(a, b, c, ...)
```
...
...
@@ -307,8 +308,8 @@ a = (10)
a
```
(multiple_assignment)=
### Multiple Assignment
<aid="multiple_assignment"></a>
*Hinweis*: Das hat Ähnlichkeit mit dem pattern matching aus der Linux-Vorlesung.
Tupel werden vor allem für *Struktur* benutzt. Über Multiple Assignment können die einzelnen Elemente eines Tupels oder einer Liste direkt mehreren Variablen zugewiesen werden.
...
...
@@ -323,8 +324,9 @@ first
Das ist insbesondere interessant für Funktionen, die so mehr als einen Rückgabewert haben können.
Die meisten nicht-trivialen Programme haben Code-Teile, die mehrfach genutzt werden sollen. Es bietet sich an, diese in selbst-definierte Funktionen auszulagern. Außerdem erhöhen Funktionen mit klar definiertem Verhalten, Argumenten und Rückgabewerten die Verständlichkeit des Programms.
Funktionen werden mit dem zusammengesetzten Befehl `def` definiert:
Zusätzlich zu den in Python existierenden Iteratoren kann man auch auf flexible Weise eigene erzeugen. Die einfachste Möglichkeit dazu sind **Generatoren**.
(generatoren)=
## Generatoren
<aid="generatoren"></a>
Generatoren sind Funktionen, die den **`yield`**-Befehl verwenden.
Module sind Sammlungen von Funktionen, Klassen und Konstanten und sind der Hauptmechanismus, über den in Python zusätzliche Funktionalität bereitgestellt wird.
`real`, `imag` und `conjugate` nennt man **Attribute** von `z`. Attribute eines Objekts sind alles, was sich über `<objekt>.<attribut-name>` referenzieren lässt. Allgemein werden Attribute immer zuerst in der Instanz gesucht, danach in der Klasse.