Skip to content
Snippets Groups Projects
Commit ac9322e3 authored by Christof Kaufmann's avatar Christof Kaufmann
Browse files

Notebooks from ckaufmann/akis-python-framework@68ce5cc5

parent 9093b5dd
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id:0002-b450325f90fad5a8e24c374cc1fe9c7a909e809a750ad15a9c514b51f97 tags: %% Cell type:markdown id:0002-b450325f90fad5a8e24c374cc1fe9c7a909e809a750ad15a9c514b51f97 tags:
# Spezielle Werte: 0, -inf, inf und NaN # Spezielle Werte: 0, -inf, inf und NaN
Wir betrachten die speziellen Gleitkommawerte 0, -inf, inf und NaN im Wir betrachten die speziellen Gleitkommawerte 0, -inf, inf und NaN im
Kontext von Vergleichen. Kontext von Vergleichen.
Probieren folgenden Code aus: Probieren folgenden Code aus:
%% Cell type:code id:0003-3f4b66c977275c535935c7da45f249a443fcff3498de887e9a3b5d1d11f tags: %% Cell type:code id:0003-3f4b66c977275c535935c7da45f249a443fcff3498de887e9a3b5d1d11f tags:
``` ```
print('0 < inf:', 0 < float('inf')) print('0 < inf:', 0 < float('inf'))
print('0 > inf:', 0 > float('inf')) print('0 > inf:', 0 > float('inf'))
print('0 < -inf:', 0 < float('-inf')) print('0 < -inf:', 0 < float('-inf'))
print('0 > -inf:', 0 > float('-inf')) print('0 > -inf:', 0 > float('-inf'))
print('0 < nan:', 0 < float('nan')) print('0 < nan:', 0 < float('nan'))
print('0 > nan:', 0 > float('nan')) print('0 > nan:', 0 > float('nan'))
print('-inf < inf:', float('-inf') < float('inf')) print('-inf < inf:', float('-inf') < float('inf'))
print('-inf < nan:', float('-inf') < float('nan')) print('-inf < nan:', float('-inf') < float('nan'))
print('nan < inf:', float('nan') < float('inf')) print('nan < inf:', float('nan') < float('inf'))
print('nan == nan:', float('nan') == float('nan')) print('nan == nan:', float('nan') == float('nan'))
print('nan != nan:', float('nan') != float('nan')) print('nan != nan:', float('nan') != float('nan'))
print('inf == inf:', float('inf') == float('inf')) print('inf == inf:', float('inf') == float('inf'))
print('inf != inf:', float('inf') != float('inf')) print('inf != inf:', float('inf') != float('inf'))
``` ```
%% Cell type:markdown id:0004-4e1ca2028bc50050516deee0503e7f4754f48782eea54d17514922179e3 tags: %% Cell type:markdown id:0005-4fc4d57c56da6d05988caaae80e1b51863a7bad32f28fc81ac89cc64244 tags:
Was fällt Ihnen auf? Was fällt Ihnen auf?
Hier Ihr Code:
%% Cell type:code id:0006-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
......
%% Cell type:markdown id:0002-c38ee4af657115816b304553a6a8b120d9739b38eb3d6d95fd0fe105921 tags: %% Cell type:markdown id:0002-c38ee4af657115816b304553a6a8b120d9739b38eb3d6d95fd0fe105921 tags:
# Interleaving # Interleaving
Füge folgende zwei Strings aneinander und gib den so entstandenen String Füge folgende zwei Strings aneinander und gib den so entstandenen String
aus: aus:
- die Buchstaben aller geraden Indizes in `s` - die Buchstaben aller geraden Indizes in `s`
- die Buchstaben aller ungeraden Indizes in `s` - die Buchstaben aller ungeraden Indizes in `s`
%% Cell type:code id:0003-a69e374ca51e3002822e335a2b3e3e97c94f3c0787b380003afe0b6ae01 tags: %% Cell type:code id:0003-a69e374ca51e3002822e335a2b3e3e97c94f3c0787b380003afe0b6ae01 tags:
``` ```
s = 'Dti emsaens IPnrtienrzliepa vnienngn.' s = 'Dti emsaens IPnrtienrzliepa vnienngn.'
``` ```
%% Cell type:markdown id:0004-4f90926ab6960e65168fdff6f5e151194200dd69b468fb4eeb302fa84f1 tags:
Hier Ihr Code:
%% Cell type:code id:0005-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
......
%% Cell type:markdown id:0004-35f585a4d04e87c1d3a59630471e2e18f4fd4362affbcf031152ef21d96 tags: %% Cell type:markdown id:0004-e8891ae8cb37d6df5d0fd42e8226bbfac8b23f966b4353c8aed4b3d748c tags:
# Noch lesbar? # Noch lesbar?
Es gbit deise Txete, in dneen bei jeedm Wrot alle Buaectbshn, außer dem Es gbit deise Txete, in dneen bei jeedm Wrot alle Buaectbshn, außer dem
esertn und lzeettn, ddranuchenier gahcsteut wuredn. Schreiben Sie eine esertn und lzeettn, ddranuchenier gahcsteut wuredn. Schreiben Sie eine
print-Funktion `my_weird_print`, die genau das macht. print-Funktion `my_weird_print`, die genau das macht.
Um es einfacher zu machen, teilen Sie die Aufgabe in mehrere Schritte Um es einfacher zu machen, teilen Sie die Aufgabe in mehrere Schritte
auf: auf:
1. `scramble` – eine Funktion, die ein Wort `word` bekommt und darin 1. `scramble` – eine Funktion, die ein Wort `word` bekommt und darin
den mittleren Teil durcheinander bringt. Sie können dazu die Zeichen den mittleren Teil durcheinander bringt. Sie können dazu die Zeichen
mit `list` umwandeln und mit `list` umwandeln und
[`random.shuffle`](https://docs.python.org/3/library/random.html#random.shuffle) [`random.shuffle`](https://docs.python.org/3/library/random.html#random.shuffle)
anwenden oder direkt anwenden oder direkt
[`random.sample`](https://docs.python.org/3/library/random.html#random.sample) [`random.sample`](https://docs.python.org/3/library/random.html#random.sample)
benutzen. In beiden Fällen bekommen Sie eine Liste von Zeichen, die benutzen. In beiden Fällen bekommen Sie eine Liste von Zeichen, die
Sie mit der `join`-Methode wieder zu einem String zusammenführen Sie mit der `join`-Methode wieder zu einem String zusammenführen
müssen. müssen.
2. `scramble_words` – vorgegeben. Die Funktion erhält ein Argument 2. `scramble_words` – vorgegeben. Die Funktion erhält ein Argument
`arg` (üblicherweise Text) und ruft für jedes Wort `scramble` auf `arg` (üblicherweise Text) und ruft für jedes Wort `scramble` auf
und ersetzt das Wort durch den Rückgabewert von `scramble`. und ersetzt das Wort durch den Rückgabewert von `scramble`.
3. `my_weird_print` – ein Wrapper für die `print`-Funktion. 3. `my_weird_print` – ein Wrapper für die `print`-Funktion.
`my_weird_print` bekommt beliebige unbenannte und benannte `my_weird_print` bekommt beliebige unbenannte und benannte
Argumente, normalerweise `*args` und `*kwargs` genannt. `args` ist Argumente, normalerweise `*args` und `**kwargs` genannt. `args` ist
dabei das Tupel mit den Textelementen. Beispiel: Für dabei das Tupel mit den Textelementen. Beispiel: Für
``` python ``` python
my_weird_print('Dies ist ein kleiner Testtext', 'aus', 'drei Elementen') my_weird_print('Dies ist ein kleiner Testtext', 'aus', 'drei Elementen')
``` ```
wäre `args` einfach das Tupel wäre `args` einfach das Tupel
`('Dies ist ein kleiner Testtext', 'aus', 'drei Elementen')`. Nun `('Dies ist ein kleiner Testtext', 'aus', 'drei Elementen')` und
müssen die Wörter in jedem Element in `args` durcheinander gebracht `kwargs` ein leeres Dictionary. Nun müssen die Wörter in jedem
werden. Dazu wird jeweils die Funktion `scramble_words` aufgerufen Element in `args` durcheinander gebracht werden. Dazu wird jeweils
und so eine neue Sequenz (z. B. eine Liste) aus den Rückgabewerten die Funktion `scramble_words` aufgerufen und so eine neue Sequenz
erstellt. Diese kann zusammen mit `kwargs` per Unpacking an `print` (z. B. eine Liste) aus den Rückgabewerten erstellt. Diese kann
übergeben werden. Im einfachsten Fall besteht `my_weird_print` aus zusammen mit `kwargs` per Unpacking an `print` übergeben werden. Im
ein bis zwei Zeilen. einfachsten Fall besteht `my_weird_print` aus ein bis zwei Zeilen.
Für die zufällige Vertauschung und das Finden von Wörtern mit Regular Für die zufällige Vertauschung und das Finden von Wörtern mit Regular
Expressions importieren wir die entsprechenden Module: Expressions importieren wir die entsprechenden Module:
%% Cell type:code id:0005-dc89f46b61c4afda3382f8e6d241460a22e0b4db47f4ec1d895aa7d040a tags: %% Cell type:code id:0005-dc89f46b61c4afda3382f8e6d241460a22e0b4db47f4ec1d895aa7d040a tags:
``` ```
import random import random
import re import re
``` ```
%% Cell type:markdown id:0007-9ab61dd7e992adbe321b26f5014486902c3d615e663f601aa9ea95bb54f tags: %% Cell type:markdown id:0007-828e501e8790978ea86a934140fbd628183c51e958519e381b48998dc71 tags:
Als Erstes versuchen Sie die Funktion `scramble` zu schreiben. Als Erstes versuchen Sie die Funktion `scramble` zu schreiben.
Experimentieren Sie mit Slicing des mittleren Wortteils, der zufälligen Experimentieren Sie mit Slicing des mittleren Wortteils, der zufälligen
Vertauschung und `join`. Geben Sie zum Schluss den ersten Buchstaben, Vertauschung und `join`. Geben Sie zum Schluss den ersten Buchstaben,
den durcheinander gebrachten mittleren Wortteil und den letzten den durcheinander gebrachten mittleren Wortteil und den letzten
Buchstaben zurück. Buchstaben zurück.
Beispiel:
%% Cell type:code id:0008-bb8ac4aac7454e9f9aac068c6cec71c6f319f0c0616d5ffcfd82403f2b3 tags:
```
scramble('Eieiei')
```
%% Output
Eeeiii
%% Cell type:markdown id:0009-5e9b0f8ca916fa2691d4f1eb9500cea469245a5723255fa18cc72ed2b6c tags:
Zweitens ist hier die vorgegebene Funktion `scramble_words`: Zweitens ist hier die vorgegebene Funktion `scramble_words`:
%% Cell type:code id:0008-cfc1de764814416f8af953c1c7fbe780fa078cdc82609e1cb96b5216603 tags: %% Cell type:code id:0010-cfc1de764814416f8af953c1c7fbe780fa078cdc82609e1cb96b5216603 tags:
``` ```
def scramble_words(arg): def scramble_words(arg):
return re.sub(r'[a-zA-Z]+', lambda m: scramble(m.group()), str(arg)) return re.sub(r'[a-zA-Z]+', lambda m: scramble(m.group()), str(arg))
``` ```
%% Cell type:markdown id:0009-79fc7f82cfffe278625eafa817af9d2482c1b65f8605ca80fcb31e0d81b tags: %% Cell type:markdown id:0011-79fc7f82cfffe278625eafa817af9d2482c1b65f8605ca80fcb31e0d81b tags:
Sie sucht mit Hilfe von [Regular Sie sucht mit Hilfe von [Regular
Expressions](https://docs.python.org/3/howto/regex.html#regex-howto) Expressions](https://docs.python.org/3/howto/regex.html#regex-howto)
nach zusammenhängenden Zeichen. Wenn Sie die Funktion `sub` besser nach zusammenhängenden Zeichen. Wenn Sie die Funktion `sub` besser
verstehen wollen, spielen Sie gerne mit folgendem Code: verstehen wollen, spielen Sie gerne mit folgendem Code:
%% Cell type:code id:0010-9cde5b9f8f00a8a9045e5d68cd5b63f70d98095a4ffc5c8a273cda406f5 tags: %% Cell type:code id:0012-9cde5b9f8f00a8a9045e5d68cd5b63f70d98095a4ffc5c8a273cda406f5 tags:
``` ```
re.sub(r'[a-zA-Z]+', 'bla', 'Ach, ist das Wetter nicht herrlich?') re.sub(r'[a-zA-Z]+', 'bla', 'Ach, ist das Wetter nicht herrlich?')
``` ```
%% Output %% Output
'bla, bla bla bla bla bla?' 'bla, bla bla bla bla bla?'
%% Cell type:markdown id:0014-12b269bbe9860c9597e193cb5e6b0941dea717fb3ae32f352b58b42e878 tags: %% Cell type:markdown id:0015-fb8670fe1870c45ea4c0882df4792b97b275e200c493fbf38abc908fda9 tags:
Und anstatt fest `'bla'` einzusetzen, wird das eingesetzt, was Und anstatt fest `'bla'` einzusetzen, wird das eingesetzt, was
`scramble` für den gefundenen String `m.group()` zurück gibt. `scramble` für den gefundenen String `m.group()` zurück gibt.
Als Letztes fehlt noch `my_weird_print`. Viel Erfolg! Als Letztes fehlt noch `my_weird_print`. Viel Erfolg!
Beispiel:
%% Cell type:code id:0016-207bd23693a027210a7202be4278f822a64faf4ed60d3630defbf948740 tags:
```
my_weird_print('Wusstest du, dass 2^10 =', 2**10, 'ist?')
```
%% Output
Wstessut du, dsas 2^10 = 1024 ist?
%% Cell type:markdown id:0018-10a8217c9d1fcb2760ab573d6339eb01b8dacc6a62a5f811e899761b0b7 tags:
## Lösung ## Lösung
Zunächst betrachten wir `scramble`. Für Spezialfälle testen wir zunächst Zunächst betrachten wir `scramble`. Für Spezialfälle testen wir zunächst
die Länge von `word` und, ob der mittlere Teil nur aus gleichen die Länge von `word` und, ob der mittlere Teil nur aus gleichen
Buchstaben besteht wie in `'alle'`. Falls nicht, extrahieren wir den Buchstaben besteht wie in `'alle'`. Falls nicht, extrahieren wir den
mittleren Teil als Liste aus Buchstaben und vertauschen die Elemente der mittleren Teil als Liste aus Buchstaben und vertauschen die Elemente der
liste mittels `random.shuffle`. Dann setzen wir die Buchstaben mit Hilfe liste mittels `random.shuffle`. Dann setzen wir die Buchstaben mit Hilfe
von `join` wieder zu einem String zusammen. Mit der optionalen von `join` wieder zu einem String zusammen. Mit der optionalen
`while`-Schleife stellen wir sicher, dass nicht zufällig die `while`-Schleife stellen wir sicher, dass nicht zufällig die
ursprüngliche Reihenfolge heraus kommt. Schließlich geben setzen wir ursprüngliche Reihenfolge heraus kommt. Schließlich geben setzen wir
Anfangs- und Endbuchstaben wieder dran und geben den durcheinander Anfangs- und Endbuchstaben wieder dran und geben den durcheinander
gewirbelten String zurück. gewirbelten String zurück.
%% Cell type:code id:0015-4bab3098b0287694520e7566d0e703d24d73c06b890fe3445713684a74e tags: %% Cell type:code id:0019-4bab3098b0287694520e7566d0e703d24d73c06b890fe3445713684a74e tags:
``` ```
def scramble(word: str): def scramble(word: str):
# Falls das Wort höchstens 3 Zeichen lang ist, oder alle Zeichen in der Mitte gleich sind (z. B. 'Otto'), gibt es nichts zu vertauschen # Falls das Wort höchstens 3 Zeichen lang ist, oder alle Zeichen in der Mitte gleich sind (z. B. 'Otto'), gibt es nichts zu vertauschen
if len(word) <= 3 or all((c == word[1] for c in word[2:-1])): if len(word) <= 3 or all((c == word[1] for c in word[2:-1])):
# print('no need to shuffle:', word) # zum Debuggen # print('no need to shuffle:', word) # zum Debuggen
return word return word
middle_str = word[1:-1] middle_str = word[1:-1]
middle_list = list(middle_str) middle_list = list(middle_str)
# while-Schleife optional: Wiederhole, solange ursprüngliche Reihenfolge besteht (Bedingung oben notwendig um Endlosschleife für z. B. 'alle' zu vermeiden) # while-Schleife optional: Wiederhole, solange ursprüngliche Reihenfolge besteht (Bedingung oben notwendig um Endlosschleife für z. B. 'alle' zu vermeiden)
while middle_str == word[1:-1]: while middle_str == word[1:-1]:
random.shuffle(middle_list) random.shuffle(middle_list)
middle_str = ''.join(middle_list) middle_str = ''.join(middle_list)
# print('shuffled', word[1:-1], 'to', middle_str) # zum Debuggen # print('shuffled', word[1:-1], 'to', middle_str) # zum Debuggen
return word[0] + middle_str + word[-1] return word[0] + middle_str + word[-1]
``` ```
%% Cell type:markdown id:0016-603a11ad4a5a9301b53772559b8dcd48808af118515bbcd92df8e641218 tags: %% Cell type:markdown id:0020-603a11ad4a5a9301b53772559b8dcd48808af118515bbcd92df8e641218 tags:
Nun zu `my_weird_print`. Wir erzeugen per Comprehension eine neue Nun zu `my_weird_print`. Wir erzeugen per Comprehension eine neue
Sequenz, in der jedes Element durch den Rückgabewert von Sequenz, in der jedes Element durch den Rückgabewert von
`scramble_words` ersetzt wird und rufen `print` mit allen Argumenten `scramble_words` ersetzt wird und rufen `print` mit allen Argumenten
auf. auf.
%% Cell type:code id:0017-670d6f2f93ff6c05903147f5343cbda83b0e8e08031b5a0e20f95235a00 tags: %% Cell type:code id:0021-670d6f2f93ff6c05903147f5343cbda83b0e8e08031b5a0e20f95235a00 tags:
``` ```
def my_weird_print(*args, **kwargs): def my_weird_print(*args, **kwargs):
scrambled_args = (scramble_words(arg) for arg in args) scrambled_args = (scramble_words(arg) for arg in args)
print(*scrambled_args, **kwargs) print(*scrambled_args, **kwargs)
``` ```
%% Cell type:markdown id:0020-4b1f5230aa01fa1ea47aa3af631d6374c6c2ec9840094381f4784813d65 tags: %% Cell type:markdown id:0024-4b1f5230aa01fa1ea47aa3af631d6374c6c2ec9840094381f4784813d65 tags:
## Tests ## Tests
### Tests für `scramble` ### Tests für `scramble`
Normaler Fall (Ergebnis zufällig): Normaler Fall (Ergebnis zufällig):
%% Cell type:code id:0021-90fd99b12a8fff77a28e09b1be34438f2da88938902975f005e0a0400e9 tags: %% Cell type:code id:0025-90fd99b12a8fff77a28e09b1be34438f2da88938902975f005e0a0400e9 tags:
``` ```
scramble('banane') scramble('banane')
``` ```
%% Output %% Output
bnnaae 'bnnaae'
%% Cell type:markdown id:0022-db84ff1c111e12514e8b02a2bc773c6400a27cab2e136ccb2468682772f tags: %% Cell type:markdown id:0026-db84ff1c111e12514e8b02a2bc773c6400a27cab2e136ccb2468682772f tags:
Hier sind die mittleren Buchstaben gleich: Hier sind die mittleren Buchstaben gleich:
%% Cell type:code id:0023-045c8fe7d4e14ca602521b666a72c0c009aadb3025b0fdafa24db4d330e tags: %% Cell type:code id:0027-045c8fe7d4e14ca602521b666a72c0c009aadb3025b0fdafa24db4d330e tags:
``` ```
scramble('alle') scramble('alle')
``` ```
%% Output %% Output
'alle' 'alle'
%% Cell type:markdown id:0024-21c478fcf1b50a5b350a839ecb961c19fd3c4e444db4bf14c9fc788b961 tags: %% Cell type:markdown id:0028-21c478fcf1b50a5b350a839ecb961c19fd3c4e444db4bf14c9fc788b961 tags:
Bei drei Buchstaben sollte auch nichts vertauscht werden: Bei drei Buchstaben sollte auch nichts vertauscht werden:
%% Cell type:code id:0025-5e8e0376874647cbcd97bf03fcda2d3aabb38e816e00ba0fe1625fb19d5 tags: %% Cell type:code id:0029-5e8e0376874647cbcd97bf03fcda2d3aabb38e816e00ba0fe1625fb19d5 tags:
``` ```
scramble('abc') scramble('abc')
``` ```
%% Output %% Output
'abc' 'abc'
%% Cell type:markdown id:0026-2da05017afcd6d1af958f7ea0b31f52821a5bfbc4b7a573591ef4493ba5 tags: %% Cell type:markdown id:0030-2da05017afcd6d1af958f7ea0b31f52821a5bfbc4b7a573591ef4493ba5 tags:
Bei zwei Buchstaben gibt es keinen mittleren Teil: Bei zwei Buchstaben gibt es keinen mittleren Teil:
%% Cell type:code id:0027-6f776335dae85f33472b340a32bfce4600a1a205e8d178814f2b260d061 tags: %% Cell type:code id:0031-6f776335dae85f33472b340a32bfce4600a1a205e8d178814f2b260d061 tags:
``` ```
scramble('ab') scramble('ab')
``` ```
%% Output %% Output
'ab' 'ab'
%% Cell type:markdown id:0028-9aff0093625b5b1ae94fcb64f238c1a58db6aff7e8204f27519946b30b6 tags: %% Cell type:markdown id:0032-9aff0093625b5b1ae94fcb64f238c1a58db6aff7e8204f27519946b30b6 tags:
Bei einem Buchstaben darf man nicht den ersten und den letzten Bei einem Buchstaben darf man nicht den ersten und den letzten
Buchstaben zurück geben, weil dann `'aa'` heraus käme. Buchstaben zurück geben, weil dann `'aa'` heraus käme.
%% Cell type:code id:0029-1363d518c12e4bc84aa17d72d744e6407e893c75c37af0b3ab30f76320d tags: %% Cell type:code id:0033-1363d518c12e4bc84aa17d72d744e6407e893c75c37af0b3ab30f76320d tags:
``` ```
scramble('a') scramble('a')
``` ```
%% Output %% Output
'a' 'a'
%% Cell type:markdown id:0030-51bc3dc37385147a73d7bd1ed74d1377bfe41c365700525059f92b0d5c6 tags: %% Cell type:markdown id:0034-51bc3dc37385147a73d7bd1ed74d1377bfe41c365700525059f92b0d5c6 tags:
Obwohl `scramble_words` niemals `scramble` mit einem leeren String Obwohl `scramble_words` niemals `scramble` mit einem leeren String
aufruft, testen wir den Fall auch: aufruft, testen wir den Fall auch:
%% Cell type:code id:0031-74929928b50231c4374e106acdc323c27d2b4597510e1c239814e4d9dd6 tags: %% Cell type:code id:0035-74929928b50231c4374e106acdc323c27d2b4597510e1c239814e4d9dd6 tags:
``` ```
scramble('') scramble('')
``` ```
%% Output %% Output
'' ''
%% Cell type:markdown id:0032-8c7cdba6556f8976c3bf6aec01b5cc4b9fb9aa1746aeea88cc9ef973400 tags: %% Cell type:markdown id:0037-fb5788cbbae26c259f7aac885184399b8dc0d68385c8ed9bfbcdd4376d0 tags:
### Tests für `my_weird_print`
Normaler Fall (Ergebnis zufällig):
%% Cell type:code id:0038-ae89ef8ab62495783e08b8a405930fd7d6c20b39f0ebf5f009987ed1b42 tags:
```
a = 5
my_weird_print('Ich esse jeden Tag', a, 'Bananen.')
```
%% Output
Ich esse jeedn Tag 5 Banaenn.
%% Cell type:markdown id:0039-8c7cdba6556f8976c3bf6aec01b5cc4b9fb9aa1746aeea88cc9ef973400 tags:
Für `my_weird_print` sollten die benannten Argumente, wie `sep` auch Für `my_weird_print` sollten die benannten Argumente, wie `sep` auch
noch funktionieren. Auch hier ist das Ergebnis zufällig: noch funktionieren. Auch hier ist das Ergebnis zufällig:
%% Cell type:code id:0033-c7a9d866289a5d0170b40b14e565ebb322be7d6813856efa71b78e5f194 tags: %% Cell type:code id:0040-c7a9d866289a5d0170b40b14e565ebb322be7d6813856efa71b78e5f194 tags:
``` ```
my_weird_print('Orangen', 'Äpfel', 'Bananen', 'Clementinen', sep=' | ') my_weird_print('Orangen', 'Äpfel', 'Bananen', 'Clementinen', sep=' | ')
``` ```
%% Output %% Output
Orenagn | Äpefl | Baanenn | Cneeetimnln Orenagn | Äpefl | Baanenn | Cneeetimnln
......
%% Cell type:markdown id:0004-35f585a4d04e87c1d3a59630471e2e18f4fd4362affbcf031152ef21d96 tags: %% Cell type:markdown id:0004-e8891ae8cb37d6df5d0fd42e8226bbfac8b23f966b4353c8aed4b3d748c tags:
# Noch lesbar? # Noch lesbar?
Es gbit deise Txete, in dneen bei jeedm Wrot alle Buaectbshn, außer dem Es gbit deise Txete, in dneen bei jeedm Wrot alle Buaectbshn, außer dem
esertn und lzeettn, ddranuchenier gahcsteut wuredn. Schreiben Sie eine esertn und lzeettn, ddranuchenier gahcsteut wuredn. Schreiben Sie eine
print-Funktion `my_weird_print`, die genau das macht. print-Funktion `my_weird_print`, die genau das macht.
Um es einfacher zu machen, teilen Sie die Aufgabe in mehrere Schritte Um es einfacher zu machen, teilen Sie die Aufgabe in mehrere Schritte
auf: auf:
1. `scramble` – eine Funktion, die ein Wort `word` bekommt und darin 1. `scramble` – eine Funktion, die ein Wort `word` bekommt und darin
den mittleren Teil durcheinander bringt. Sie können dazu die Zeichen den mittleren Teil durcheinander bringt. Sie können dazu die Zeichen
mit `list` umwandeln und mit `list` umwandeln und
[`random.shuffle`](https://docs.python.org/3/library/random.html#random.shuffle) [`random.shuffle`](https://docs.python.org/3/library/random.html#random.shuffle)
anwenden oder direkt anwenden oder direkt
[`random.sample`](https://docs.python.org/3/library/random.html#random.sample) [`random.sample`](https://docs.python.org/3/library/random.html#random.sample)
benutzen. In beiden Fällen bekommen Sie eine Liste von Zeichen, die benutzen. In beiden Fällen bekommen Sie eine Liste von Zeichen, die
Sie mit der `join`-Methode wieder zu einem String zusammenführen Sie mit der `join`-Methode wieder zu einem String zusammenführen
müssen. müssen.
2. `scramble_words` – vorgegeben. Die Funktion erhält ein Argument 2. `scramble_words` – vorgegeben. Die Funktion erhält ein Argument
`arg` (üblicherweise Text) und ruft für jedes Wort `scramble` auf `arg` (üblicherweise Text) und ruft für jedes Wort `scramble` auf
und ersetzt das Wort durch den Rückgabewert von `scramble`. und ersetzt das Wort durch den Rückgabewert von `scramble`.
3. `my_weird_print` – ein Wrapper für die `print`-Funktion. 3. `my_weird_print` – ein Wrapper für die `print`-Funktion.
`my_weird_print` bekommt beliebige unbenannte und benannte `my_weird_print` bekommt beliebige unbenannte und benannte
Argumente, normalerweise `*args` und `*kwargs` genannt. `args` ist Argumente, normalerweise `*args` und `**kwargs` genannt. `args` ist
dabei das Tupel mit den Textelementen. Beispiel: Für dabei das Tupel mit den Textelementen. Beispiel: Für
``` python ``` python
my_weird_print('Dies ist ein kleiner Testtext', 'aus', 'drei Elementen') my_weird_print('Dies ist ein kleiner Testtext', 'aus', 'drei Elementen')
``` ```
wäre `args` einfach das Tupel wäre `args` einfach das Tupel
`('Dies ist ein kleiner Testtext', 'aus', 'drei Elementen')`. Nun `('Dies ist ein kleiner Testtext', 'aus', 'drei Elementen')` und
müssen die Wörter in jedem Element in `args` durcheinander gebracht `kwargs` ein leeres Dictionary. Nun müssen die Wörter in jedem
werden. Dazu wird jeweils die Funktion `scramble_words` aufgerufen Element in `args` durcheinander gebracht werden. Dazu wird jeweils
und so eine neue Sequenz (z. B. eine Liste) aus den Rückgabewerten die Funktion `scramble_words` aufgerufen und so eine neue Sequenz
erstellt. Diese kann zusammen mit `kwargs` per Unpacking an `print` (z. B. eine Liste) aus den Rückgabewerten erstellt. Diese kann
übergeben werden. Im einfachsten Fall besteht `my_weird_print` aus zusammen mit `kwargs` per Unpacking an `print` übergeben werden. Im
ein bis zwei Zeilen. einfachsten Fall besteht `my_weird_print` aus ein bis zwei Zeilen.
Für die zufällige Vertauschung und das Finden von Wörtern mit Regular Für die zufällige Vertauschung und das Finden von Wörtern mit Regular
Expressions importieren wir die entsprechenden Module: Expressions importieren wir die entsprechenden Module:
%% Cell type:code id:0005-dc89f46b61c4afda3382f8e6d241460a22e0b4db47f4ec1d895aa7d040a tags: %% Cell type:code id:0005-dc89f46b61c4afda3382f8e6d241460a22e0b4db47f4ec1d895aa7d040a tags:
``` ```
import random import random
import re import re
``` ```
%% Cell type:markdown id:0006-ac381a352207cc0f3173026656c5dd20111d43f951ae0259b6722fd3469 tags: %% Cell type:markdown id:0006-ac381a352207cc0f3173026656c5dd20111d43f951ae0259b6722fd3469 tags:
Als Erstes versuchen Sie die Funktion `scramble` zu schreiben. Als Erstes versuchen Sie die Funktion `scramble` zu schreiben.
Experimentieren Sie mit Slicing des mittleren Wortteils, der zufälligen Experimentieren Sie mit Slicing des mittleren Wortteils, der zufälligen
Vertauschung und `join`. Geben Sie zum Schluss den ersten Buchstaben, Vertauschung und `join`. Geben Sie zum Schluss den ersten Buchstaben,
den durcheinander gebrachten mittleren Wortteil und den letzten den durcheinander gebrachten mittleren Wortteil und den letzten
Buchstaben zurück. Buchstaben zurück.
%% Cell type:code id:0007-316a0f31a2af89835dad13be0e44c32765ad522e460c0fbcf8aaf9f9e9f tags: %% Cell type:code id:0007-bcfb77a0b66aaf1afdcacb34fbb2afa2e87044846f4cc8b0990506b13c2 tags:
``` ```
def scramble(word: str): def scramble(word: str):
return word return word
```
%% Cell type:markdown id:0008-7af12fe93d625d8681d5ea83687c9be2c94c094f6553cb6e57986c91b12 tags:
Beispiel:
%% Cell type:code id:0009-bb8ac4aac7454e9f9aac068c6cec71c6f319f0c0616d5ffcfd82403f2b3 tags:
```
scramble('Eieiei') scramble('Eieiei')
``` ```
%% Cell type:markdown id:0009-82b9c953fff63b155ec82af32806b688e20746e68fb6b96c245f05db202 tags: %% Output
Eeeiii
%% Cell type:markdown id:0011-82b9c953fff63b155ec82af32806b688e20746e68fb6b96c245f05db202 tags:
Unten gibt es weitere Tests, auch für Spezialfälle. Unten gibt es weitere Tests, auch für Spezialfälle.
Zweitens ist hier die vorgegebene Funktion `scramble_words`: Zweitens ist hier die vorgegebene Funktion `scramble_words`:
%% Cell type:code id:0010-cfc1de764814416f8af953c1c7fbe780fa078cdc82609e1cb96b5216603 tags: %% Cell type:code id:0012-cfc1de764814416f8af953c1c7fbe780fa078cdc82609e1cb96b5216603 tags:
``` ```
def scramble_words(arg): def scramble_words(arg):
return re.sub(r'[a-zA-Z]+', lambda m: scramble(m.group()), str(arg)) return re.sub(r'[a-zA-Z]+', lambda m: scramble(m.group()), str(arg))
``` ```
%% Cell type:markdown id:0011-79fc7f82cfffe278625eafa817af9d2482c1b65f8605ca80fcb31e0d81b tags: %% Cell type:markdown id:0013-79fc7f82cfffe278625eafa817af9d2482c1b65f8605ca80fcb31e0d81b tags:
Sie sucht mit Hilfe von [Regular Sie sucht mit Hilfe von [Regular
Expressions](https://docs.python.org/3/howto/regex.html#regex-howto) Expressions](https://docs.python.org/3/howto/regex.html#regex-howto)
nach zusammenhängenden Zeichen. Wenn Sie die Funktion `sub` besser nach zusammenhängenden Zeichen. Wenn Sie die Funktion `sub` besser
verstehen wollen, spielen Sie gerne mit folgendem Code: verstehen wollen, spielen Sie gerne mit folgendem Code:
%% Cell type:code id:0012-9cde5b9f8f00a8a9045e5d68cd5b63f70d98095a4ffc5c8a273cda406f5 tags: %% Cell type:code id:0014-9cde5b9f8f00a8a9045e5d68cd5b63f70d98095a4ffc5c8a273cda406f5 tags:
``` ```
re.sub(r'[a-zA-Z]+', 'bla', 'Ach, ist das Wetter nicht herrlich?') re.sub(r'[a-zA-Z]+', 'bla', 'Ach, ist das Wetter nicht herrlich?')
``` ```
%% Output %% Output
'bla, bla bla bla bla bla?' 'bla, bla bla bla bla bla?'
%% Cell type:markdown id:0014-cc751a72e1b21226b08eaee768e0689fcde8e49ec9c8be0c9cd2d457d68 tags: %% Cell type:markdown id:0016-cc751a72e1b21226b08eaee768e0689fcde8e49ec9c8be0c9cd2d457d68 tags:
Und anstatt fest `'bla'` einzusetzen, wird das eingesetzt, was Und anstatt fest `'bla'` einzusetzen, wird das eingesetzt, was
`scramble` für den gefundenen String `m.group()` zurück gibt. `scramble` für den gefundenen String `m.group()` zurück gibt.
Als Letztes fehlt noch `my_weird_print`. Viel Erfolg! Als Letztes fehlt noch `my_weird_print`. Viel Erfolg!
%% Cell type:code id:0015-2e0d538992c3ef4edab5a807f263b9e225c9e3f1cd33a72a412babd4fc4 tags: %% Cell type:code id:0017-56470077f76b6993f9a2e44eecbda2af1a33cc9feac7c1324e52561a502 tags:
``` ```
def my_weird_print(*args, **kwargs): def my_weird_print(*args, **kwargs):
print() print()
```
%% Cell type:markdown id:0018-7af12fe93d625d8681d5ea83687c9be2c94c094f6553cb6e57986c91b12 tags:
Beispiel:
%% Cell type:code id:0019-207bd23693a027210a7202be4278f822a64faf4ed60d3630defbf948740 tags:
```
my_weird_print('Wusstest du, dass 2^10 =', 2**10, 'ist?') my_weird_print('Wusstest du, dass 2^10 =', 2**10, 'ist?')
``` ```
%% Cell type:markdown id:0018-4b1f5230aa01fa1ea47aa3af631d6374c6c2ec9840094381f4784813d65 tags: %% Output
Wstessut du, dsas 2^10 = 1024 ist?
%% Cell type:markdown id:0022-4b1f5230aa01fa1ea47aa3af631d6374c6c2ec9840094381f4784813d65 tags:
## Tests ## Tests
### Tests für `scramble` ### Tests für `scramble`
Normaler Fall (Ergebnis zufällig): Normaler Fall (Ergebnis zufällig):
%% Cell type:code id:0019-90fd99b12a8fff77a28e09b1be34438f2da88938902975f005e0a0400e9 tags: %% Cell type:code id:0023-90fd99b12a8fff77a28e09b1be34438f2da88938902975f005e0a0400e9 tags:
``` ```
scramble('banane') scramble('banane')
``` ```
%% Output %% Output
bnnaae 'bnnaae'
%% Cell type:markdown id:0020-db84ff1c111e12514e8b02a2bc773c6400a27cab2e136ccb2468682772f tags: %% Cell type:markdown id:0024-db84ff1c111e12514e8b02a2bc773c6400a27cab2e136ccb2468682772f tags:
Hier sind die mittleren Buchstaben gleich: Hier sind die mittleren Buchstaben gleich:
%% Cell type:code id:0021-045c8fe7d4e14ca602521b666a72c0c009aadb3025b0fdafa24db4d330e tags: %% Cell type:code id:0025-045c8fe7d4e14ca602521b666a72c0c009aadb3025b0fdafa24db4d330e tags:
``` ```
scramble('alle') scramble('alle')
``` ```
%% Output %% Output
'alle' 'alle'
%% Cell type:markdown id:0022-21c478fcf1b50a5b350a839ecb961c19fd3c4e444db4bf14c9fc788b961 tags: %% Cell type:markdown id:0026-21c478fcf1b50a5b350a839ecb961c19fd3c4e444db4bf14c9fc788b961 tags:
Bei drei Buchstaben sollte auch nichts vertauscht werden: Bei drei Buchstaben sollte auch nichts vertauscht werden:
%% Cell type:code id:0023-5e8e0376874647cbcd97bf03fcda2d3aabb38e816e00ba0fe1625fb19d5 tags: %% Cell type:code id:0027-5e8e0376874647cbcd97bf03fcda2d3aabb38e816e00ba0fe1625fb19d5 tags:
``` ```
scramble('abc') scramble('abc')
``` ```
%% Output %% Output
'abc' 'abc'
%% Cell type:markdown id:0024-2da05017afcd6d1af958f7ea0b31f52821a5bfbc4b7a573591ef4493ba5 tags: %% Cell type:markdown id:0028-2da05017afcd6d1af958f7ea0b31f52821a5bfbc4b7a573591ef4493ba5 tags:
Bei zwei Buchstaben gibt es keinen mittleren Teil: Bei zwei Buchstaben gibt es keinen mittleren Teil:
%% Cell type:code id:0025-6f776335dae85f33472b340a32bfce4600a1a205e8d178814f2b260d061 tags: %% Cell type:code id:0029-6f776335dae85f33472b340a32bfce4600a1a205e8d178814f2b260d061 tags:
``` ```
scramble('ab') scramble('ab')
``` ```
%% Output %% Output
'ab' 'ab'
%% Cell type:markdown id:0026-9aff0093625b5b1ae94fcb64f238c1a58db6aff7e8204f27519946b30b6 tags: %% Cell type:markdown id:0030-9aff0093625b5b1ae94fcb64f238c1a58db6aff7e8204f27519946b30b6 tags:
Bei einem Buchstaben darf man nicht den ersten und den letzten Bei einem Buchstaben darf man nicht den ersten und den letzten
Buchstaben zurück geben, weil dann `'aa'` heraus käme. Buchstaben zurück geben, weil dann `'aa'` heraus käme.
%% Cell type:code id:0027-1363d518c12e4bc84aa17d72d744e6407e893c75c37af0b3ab30f76320d tags: %% Cell type:code id:0031-1363d518c12e4bc84aa17d72d744e6407e893c75c37af0b3ab30f76320d tags:
``` ```
scramble('a') scramble('a')
``` ```
%% Output %% Output
'a' 'a'
%% Cell type:markdown id:0028-51bc3dc37385147a73d7bd1ed74d1377bfe41c365700525059f92b0d5c6 tags: %% Cell type:markdown id:0032-51bc3dc37385147a73d7bd1ed74d1377bfe41c365700525059f92b0d5c6 tags:
Obwohl `scramble_words` niemals `scramble` mit einem leeren String Obwohl `scramble_words` niemals `scramble` mit einem leeren String
aufruft, testen wir den Fall auch: aufruft, testen wir den Fall auch:
%% Cell type:code id:0029-74929928b50231c4374e106acdc323c27d2b4597510e1c239814e4d9dd6 tags: %% Cell type:code id:0033-74929928b50231c4374e106acdc323c27d2b4597510e1c239814e4d9dd6 tags:
``` ```
scramble('') scramble('')
``` ```
%% Output %% Output
'' ''
%% Cell type:markdown id:0030-8c7cdba6556f8976c3bf6aec01b5cc4b9fb9aa1746aeea88cc9ef973400 tags: %% Cell type:markdown id:0035-fb5788cbbae26c259f7aac885184399b8dc0d68385c8ed9bfbcdd4376d0 tags:
### Tests für `my_weird_print`
Normaler Fall (Ergebnis zufällig):
%% Cell type:code id:0036-ae89ef8ab62495783e08b8a405930fd7d6c20b39f0ebf5f009987ed1b42 tags:
```
a = 5
my_weird_print('Ich esse jeden Tag', a, 'Bananen.')
```
%% Output
Ich esse jeedn Tag 5 Banaenn.
%% Cell type:markdown id:0037-8c7cdba6556f8976c3bf6aec01b5cc4b9fb9aa1746aeea88cc9ef973400 tags:
Für `my_weird_print` sollten die benannten Argumente, wie `sep` auch Für `my_weird_print` sollten die benannten Argumente, wie `sep` auch
noch funktionieren. Auch hier ist das Ergebnis zufällig: noch funktionieren. Auch hier ist das Ergebnis zufällig:
%% Cell type:code id:0031-c7a9d866289a5d0170b40b14e565ebb322be7d6813856efa71b78e5f194 tags: %% Cell type:code id:0038-c7a9d866289a5d0170b40b14e565ebb322be7d6813856efa71b78e5f194 tags:
``` ```
my_weird_print('Orangen', 'Äpfel', 'Bananen', 'Clementinen', sep=' | ') my_weird_print('Orangen', 'Äpfel', 'Bananen', 'Clementinen', sep=' | ')
``` ```
%% Output %% Output
Orenagn | Äpefl | Baanenn | Cneeetimnln Orenagn | Äpefl | Baanenn | Cneeetimnln
......
%% Cell type:markdown id:0001-217d51c35ded1a5e2b0b22937b5c544b07c8d766de790c1511be34272cb tags: %% Cell type:markdown id:0001-217d51c35ded1a5e2b0b22937b5c544b07c8d766de790c1511be34272cb tags:
# Vektor # Vektor
Erstelle eine Klasse `Vector`, die einen Vektor repräsentiert. Im Erstelle eine Klasse `Vector`, die einen Vektor repräsentiert. Im
Konstuktor wird eine Liste `elements` übergeben, die einfach als Konstuktor wird eine Liste `elements` übergeben, die einfach als
Attribut gespeichert werden soll. Implementiere auch die Methoden Attribut gespeichert werden soll. Implementiere auch die Methoden
`__getitem__` und `__setitem__`, um den Zugriff auf die Elemente des `__getitem__` und `__setitem__`, um den Zugriff auf die Elemente des
Vektors (bzw. der Liste) zu ermöglichen. Vektors (bzw. der Liste) zu ermöglichen.
%% Cell type:code id:0002-37099f9d8991702ede6ef61e0912e212c7341c82601655fb013f6732548 tags: %% Cell type:code id:0002-80e8c3cd8b01d2fa8e7b95e60dadf10dc0ca92d55f994951c66bd388c41 tags:
``` ```
class Vector: class Vector:
def __init__(self, elements): def __init__(self, elements):
# TODO: Implementiere die __init__ Methode hier # TODO: Implementiere die __init__ Methode hier
pass pass
def __getitem__(self, index): def __getitem__(self, index):
# TODO: Implementiere die __getitem__ Methode hier # TODO: Implementiere die __getitem__ Methode hier
pass pass
def __setitem__(self, index, value): def __setitem__(self, index, value):
# TODO: Implementiere die __setitem__ Methode hier # TODO: Implementiere die __setitem__ Methode hier
pass pass
::: :::
::::: {.startcode} ::::: exerciseonly
Hier Ihr Code: Hier Ihr Code:
``` code ``` code
``` ```
%% Cell type:markdown id:0004-5c044819e166471fcc1c0e7b42664af17b4d6450e371b5e0c0954073a86 tags: %% Cell type:markdown id:0004-5c044819e166471fcc1c0e7b42664af17b4d6450e371b5e0c0954073a86 tags:
## Tests ## Tests
Hier ein Beispiel, dass zeigt, dass sich `Vector` wie eine Liste Hier ein Beispiel, dass zeigt, dass sich `Vector` wie eine Liste
verhält: verhält:
%% Cell type:code id:0005-98f3d061228bf121e0af4ade4e8d093a866100deaf4e1d3c5e1e5b58486 tags: %% Cell type:code id:0005-98f3d061228bf121e0af4ade4e8d093a866100deaf4e1d3c5e1e5b58486 tags:
``` ```
vector = Vector([1, 2, 3, 4, 5]) vector = Vector([1, 2, 3, 4, 5])
print(vector[2]) print(vector[2])
``` ```
%% Output %% Output
3 3
%% Cell type:code id:0006-6111e9959d39a131b00706a711656d67e6ab929ed4dcdff719b042808fc tags: %% Cell type:code id:0006-6111e9959d39a131b00706a711656d67e6ab929ed4dcdff719b042808fc tags:
``` ```
vector[1] = 10 vector[1] = 10
print(vector[1]) print(vector[1])
``` ```
%% Output %% Output
10 10
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment