WEBVTT

00:00:00.000 --> 00:00:03.780
Ja, hallo liebe Hörerinnen und Hörer. Wir kommen beim Python-Podcast, Episode 36.

00:00:04.980 --> 00:00:09.500
Heute wollen wir mit euch ein bisschen über die technischen Implementierungsdetails von Dictionaries reden.

00:00:11.000 --> 00:00:12.680
Jochen ist natürlich wieder da. Hi Jochen.

00:00:12.740 --> 00:00:13.500
Hallihallo, Dominik.

00:00:13.920 --> 00:00:16.820
Dominik, genau. Und heute ist auch wieder Johannes dabei. Hi Johannes.

00:00:17.180 --> 00:00:17.800
Hallo zusammen.

00:00:17.960 --> 00:00:18.380
Ja, moin.

00:00:19.000 --> 00:00:26.220
Ja, wir fangen wie immer ein bisschen News aus der Szene an und was uns sonst noch so einfällt und dann gehen wir so ein bisschen in das Thema rein.

00:00:27.680 --> 00:00:28.040
Ja.

00:00:28.040 --> 00:00:29.600
Ja. Also du wolltest

00:00:29.600 --> 00:00:31.380
unbedingt noch über den Copilot reden, habe ich gehört.

00:00:31.860 --> 00:00:32.620
Ich wollte das.

00:00:33.620 --> 00:00:35.620
Ja, ich auch. Der Jochen ist derjenige, der immer

00:00:35.620 --> 00:00:37.420
darüber sprechen möchte. Ja, wir haben schon zweimal

00:00:37.420 --> 00:00:39.460
darüber gesprochen. Aber jetzt hat auch Jochen

00:00:39.460 --> 00:00:41.640
ihn ausprobiert. Jetzt hat auch

00:00:41.640 --> 00:00:43.180
PyCharm hat jetzt auch Copilot.

00:00:43.420 --> 00:00:44.000
Deswegen, genau.

00:00:45.560 --> 00:00:47.340
Genau, ich habe irgendwann die erlösende Mail von

00:00:47.340 --> 00:00:49.340
GitHub bei mir bekommen, sodass ich jetzt im Beta-Programm

00:00:49.340 --> 00:00:51.280
auch mit drin bin. Und genau, da muss ich das

00:00:51.280 --> 00:00:53.380
natürlich direkt mal ausprobieren. Und ich hätte da eigentlich gar keine

00:00:53.380 --> 00:00:55.220
so hohen Erwartungen, obwohl du immer schon so davon

00:00:55.220 --> 00:00:57.280
vorgeschwärmt hast. Ja, du hast immer gesagt, ach, was für ein Krass,

00:00:57.280 --> 00:00:59.300
ist ja völlig egal. Ja, das kann ja nicht, also wenn man

00:00:59.300 --> 00:01:00.860
jetzt irgendwie so durchschnittlichen Code

00:01:00.860 --> 00:01:03.020
davon irgendwie in den Leuten kriegt, das kann ja nichts

00:01:03.020 --> 00:01:04.260
das kann ja nichts taugen.

00:01:05.540 --> 00:01:06.760
Aber ich muss sagen, ich bin

00:01:06.760 --> 00:01:09.180
doch sehr überrascht, dass das manchmal

00:01:09.180 --> 00:01:10.720
wirklich, wirklich hilfreich ist.

00:01:10.720 --> 00:01:12.160
Sogar Jochen findet das hilfreich.

00:01:12.760 --> 00:01:15.140
Sogar Jochen findet es hilfreich. Ja, ich finde es auch sehr cool.

00:01:15.360 --> 00:01:17.140
Also ich finde vor allem diese Autocompletion cool. Er lernt irgendwie

00:01:17.140 --> 00:01:19.100
aus seiner eigenen Codepace und weiß so ein bisschen, was

00:01:19.100 --> 00:01:21.040
du als nächstes vorhaben könntest oder er macht manchmal so einen guten

00:01:21.040 --> 00:01:22.620
Vorschlag. Ist natürlich nicht immer,

00:01:23.140 --> 00:01:25.100
ist auch nicht immer richtig, aber manchmal ist er staunlich richtig.

00:01:25.500 --> 00:01:27.080
Ja. Ja und manchmal

00:01:27.080 --> 00:01:28.680
findet man halt Dinge dadurch

00:01:28.680 --> 00:01:31.020
erst, die man, also ich

00:01:31.020 --> 00:01:32.680
mache jetzt manchmal auch so ein bisschen

00:01:32.680 --> 00:01:35.100
JavaScript beziehungsweise TypeScript

00:01:35.100 --> 00:01:36.340
und

00:01:36.340 --> 00:01:39.060
manchmal weiß ich einfach nicht, wie Sachen

00:01:39.060 --> 00:01:40.900
gehen. Also ich habe keine Ahnung, wie das geht

00:01:40.900 --> 00:01:43.220
und dann fange ich irgendwie mit einem variablen Namen an

00:01:43.220 --> 00:01:45.300
und dann kriege ich so einen ganzen

00:01:45.300 --> 00:01:47.140
Codeblock und der tut genau das, was ich

00:01:47.140 --> 00:01:47.740
eigentlich machen wollte.

00:01:49.860 --> 00:01:51.160
Also du musst halt wirklich aufpassen, was für

00:01:51.160 --> 00:01:53.040
Namen du den Dingen gibst. Wenn du den guten Namen gibst,

00:01:53.060 --> 00:01:54.560
ist der viel besser, als wenn du schlechte Namen gibst.

00:01:54.940 --> 00:01:56.900
Da muss man sowieso aufpassen,

00:01:56.900 --> 00:01:58.860
und immer gute Namen finden. Genau, aber wenn man das dann halt

00:01:58.860 --> 00:02:00.920
macht und dann auch einen guten Doxtrain schreibt oder einen Kommentar

00:02:00.920 --> 00:02:02.940
dazu, dann lernt er sogar noch aus diesen Doxtrains,

00:02:03.000 --> 00:02:04.840
aus den Kommentaren was dazu. Oder halt, also

00:02:04.840 --> 00:02:06.460
was halt bei mir vorgefunden wird, ich mache halt den

00:02:06.460 --> 00:02:08.680
Methodennamen beispielsweise oder den Klassnamen oder

00:02:08.680 --> 00:02:10.960
die Funktion und die Argumente und

00:02:10.960 --> 00:02:12.840
Type-ins und dann weiß er ziemlich oft, was

00:02:12.840 --> 00:02:14.440
zu tun ist, wenn ich den Doxtrain noch mache.

00:02:14.760 --> 00:02:16.200
Dann schreibe ich im Doxtrain rein, was er tun soll und dann

00:02:16.200 --> 00:02:18.420
der Vorschlag, der ist schon echt gut.

00:02:18.800 --> 00:02:21.000
Also auch, da gibt einer halt auch Implementierungsvorschläge

00:02:21.000 --> 00:02:22.520
an, die man vielleicht nicht gedacht hat oder sowas schon.

00:02:23.260 --> 00:02:24.540
Ja, also da,

00:02:24.740 --> 00:02:26.360
das ist durchaus

00:02:26.360 --> 00:02:28.300
aus sehr...

00:02:28.300 --> 00:02:29.400
Und ich weiß, warum Jochen den gut selber...

00:02:29.400 --> 00:02:31.680
Weil er sich ja immer selber am eigenen Code-Repo orientiert.

00:02:31.740 --> 00:02:33.760
Er orientiert sich an Jochens eigenem Code und dann denke ich auch

00:02:33.760 --> 00:02:35.240
natürlich immer, oh, was für ein toller Vorschlag.

00:02:35.680 --> 00:02:36.280
Ja, ja.

00:02:36.280 --> 00:02:37.020
Das hat den Stil.

00:02:38.400 --> 00:02:38.880
Also,

00:02:40.000 --> 00:02:41.980
Kritik würde ich sagen,

00:02:42.440 --> 00:02:44.080
es ist auch besser geworden,

00:02:44.360 --> 00:02:46.140
wenn man diese Nightly-Versionen nimmt.

00:02:46.340 --> 00:02:48.140
Ich habe zuerst die Standard-Version genommen

00:02:48.140 --> 00:02:50.220
und man kann halt die

00:02:50.220 --> 00:02:52.080
aktuelle Bleeding Edge-Geschichte nehmen.

00:02:52.160 --> 00:02:54.260
Die ist, finde ich, nochmal ein gutes Stückchen besser.

00:02:55.460 --> 00:02:56.240
Was manchmal

00:02:56.240 --> 00:02:57.820
nicht so gut funktioniert, also was, womit

00:02:57.820 --> 00:03:00.220
Copilot halt irgendwie unerwarteter

00:03:00.220 --> 00:03:02.180
Weise, weil man denkt, das ist eigentlich eine einfache Geschichte,

00:03:02.800 --> 00:03:03.980
große Probleme

00:03:03.980 --> 00:03:05.260
hat,

00:03:05.880 --> 00:03:07.860
wo er das große Problem hat, ist Klammern.

00:03:08.600 --> 00:03:09.940
Also die Klammern richtig zu setzen,

00:03:10.320 --> 00:03:11.160
also zum Beispiel zu machen,

00:03:11.660 --> 00:03:14.160
Klammern richtig zu, oder

00:03:14.160 --> 00:03:16.000
halt irgendwie, dass das halt

00:03:16.000 --> 00:03:18.000
nur Sinn macht, wenn es runde Klammern sind. Manchmal macht er auch

00:03:18.000 --> 00:03:20.160
einfach eckige Klammern bei mir, so an Stellen,

00:03:20.380 --> 00:03:21.880
wo Funktionen aufgerufen werden und dann

00:03:21.880 --> 00:03:23.140
ist das natürlich, das funktioniert halt nicht.

00:03:24.280 --> 00:03:26.040
Kannst du das nicht erklären,

00:03:26.040 --> 00:03:28.280
Das ist doch irgendwie diese neuronalen Netze, weil die halt

00:03:28.280 --> 00:03:30.180
nicht genügend Zustand für sowas haben, oder?

00:03:32.240 --> 00:03:33.920
Ja, man muss denen halt irgendwie

00:03:33.920 --> 00:03:36.180
die Syntax sozusagen irgendwie so einprügeln,

00:03:36.260 --> 00:03:38.360
dass sie das halt nicht, dass das nichts Unscharfes ist

00:03:38.360 --> 00:03:40.200
oder, aber das funktioniert vielleicht

00:03:40.200 --> 00:03:41.400
nicht so richtig. Also meistens funktioniert das auch.

00:03:41.400 --> 00:03:44.480
Ja, aber prinzipiell

00:03:44.480 --> 00:03:46.180
hat dieses Netz ja kein Verständnis von

00:03:46.180 --> 00:03:48.260
ich habe N-Klammern geöffnet und du musst jetzt

00:03:48.260 --> 00:03:49.900
N-Klammern auch wieder schließen in der richtigen Reihenfolge.

00:03:49.920 --> 00:03:51.880
Du kannst ja alle Vorschläge aussortieren, bei denen das

00:03:51.880 --> 00:03:54.300
nicht stimmt oder du kannst ja danach noch auditieren oder sowas.

00:03:54.300 --> 00:03:56.380
Ja, ja, klar, also es ist jetzt auch kein großes Problem

00:03:56.380 --> 00:03:58.320
das ist halt irgendwie so ein bisschen erstaunlich

00:03:58.320 --> 00:04:00.140
wo man sich denkt, naja, also das Schwierige, den

00:04:00.140 --> 00:04:02.320
schwierigen Teil, den kann es eigentlich überraschend gut

00:04:02.320 --> 00:04:04.380
nämlich irgendwie rausfinden, was man

00:04:04.380 --> 00:04:06.240
da machen wollte und dann den Code schreiben

00:04:06.240 --> 00:04:07.660
der zumindest so aussieht, als würde das richtig gut

00:04:07.660 --> 00:04:10.260
und dann kommen halt so Dinge, wo man sagt

00:04:10.260 --> 00:04:12.380
das kann ja fast, eine IDE kann das ja schon

00:04:12.380 --> 00:04:13.560
so die Klammern richtig setzen

00:04:13.560 --> 00:04:16.000
und das geht dann nicht mehr, ja gut, aber

00:04:16.000 --> 00:04:18.300
ich meine, das sind Sachen, die wird man

00:04:18.300 --> 00:04:20.480
halt mit der Zeit in den Griff kriegen, denke ich mal

00:04:20.480 --> 00:04:21.340
und dann ist das schon

00:04:21.340 --> 00:04:23.020
echt beeindruckend

00:04:23.020 --> 00:04:25.220
Was man auch mal machen muss, ist so User-Daten

00:04:25.220 --> 00:04:26.940
beispielsweise machst du irgendwie eine JSON

00:04:26.940 --> 00:04:28.980
und dann machst du

00:04:28.980 --> 00:04:31.320
einen Namen, eine E-Mail-Adresse oder so

00:04:31.320 --> 00:04:33.240
und ein Passwort und dann machst du Autocomplete

00:04:33.240 --> 00:04:35.220
und dann gibt dir halt eine Liste

00:04:35.220 --> 00:04:36.220
von Usern irgendwie

00:04:36.220 --> 00:04:38.360
mit seinem Passwort und so.

00:04:39.280 --> 00:04:40.080
Das ist dann die Frage.

00:04:40.200 --> 00:04:41.620
Das ist für den Demo-Benutzer perfekt.

00:04:42.100 --> 00:04:43.540
Ja, oder sind die generiert oder echt?

00:04:43.780 --> 00:04:45.920
Man weiß es aber nicht so genau, von wo die sind.

00:04:46.320 --> 00:04:47.000
Das sind alle gelernt.

00:04:48.040 --> 00:04:49.920
Ja, es ist wohl auch, wenn man so Zahlenfolgen eingibt,

00:04:50.000 --> 00:04:52.280
dann gibt er einem interessante Instruktionen.

00:04:52.280 --> 00:04:57.260
ein Screenshot gesehen, wo dann russische Funktionsnamen dazu kamen.

00:04:57.320 --> 00:04:58.120
Also, okay.

00:04:58.680 --> 00:05:00.780
Ja, ich bin ja mal gespannt, was dabei rauskommt.

00:05:00.880 --> 00:05:05.280
Wenn man so was, man anfängt irgendwie so 3.1417...

00:05:07.600 --> 00:05:08.480
Ja, ja.

00:05:09.040 --> 00:05:09.820
Ab wie viel Nachkommastellung?

00:05:10.200 --> 00:05:11.420
Ja, ja, vielleicht, vielleicht.

00:05:12.140 --> 00:05:13.980
Also, ja, das ist ja...

00:05:13.980 --> 00:05:17.240
Das ist noch keine AGI, das ist noch keine generelle Intelligenz, glaube ich.

00:05:17.480 --> 00:05:19.980
Da habe ich letztens, ich komme vom Holzen aufs Stöckchen,

00:05:19.980 --> 00:05:21.500
aber vielleicht ist das ja auch nicht so uninteressant,

00:05:21.500 --> 00:05:31.460
und wieder einen ganz netten Podcast-Episode gehört mit Lex Friedman, wo Lex Friedman Stephen Wolfram interviewt hat.

00:05:32.460 --> 00:05:34.720
Ja, der ist ja so ein Wunderkind und dann so ein bisschen hinter den Arm.

00:05:34.720 --> 00:05:35.980
Eine sehr kontroverse Persönlichkeit.

00:05:36.200 --> 00:05:37.820
Ja, polarisierend.

00:05:38.000 --> 00:05:39.660
Warum? Jetzt musst du das genau aufklären direkt.

00:05:40.180 --> 00:05:42.880
Ja, es gibt Leute, die lieben ihn total und der macht ja auch viele gute Sachen,

00:05:43.120 --> 00:05:48.920
aber es gibt Leute, die hassen ihn auch total, weil der halt auch seine Meinung für sehr wichtig hält.

00:05:48.920 --> 00:05:54.040
Achso, okay, ich wollte gerade sagen, wir wollen ja die Gründe und Anekdoten auch hören, es geht um seine Meinung, die er präsentiert

00:05:54.040 --> 00:06:03.660
Ja, und er ist auch so ein, er hat so ein paar interessante Fixierungen, der findet, dass die ganze Welt aus State Machines besteht und muss alles mit State Machines machen

00:06:03.660 --> 00:06:08.120
Und Rule 34 ist das einzige, was...

00:06:08.120 --> 00:06:14.880
War das nicht Rule 38 oder so?

00:06:14.880 --> 00:06:17.080
oder so. Ja, diese 30er-Regeln,

00:06:17.200 --> 00:06:19.300
also das ist so eine Klasse von

00:06:19.300 --> 00:06:22.060
State Machines

00:06:22.060 --> 00:06:23.040
und die kannst du

00:06:23.040 --> 00:06:24.820
durchnummerieren und die haben eine natürliche Ordnung

00:06:24.820 --> 00:06:26.900
und dann findest du halt irgendwann

00:06:26.900 --> 00:06:28.860
eine, die eine universelle Turing-Maschine ist

00:06:28.860 --> 00:06:30.440
im Wesentlichen und

00:06:30.440 --> 00:06:32.940
Stephen Wolfram sagt

00:06:32.940 --> 00:06:35.060
halt mehr oder weniger, der schreibt ganze Bücher

00:06:35.060 --> 00:06:37.000
darüber, was diese State Machine alles

00:06:37.000 --> 00:06:38.900
kann und dass die das Universum enkodiert und das

00:06:38.900 --> 00:06:40.560
ist natürlich

00:06:40.560 --> 00:06:43.040
wenn du

00:06:43.040 --> 00:06:45.260
wenn du die gesamte Wissenschaft umstellen willst auf State Machines.

00:06:45.760 --> 00:06:46.940
Also ich habe immer noch keine Ahnung, was

00:06:46.940 --> 00:06:49.180
Rule 38 ist, aber das Urban Digitry hat mir gesagt,

00:06:49.260 --> 00:06:50.820
Rule 38 is a prison offense

00:06:50.820 --> 00:06:52.940
in which someone is masturbating in public.

00:06:54.400 --> 00:06:55.360
Ah ja, okay.

00:06:55.980 --> 00:06:57.340
Also wenn du mal viel Spaß haben willst

00:06:57.340 --> 00:06:59.160
und Private Mode an hast, dann google

00:06:59.160 --> 00:07:00.140
doch mal nach Rule 34.

00:07:00.280 --> 00:07:02.000
Rule 34, das ist glaube ich die

00:07:02.000 --> 00:07:05.060
If it exists, there's porn of it.

00:07:05.400 --> 00:07:06.880
Glaube ich. Das ist auch irgendwie

00:07:06.880 --> 00:07:08.960
eine sehr wichtige Regel und tatsächlich stimmt sie

00:07:08.960 --> 00:07:10.160
halt einfach immer. Aber

00:07:10.160 --> 00:07:12.420
leider erstaunlicherweise.

00:07:13.040 --> 00:07:14.880
as a type of font as a website for it.

00:07:15.540 --> 00:07:16.600
Ach so, okay.

00:07:16.760 --> 00:07:17.640
Das ist auch Rule 38.

00:07:18.580 --> 00:07:19.820
Rule 30 sagen die.

00:07:20.320 --> 00:07:23.000
Okay, aber das sind beides nicht die Regeln, die ich jetzt gerade meinte.

00:07:25.460 --> 00:07:26.320
30 ist es.

00:07:28.940 --> 00:07:30.820
Genau, um diese Dinger ging es

00:07:30.820 --> 00:07:32.300
natürlich bei der Episode auch.

00:07:32.780 --> 00:07:34.180
Ich finde das schon interessant.

00:07:35.180 --> 00:07:36.660
Leute hatten

00:07:36.660 --> 00:07:38.940
hohe Erwartungen an ihn, weil er war halt so ein Wunderkind.

00:07:39.300 --> 00:07:40.520
Und dann ist aber irgendwie

00:07:40.520 --> 00:07:42.560
dann doch nicht irgendwie so wirklich so

00:07:42.560 --> 00:07:45.720
Einstein-mäßige

00:07:45.720 --> 00:07:47.040
Ausmaße haben seine Theorien

00:07:47.040 --> 00:07:48.320
da jetzt nicht angenommen, sondern

00:07:48.320 --> 00:07:50.320
ein bisschen hinter den Erwartungen zurückgeblieben.

00:07:51.120 --> 00:07:53.020
Aber tatsächlich ist er ja

00:07:53.020 --> 00:07:54.100
genau eben der Meinung.

00:07:54.840 --> 00:07:57.100
Er hat ja ein Buch geschrieben, das hat auch schon so einen Titel

00:07:57.100 --> 00:07:58.540
New Kind of Science.

00:08:00.640 --> 00:08:02.960
Den kann man ja auch nur nehmen, wenn man denkt, da hat man jetzt mal echt was

00:08:02.960 --> 00:08:03.280
gefunden.

00:08:04.800 --> 00:08:06.400
Er hat ein gewisses Selbstbewusstsein.

00:08:07.120 --> 00:08:08.900
Aber er hat ja auch coole Sachen gemacht, also so ist es nicht.

00:08:08.900 --> 00:08:11.020
und er ist halt auch super

00:08:11.020 --> 00:08:13.120
ungeheuer produktiv, also es gibt so eine

00:08:13.120 --> 00:08:14.900
er hat so ein Diagramm veröffentlicht von

00:08:14.900 --> 00:08:16.920
wann er E-Mails schreibt und der hat eigentlich

00:08:16.920 --> 00:08:18.940
immer 18 Stunden Tage und manchmal hat er

00:08:18.940 --> 00:08:20.180
auch 24 Stunden Tage, also

00:08:20.180 --> 00:08:22.980
er schlägt es einfach

00:08:22.980 --> 00:08:24.660
durch Produktivität, diese ganzen

00:08:24.660 --> 00:08:26.040
Kritikpunkte

00:08:26.040 --> 00:08:28.900
Ja, also er hat ja auch so eine Firma, die macht

00:08:28.900 --> 00:08:30.820
Mathematiker, auch eine super Software, also

00:08:30.820 --> 00:08:32.340
ja

00:08:32.340 --> 00:08:34.220
oder eben Wolfram Alpha, wie gesagt

00:08:34.220 --> 00:08:36.320
Wolfram Alpha, genau, ja und

00:08:36.320 --> 00:08:38.720
ja auch die Firma so zu nennen, also

00:08:38.720 --> 00:08:39.640
und naja gut, aber

00:08:39.640 --> 00:08:42.560
das ist, er macht ja wirklich

00:08:42.560 --> 00:08:44.640
cooles Zeug, also so kann man eigentlich auch nichts sagen

00:08:44.640 --> 00:08:45.120
und

00:08:45.120 --> 00:08:48.540
das fand ich nur ganz interessant, weil es jetzt,

00:08:48.620 --> 00:08:50.500
weil er auch da, da kam das Thema auch

00:08:50.500 --> 00:08:52.020
auf Pi, ich meine, das ist ja auch

00:08:52.020 --> 00:08:54.400
so eine Zahl, die einem ab und zu mal

00:08:54.400 --> 00:08:56.520
irgendwie über den Weg läuft und er

00:08:56.520 --> 00:08:57.680
Du meinst Tau halbe?

00:08:58.160 --> 00:09:00.440
Ja, genau, ja stimmt, Tau

00:09:00.440 --> 00:09:02.420
ist dann vielleicht etwas, was man häufiger noch braucht als Pi

00:09:02.420 --> 00:09:04.620
und

00:09:04.620 --> 00:09:06.620
genau, wie jeder

00:09:06.620 --> 00:09:08.320
weiß, ist das Ding halt transzendent

00:09:08.320 --> 00:09:09.820
rational und

00:09:09.820 --> 00:09:12.380
hat eine Menge

00:09:12.380 --> 00:09:13.760
super interessante Eigenschaften,

00:09:14.240 --> 00:09:16.280
aber so fundamentale Sachen, die man jetzt, wo man

00:09:16.280 --> 00:09:17.880
denkt, das müsste man doch eigentlich darüber wissen,

00:09:18.340 --> 00:09:19.600
also wie zum Beispiel sowas wie

00:09:19.600 --> 00:09:22.320
kommen denn

00:09:22.320 --> 00:09:24.300
alle Ziffern in der

00:09:24.300 --> 00:09:26.240
Dezimalbruchentwicklung von Pi mit der gleichen

00:09:26.240 --> 00:09:28.300
Wahrscheinlichkeit vor? Also ist Pi normal

00:09:28.300 --> 00:09:30.300
oder nicht? Das weiß man

00:09:30.300 --> 00:09:32.240
halt nicht und zwar so gar nicht und hat auch

00:09:32.240 --> 00:09:34.060
gar keine Ahnung, wie man das irgendwie hinkriegen könnte.

00:09:34.460 --> 00:09:36.240
Dabei ist die Regel, die jetzt Pi erzeugt,

00:09:36.240 --> 00:09:38.100
eben auch ziemlich einfach eigentlich.

00:09:38.320 --> 00:09:40.300
und dann ist es doch irgendwie überraschend,

00:09:40.380 --> 00:09:42.220
dass dabei eine Ziffernfolge rausfällt, die einmal

00:09:42.220 --> 00:09:44.340
so total zufällig aussieht, wo man

00:09:44.340 --> 00:09:45.560
nicht drüber sagen kann,

00:09:46.080 --> 00:09:48.460
nicht mal die Verteilung der Ziffern

00:09:48.460 --> 00:09:50.360
da drin sagen kann und die so aussieht,

00:09:50.540 --> 00:09:52.160
als könnte man wirklich

00:09:52.160 --> 00:09:54.340
nicht, man kann es halt auf nichts anderes reduzieren.

00:09:54.460 --> 00:09:55.940
Man kann da drin, findet dann keine Muster.

00:09:56.780 --> 00:09:58.160
Da kommt einfach

00:09:58.160 --> 00:09:59.880
alles, was es überhaupt an Mustern irgendwie gibt,

00:09:59.960 --> 00:10:01.200
kommt wohl offenbar daran vor.

00:10:03.240 --> 00:10:04.280
Die Frage

00:10:04.280 --> 00:10:05.900
ist halt, wie kommt aus so etwas,

00:10:05.900 --> 00:10:07.640
aus so einer einfachen Regel, wie man

00:10:07.640 --> 00:10:11.020
P bilden kann. Warum fällt da plötzlich so ein ganzes Universum raus?

00:10:11.840 --> 00:10:15.860
Ja, das ist ja im Wesentlichen das, was der Wolfram auch sagt mit seiner Regel 30.

00:10:15.980 --> 00:10:19.600
Das ist ja eine ganz simple Regel. Das ist die 30. die du ausprobierst, wenn du sie nach seiner

00:10:19.600 --> 00:10:23.300
Ordnung machst und dann kommt so mordsmäßiges Chaos raus und alles, was du dir vorstellen kannst.

00:10:24.800 --> 00:10:27.760
Das ist so eine generelle Sache

00:10:27.760 --> 00:10:31.200
in der Mathematik. Irgendwann mache ich da auch mal noch einen längeren Diskurs drüber.

00:10:33.400 --> 00:10:35.720
Dass man mathematisch gesehen aus sehr

00:10:35.720 --> 00:10:37.740
einfachen Regeln, wo man denkt, ja, die

00:10:37.740 --> 00:10:39.820
sind einfach genug, um sie im Kopf auszuführen,

00:10:40.880 --> 00:10:41.280
Dinge

00:10:41.280 --> 00:10:43.620
produzieren kann, die völlig

00:10:43.620 --> 00:10:45.980
unabsehbar sind und völlig überraschend

00:10:45.980 --> 00:10:47.380
auch, weil sie eben nicht mehr

00:10:47.380 --> 00:10:49.760
sich an die Regeln halten, sondern weil sie dann irgendwelche

00:10:49.760 --> 00:10:51.780
chaotischen Sachen produzieren und

00:10:51.780 --> 00:10:53.820
das ist was

00:10:53.820 --> 00:10:55.720
sehr Erschreckendes und das ist

00:10:55.720 --> 00:10:57.580
aber auch gleichzeitig was sehr Schönes in der Mathematik,

00:10:57.700 --> 00:10:59.000
weil man da eben Dinge finden kann,

00:10:59.820 --> 00:11:01.640
die einen völlig überraschen, auch aus den

00:11:01.640 --> 00:11:02.780
einfachsten Bausteinen raus.

00:11:02.780 --> 00:11:04.400
Also, um das nochmal so zusammenzufassen,

00:11:04.400 --> 00:11:06.560
Du hast gerade sich darüber beschwert, dass

00:11:06.560 --> 00:11:09.180
die Wahrscheinlichkeitsverteilung

00:11:09.180 --> 00:11:10.800
des Auftretens von einer Nachkommastelle

00:11:10.800 --> 00:11:13.040
von Pi in der Gesamtsumme aller Nachkommastellen

00:11:13.040 --> 00:11:14.600
von Pi, die bekannt sind,

00:11:14.680 --> 00:11:16.660
nicht bekannt sind.

00:11:16.840 --> 00:11:18.340
Also die kannst du ja nicht kennen.

00:11:21.020 --> 00:11:22.400
Aber man weiß,

00:11:22.820 --> 00:11:24.740
es könnte ja sein, dass irgendwann keine Neunen mehr

00:11:24.740 --> 00:11:26.000
vorkommen, einfach gar keine mehr.

00:11:27.360 --> 00:11:28.240
Ist das normalerweise so?

00:11:28.960 --> 00:11:30.680
Nee, ist eben nicht normalerweise so.

00:11:31.040 --> 00:11:32.660
Aber es könnte sein, wir können es nicht ausschließen.

00:11:32.660 --> 00:11:35.780
Das ist die Sache, was der Jochen sagt, keine Ahnung

00:11:35.780 --> 00:11:37.180
Ja

00:11:37.180 --> 00:11:39.380
Und das ist überraschend, dass

00:11:39.380 --> 00:11:41.580
man da so gar keine Ahnung hat, weil man denkt so

00:11:41.580 --> 00:11:43.380
naja, das müsste man doch jetzt irgendwie, wenn man sich

00:11:43.380 --> 00:11:45.520
irgendwie etwas an, wenn man die Regel wie Pi entwickelt

00:11:45.520 --> 00:11:47.280
wird, hinschreibt und eine Funktion wie Pi ausrechnet

00:11:47.280 --> 00:11:49.260
das ist wirklich so ein Verzeilen

00:11:49.260 --> 00:11:51.380
muss man diese Zeilen nur ganz, ganz

00:11:51.380 --> 00:11:53.220
lange und genau angucken und dann muss

00:11:53.220 --> 00:11:55.120
einem doch klar sein, okay

00:11:55.120 --> 00:11:57.240
da irgendwie, ne, neun, die kommen

00:11:57.240 --> 00:11:58.600
genauso häufig vor wie alle anderen auch

00:11:58.600 --> 00:12:01.100
Oder zumindest kommt immer mal wieder

00:12:01.100 --> 00:12:03.440
einen neuen vor. Das ist ja schon eine Aussage,

00:12:03.560 --> 00:12:04.500
die sehr schwer zu treffen ist.

00:12:05.180 --> 00:12:07.200
Ja, aber das ist doch im Endeffekt, reduziert sich das

00:12:07.200 --> 00:12:08.980
darunter auf das Halting-Problem, oder? Also,

00:12:09.200 --> 00:12:11.300
wenn du das lösen kannst, dann kannst du auch das Halting-Problem

00:12:11.300 --> 00:12:13.440
lösen. Was ist das Halting-Problem und was ist das Tau-Halbe?

00:12:14.840 --> 00:12:15.440
Tau-Halbe

00:12:15.440 --> 00:12:15.800
ist Pi.

00:12:16.820 --> 00:12:19.280
Das gab es vor einer Weile mal, das Tau-Manifest,

00:12:19.560 --> 00:12:21.320
wo jemand

00:12:21.320 --> 00:12:23.320
behauptet hat, Pi ist eigentlich die falsche

00:12:23.320 --> 00:12:25.020
transzendente Zahl.

00:12:25.100 --> 00:12:27.420
Die richtige transzendente Zahl ist eigentlich Tau

00:12:27.420 --> 00:12:29.080
und das ist

00:12:29.080 --> 00:12:30.960
zweimal Pi, weil

00:12:30.960 --> 00:12:33.040
dann ganz viele so quadratische Formen eben

00:12:33.040 --> 00:12:34.980
einen Faktor 2 verlieren, der

00:12:34.980 --> 00:12:36.780
diese Formen einheitlicher macht.

00:12:37.500 --> 00:12:38.940
Es gibt auch ein Gegenmanifest

00:12:38.940 --> 00:12:40.520
gegen dieses Tau-Manifest,

00:12:41.120 --> 00:12:43.060
das quasi

00:12:43.060 --> 00:12:45.020
das Gegenteil behauptet und sagt, das ist alles

00:12:45.020 --> 00:12:46.980
Quatsch, weil es gibt genauso viele Dinge, die

00:12:46.980 --> 00:12:48.720
mit Pi schöner aussehen als mit Tau.

00:12:49.420 --> 00:12:50.860
Deshalb ist es nur ein Witz unter

00:12:50.860 --> 00:12:52.520
Mathematikern, wo man Leute leicht

00:12:52.520 --> 00:12:53.900
auf die Palme bringen kann.

00:12:53.900 --> 00:12:55.000
Dann aber einfach nochmal kurz

00:12:55.000 --> 00:12:57.580
die ganze Unbelegung. Was ist denn Pi?

00:12:59.080 --> 00:13:05.280
Pi ist das Verhältnis zwischen dem Radius eines Kreises und der Fläche des Kreises.

00:13:06.720 --> 00:13:13.460
Das heißt, wenn ich einen Kreis mit einem Radius 1 habe, dann hat er die Fläche Pi.

00:13:15.180 --> 00:13:21.140
Und bei den meisten geometrischen Figuren ist es so, dass die Fläche sich relativ leicht berechnet.

00:13:21.140 --> 00:13:24.700
Also wenn ich ein Quadrat habe und das hat Seitenlänge 1, dann hat es die Fläche 1.

00:13:24.700 --> 00:13:27.720
und wenn ich

00:13:27.720 --> 00:13:29.780
ein Dreieck habe, dann hat es die Fläche

00:13:29.780 --> 00:13:30.760
1,5 mal 1.

00:13:31.360 --> 00:13:32.940
Dann gibt es irgendwelche ganz leichten Formeln.

00:13:33.040 --> 00:13:34.380
Beim Kreis ist es leider anders.

00:13:35.000 --> 00:13:36.740
Da kommt eben die Zahl Pi raus

00:13:36.740 --> 00:13:39.080
und die Zahl Pi ist eine transzendente Zahl.

00:13:40.420 --> 00:13:41.620
Das heißt, die ist eine

00:13:41.620 --> 00:13:43.880
nicht-rationale Zahl. Es gibt keinen Bruch,

00:13:44.600 --> 00:13:45.160
der Pi

00:13:45.160 --> 00:13:47.220
korrekt darstellen kann.

00:13:47.900 --> 00:13:49.860
Es ist auch eine transzendente Zahl,

00:13:49.960 --> 00:13:51.860
das heißt, die ist nicht algebraisch.

00:13:51.940 --> 00:13:53.960
Das heißt, es gibt auch keinen Polynom,

00:13:53.960 --> 00:13:55.680
was Pi als Lösung hat

00:13:55.680 --> 00:13:57.760
und das macht es zu einer ganz besonderen Zahl

00:13:57.760 --> 00:13:59.860
weil die Zahlen, die man normalerweise so kennt

00:13:59.860 --> 00:14:02.020
Wurzel 2 und Wurzel 3 und Wurzel 5

00:14:02.020 --> 00:14:03.900
und Wurzel 7 und

00:14:03.900 --> 00:14:05.980
2 mal Wurzel 5 halbe

00:14:05.980 --> 00:14:08.000
und so weiter, das sind alles algebraische

00:14:08.000 --> 00:14:09.820
Zahlen, das heißt die sind Lösung von

00:14:09.820 --> 00:14:11.640
irgendeinem Polynom und die haben dann eben diese

00:14:11.640 --> 00:14:13.960
Eigenschaft, dass ich die in dieses Polynom

00:14:13.960 --> 00:14:15.440
einsetzen kann und dann kommt 0 raus

00:14:15.440 --> 00:14:18.320
Das geht mit Pi nicht

00:14:18.320 --> 00:14:19.780
Es gibt für Pi kein Polynom

00:14:19.780 --> 00:14:21.700
was Pi als Lösung hat

00:14:21.700 --> 00:14:23.560
und deshalb ist es eine ganz besondere Zahl.

00:14:23.640 --> 00:14:25.500
Nee, es gibt keins. Gibt es nicht? Also ist bewiesen, dass es nicht gibt?

00:14:26.120 --> 00:14:27.440
Ja, weil es transzendent ist.

00:14:28.100 --> 00:14:29.540
Und tatsächlich der Beweis, dass Pi

00:14:29.540 --> 00:14:31.560
transzendent ist, ist eine sehr schwierige Sache.

00:14:32.820 --> 00:14:33.720
Ist auch noch gar

00:14:33.720 --> 00:14:34.780
nicht ungeheuer lange her.

00:14:37.160 --> 00:14:37.780
Aber das

00:14:37.780 --> 00:14:39.160
Ergebnis ist eben sehr wichtig, weil

00:14:39.160 --> 00:14:41.700
das eine Klasse von Zahlen ist, von denen es

00:14:41.700 --> 00:14:43.840
wesentlich

00:14:43.840 --> 00:14:45.220
mehr gibt als von anderen Zahlen,

00:14:45.640 --> 00:14:47.720
die für uns aber aus unserem menschlichen Verständnis her

00:14:47.720 --> 00:14:49.720
sehr schwer erreichbar sind, weil wir eben

00:14:49.720 --> 00:14:51.640
Brüche gewohnt sind und Wurzeln von

00:14:51.640 --> 00:14:52.980
irgendwas, also

00:14:52.980 --> 00:14:55.860
algebraische Zahlen. Das sind aber tatsächlich

00:14:55.860 --> 00:14:57.700
so auf eine gewisse Art und Weise

00:14:57.700 --> 00:14:59.580
die wenigsten reellen Zahlen.

00:15:03.120 --> 00:15:03.940
Es ist eben

00:15:03.940 --> 00:15:06.000
eins von diesen bekannten Beispielen

00:15:06.000 --> 00:15:07.800
für eine Zahl, die sich anders verhält, als

00:15:07.800 --> 00:15:09.820
man denkt. Und deshalb ist

00:15:09.820 --> 00:15:11.620
sie in der Mathematik sehr wichtig, weil sie eben

00:15:11.620 --> 00:15:13.640
eine transzendente

00:15:13.640 --> 00:15:15.640
Zahl ist. Es gibt

00:15:15.640 --> 00:15:17.160
noch ähnliche Zahlen, es gibt noch E.

00:15:18.480 --> 00:15:19.540
Die Euler'sche Zahl?

00:15:19.540 --> 00:15:22.800
Die Euler'sche Zahl, genau, und die hat nicht ganz so eine einfache Erklärung.

00:15:22.860 --> 00:15:23.900
Sehr, sehr gut, Dominik.

00:15:24.940 --> 00:15:25.260
Ja!

00:15:27.760 --> 00:15:30.900
Die hat nicht ganz so einfache Eigenschaften, die ist nicht ganz so einfach zu erklären,

00:15:31.340 --> 00:15:35.440
aber ist auch transzendent, ist auch, man weiß auch nicht, ob sie normal ist,

00:15:36.200 --> 00:15:39.400
man weiß auch da die Verteilung der Sachen alle nicht.

00:15:40.220 --> 00:15:43.060
Das heißt, diese Zahlen, die sind sehr, sehr schwer in den Griff zu kriegen,

00:15:43.200 --> 00:15:44.940
obwohl es eigentlich sehr viele davon gibt.

00:15:44.940 --> 00:15:50.140
und ja, das ist halt leider so.

00:15:51.220 --> 00:15:53.940
Ja, und genau, also in gewisser Weise

00:15:53.940 --> 00:15:55.540
haben die jetzt auch was mit eben

00:15:55.540 --> 00:15:58.200
diesen ganzen theoretischen Informatikgeschichten

00:15:58.200 --> 00:15:59.960
zu tun, weil sie sozusagen in gewisser

00:15:59.960 --> 00:16:00.320
Weise

00:16:00.320 --> 00:16:03.680
berechnungstechnisch

00:16:03.680 --> 00:16:05.840
irreduzierbar sind, sozusagen.

00:16:06.020 --> 00:16:06.920
Also man kann halt nicht,

00:16:07.840 --> 00:16:09.280
eben, man muss es halt...

00:16:09.280 --> 00:16:11.660
Man muss sie tatsächlich ausrechnen,

00:16:11.780 --> 00:16:14.580
sonst kriegt man sie

00:16:14.580 --> 00:16:16.600
nicht in den Griff. Und das Problem ist, das ist halt

00:16:16.600 --> 00:16:18.840
teuer. Die auszurechnen, da muss man halt...

00:16:18.840 --> 00:16:20.780
Ja, das ist ja auch so ein bisschen ein Sport,

00:16:20.940 --> 00:16:22.480
dass die meiste

00:16:22.480 --> 00:16:24.600
Anzahl Stellen von Pi ausgerechnet ist.

00:16:24.600 --> 00:16:26.320
Ja, gab es sonst irgendwie wieder die Nachricht, dass da

00:16:26.320 --> 00:16:28.540
die 60 Millionen Stellen oder weiß ich nicht

00:16:28.540 --> 00:16:30.400
oder noch mehr, ich weiß gar nicht genau, wie viele...

00:16:30.400 --> 00:16:32.780
Genau, also da kommt man dann halt wirklich sehr schnell in solche

00:16:32.780 --> 00:16:34.600
Bereiche rein, wo es dann gar nicht mehr so sehr

00:16:34.600 --> 00:16:36.420
um Prozessorleistung geht und gar nicht so sehr um

00:16:36.420 --> 00:16:38.340
Smarthand geht, sondern da kriegst du dann so richtig die

00:16:38.340 --> 00:16:40.520
Big Data Probleme. Wie schaffst du das auf einer Zahl

00:16:40.520 --> 00:16:42.100
zu operieren, die 60 Milliarden Stellen?

00:16:42.240 --> 00:16:44.440
Ich habe mich mal kennengelernt, der hat sich als Hobby

00:16:44.440 --> 00:16:46.420
Aufgabe gemacht, Nachkommastellen von Pi

00:16:46.420 --> 00:16:48.200
auswendig zu lehren, hat glaube ich die ersten 250

00:16:48.200 --> 00:16:48.980
auch sagen können.

00:16:50.100 --> 00:16:52.420
Okay, das ist schon mal nicht so schlecht. Ja, wir haben doch alle so einen Freund,

00:16:52.520 --> 00:16:52.620
oder?

00:16:52.620 --> 00:16:52.760
Ja,

00:16:54.680 --> 00:16:58.440
es gibt auch irgendwie die Gesellschaft der

00:16:58.440 --> 00:17:00.580
Freunde von Pi, glaube ich, und da muss man

00:17:00.580 --> 00:17:02.640
irgendwie die ersten 100 Stellen auswendig können oder so,

00:17:02.780 --> 00:17:03.880
damit man aufgenommen werden kann.

00:17:05.320 --> 00:17:06.480
Vielleicht nochmal 142 von NMI,

00:17:06.680 --> 00:17:06.960
geht das weiter?

00:17:09.820 --> 00:17:11.000
Ja, 3,1,

00:17:11.080 --> 00:17:12.380
das ist schon ungefähr richtig.

00:17:12.380 --> 00:17:18.400
Wie du sagst, da gibt es auch so interessante Fälle, wo dann in irgendeinem Cut-Programm oder so

00:17:18.400 --> 00:17:23.180
Das ist eine der bösesten logischen Bomben, von denen ich bisher so gehört habe

00:17:23.180 --> 00:17:26.640
Dass jemand da den Wert von Pi irgendwie subtil verändert hat

00:17:26.640 --> 00:17:29.920
So eher sechste, siebte Nachkommastelle oder sowas

00:17:29.920 --> 00:17:34.520
Und dann waren halt alle Baupläne der letzten zehn Jahre alle falsch

00:17:34.520 --> 00:17:37.040
Sehr schön

00:17:37.040 --> 00:17:40.340
Kann man 3,12 sagen oder ist das auch immer falsch?

00:17:40.340 --> 00:17:43.460
3,1415

00:17:43.460 --> 00:17:45.340
ist so die

00:17:45.340 --> 00:17:47.520
Standardweise, aber es ist eigentlich falsch, weil es geht ja mit

00:17:47.520 --> 00:17:48.040
9 weiter.

00:17:50.800 --> 00:17:51.500
Wenn man Pi

00:17:51.500 --> 00:17:53.560
ich glaube auf 15 Stellen genau hat, dann

00:17:53.560 --> 00:17:55.400
reicht es schon für alle physikalischen Sachen aus, weil

00:17:55.400 --> 00:17:57.480
es dann irgendwie schon im Nanometerbereich ist und

00:17:57.480 --> 00:17:58.980
so genau kannst du halt nicht mehr.

00:17:59.680 --> 00:18:01.300
Und 3,142 ist zu grob noch

00:18:01.300 --> 00:18:01.800
für sowas?

00:18:02.960 --> 00:18:04.840
Ja, da hast du halt, wenn du

00:18:04.840 --> 00:18:07.420
einen Kreis machst, der 10 Meter im Durchmesser

00:18:07.420 --> 00:18:09.560
hat, hast du halt eine Abweichung

00:18:09.560 --> 00:18:11.360
von einem Prozent. Also das ist dann schon

00:18:11.360 --> 00:18:15.140
eine ganze Menge.

00:18:19.180 --> 00:18:19.660
Jede

00:18:19.660 --> 00:18:21.700
Programmiersprache hat eine konstante

00:18:21.700 --> 00:18:23.600
eingebaut, die Pi heißt, Python übrigens

00:18:23.600 --> 00:18:25.840
auch, math.py

00:18:25.840 --> 00:18:27.720
und die hat

00:18:27.720 --> 00:18:29.580
mehr Stellen, als man je in seinem

00:18:29.580 --> 00:18:30.280
Leben brauchen wird.

00:18:31.880 --> 00:18:33.800
Deshalb, völlig ausreichend.

00:18:33.880 --> 00:18:35.500
Du hast gerade einen Bogen zu Python

00:18:35.500 --> 00:18:37.540
gesagt, ich bin begeistert. Ja, wunderbar, oder?

00:18:37.540 --> 00:18:39.400
Ja, sollten wir vielleicht irgendwie mal zurückkommen.

00:18:39.560 --> 00:18:42.800
Das wird wieder so völlig unvorhergesehen, aber ich finde das eigentlich ganz interessant.

00:18:42.800 --> 00:18:44.760
Das sollte doch heute eine sehr interessante Episode sein, oder?

00:18:46.340 --> 00:18:48.200
Ja, da bist du die Leute halt durch.

00:18:48.960 --> 00:18:53.180
Wenn man in die Möhre ran will, muss man auch ab und zu mal, keine Ahnung.

00:18:54.140 --> 00:18:55.760
Man muss ja erst ausgraben, die Möhre.

00:18:56.040 --> 00:18:56.480
Ja, rotten.

00:18:58.600 --> 00:19:00.480
Gibt es noch was an News?

00:19:00.480 --> 00:19:03.740
Ja, mit einem News, ich weiß nicht genau, ist irgendwas Interessantes passiert?

00:19:04.840 --> 00:19:08.480
Django ist jetzt gerade die Prerelease-Kandidatin.

00:19:08.480 --> 00:19:10.400
4.0 ist der

00:19:10.400 --> 00:19:11.220
Pre-Release-Aufkommen.

00:19:11.220 --> 00:19:11.920
Das hatten wir schon.

00:19:12.600 --> 00:19:14.300
Ja, das letzte Mal hatten wir Alpha.

00:19:14.860 --> 00:19:16.900
Ansonsten weiß ich nicht, gibt es eigentlich nichts.

00:19:16.920 --> 00:19:19.180
Python 3.10 ist immer noch aktuell und immer noch

00:19:19.180 --> 00:19:21.420
cool. Ja, meine letzte Folge hieß Python 3.10,

00:19:21.520 --> 00:19:22.500
Jochen. Ja, gut.

00:19:22.980 --> 00:19:25.180
Dann ist es trotzdem, ich wiederhole mich,

00:19:25.240 --> 00:19:26.580
es ist immer noch aktuell und immer noch cool.

00:19:27.740 --> 00:19:27.760
Ja.

00:19:29.520 --> 00:19:29.920
Ja.

00:19:31.260 --> 00:19:32.940
Es gab ganz lette

00:19:32.940 --> 00:19:35.080
Artikel, einmal so über Python

00:19:35.080 --> 00:19:36.640
im Bankenumfeld gab es einen, der

00:19:36.640 --> 00:19:38.380
mit dem Bank-Python.

00:19:38.620 --> 00:19:39.100
Großartig.

00:19:39.240 --> 00:19:39.580
Wie, was?

00:19:41.240 --> 00:19:43.020
Es gibt wohl eine Variante von Python,

00:19:43.140 --> 00:19:45.680
die bei großen amerikanischen Banken eingesetzt wird

00:19:45.680 --> 00:19:48.440
und die hat gewisse spannende Eigenschaften,

00:19:48.500 --> 00:19:48.840
sagen wir mal so.

00:19:49.020 --> 00:19:49.500
Wie heißt die?

00:19:49.500 --> 00:19:53.280
Sie ist beschrieben als ein Fork des kompletten Bank-Python.

00:19:53.560 --> 00:19:55.060
Bank-Python, jetzt habe ich es auf mich an.

00:19:55.520 --> 00:19:56.460
Bank-Python.

00:19:56.880 --> 00:19:57.240
Ja, okay.

00:19:58.440 --> 00:19:58.800
Großartig.

00:19:59.480 --> 00:20:02.900
Ich habe diesen Artikel gelesen und ich fand den super.

00:20:03.420 --> 00:20:03.920
Ja, ich auch.

00:20:04.160 --> 00:20:05.620
Und da sind auch so ein paar Ideen drin,

00:20:05.620 --> 00:20:06.780
wo ich mir denke, ja,

00:20:07.500 --> 00:20:09.800
da könnte man versuchen, sich eine Scheibe abzuschneiden.

00:20:09.880 --> 00:20:11.540
An Oral History of Bank Python.

00:20:11.840 --> 00:20:12.200
Genau.

00:20:13.860 --> 00:20:14.380
L. Peterson.

00:20:16.160 --> 00:20:17.820
Es sind auch

00:20:17.820 --> 00:20:19.540
ganz viele Sachen drin, wo man sich denkt, naja, gut,

00:20:19.660 --> 00:20:21.520
okay, gut, die sind halt in dem Jahr, in dem sie

00:20:21.520 --> 00:20:23.340
den Fork gemacht haben, stehen geblieben und das war

00:20:23.340 --> 00:20:24.980
vermutlich 1994 und

00:20:24.980 --> 00:20:27.500
das ist jetzt halt so.

00:20:29.140 --> 00:20:29.700
Aber es gibt

00:20:29.700 --> 00:20:31.200
auch ein paar Sachen, die eigentlich sehr cool sind.

00:20:31.380 --> 00:20:33.360
Also dieser globale State und dieses

00:20:33.360 --> 00:20:35.400
globale Deployment und der Code

00:20:35.400 --> 00:20:37.540
ist in der Datenbank und du kannst alles anfassen

00:20:37.540 --> 00:20:38.580
und...

00:20:38.580 --> 00:20:38.960
Barbara.

00:20:39.780 --> 00:20:42.680
...sind schon viele Dinge, die man sich mal überlegen könnte.

00:20:44.540 --> 00:20:44.720
Ja.

00:20:44.720 --> 00:20:46.880
Jochen, den hast du vermutlich in meinen Weaknots gefunden, oder?

00:20:46.880 --> 00:20:47.420
Ja, genau.

00:20:47.720 --> 00:20:49.620
Ein bisschen Werbung machen für eigene Sachen.

00:20:49.940 --> 00:20:51.160
Ja, richtig, genau.

00:20:53.080 --> 00:20:55.320
Ja, ich hänge mit meinen Weaknots wieder total hinterher.

00:20:55.440 --> 00:20:57.080
Ich muss da unbedingt was machen, aber ich habe irgendwie

00:20:57.080 --> 00:20:58.360
keine Zeit, das ist schrecklich.

00:20:59.280 --> 00:21:01.360
Das muss Teil des Prozesses werden.

00:21:01.400 --> 00:21:01.600
Ja.

00:21:01.740 --> 00:21:02.980
Das muss eine Gewohnheit werden.

00:21:03.100 --> 00:21:04.020
Hast du hier nichts zu tun, Johannes?

00:21:04.020 --> 00:21:11.180
Ich habe genügend zu tun, aber ich habe immer noch genügend Freizeit, dass ich Reddit lesen kann.

00:21:11.320 --> 00:21:14.160
Und wenn ich statt Reddit Weaknotes schreibe, dann ist das doch ein Gewinn für uns alle.

00:21:14.760 --> 00:21:15.260
Ja, das stimmt.

00:21:16.880 --> 00:21:18.580
Ja, so viel Freizeit habe ich leider nicht.

00:21:21.580 --> 00:21:27.260
Warte mal, Dominik, haben wir nicht erst Montagabend von 20 bis 24 Uhr Computerspiele gespielt?

00:21:27.680 --> 00:21:28.360
Ist das Freizeit?

00:21:29.980 --> 00:21:31.180
Nein, das ist Socializing.

00:21:31.180 --> 00:21:33.560
Und es war erst um 20.36 Uhr haben wir angefangen.

00:21:34.020 --> 00:21:35.420
Oh, ja gut, okay, dann.

00:21:35.760 --> 00:21:38.000
Ja, und das, was wir lange gespielt haben, hat mich natürlich

00:21:38.000 --> 00:21:40.360
nächsten Morgen noch fast gekostet.

00:21:40.580 --> 00:21:41.040
Das ist ja auch klar.

00:21:42.700 --> 00:21:44.220
Wir haben übrigens gespielt Max

00:21:44.220 --> 00:21:46.040
Mechanized Assault and Exploration.

00:21:46.940 --> 00:21:47.300
Okay.

00:21:48.300 --> 00:21:49.940
Das ist ein Spiel, das kam das erste Mal,

00:21:50.020 --> 00:21:51.580
ich weiß nicht, bei 98 raus.

00:21:52.720 --> 00:21:53.760
Und so sieht's auch aus.

00:21:55.440 --> 00:21:56.420
Es ist trotzdem

00:21:56.420 --> 00:21:58.700
super. Es gibt eine, ja, ein MaxR.

00:21:58.880 --> 00:22:00.080
Das ist eine Charakterversion. Wenn man die

00:22:00.080 --> 00:22:02.660
Original, Anführungszeichen

00:22:02.660 --> 00:22:04.500
Originalvideos und Sprites und sowas noch hat.

00:22:05.080 --> 00:22:06.100
Das sieht gar nicht so schlecht aus, finde ich.

00:22:08.340 --> 00:22:10.500
Naja, weil das Interface, also das ist

00:22:10.500 --> 00:22:12.420
oft so, diese alten Sachen haben

00:22:12.420 --> 00:22:14.220
oft gute Ideen, aber schlechte Interfaces.

00:22:14.220 --> 00:22:16.560
Und das RTS ist eine unheimliche Komplexität.

00:22:16.660 --> 00:22:18.360
Das ist aus der 96 schon, ehrlich.

00:22:19.360 --> 00:22:19.720
So alt.

00:22:20.300 --> 00:22:21.280
Fast so alt wie ich.

00:22:22.100 --> 00:22:24.480
Wir haben es geliebt. Ja, und wir spielen das auch übrigens noch weiter,

00:22:24.580 --> 00:22:25.040
allerdings, Johannes.

00:22:26.180 --> 00:22:28.320
Ich dachte, wir spielen noch andere alte Spiele.

00:22:28.340 --> 00:22:30.160
Ja, das werden wir auch mal schaffen, vielleicht nächstes Jahr.

00:22:30.160 --> 00:22:34.600
Na gut, wie war das gleich noch mit Python?

00:22:34.820 --> 00:22:36.560
Ja genau, dann machen wir jetzt

00:22:36.560 --> 00:22:38.980
Python Dictionaries und so, ne?

00:22:39.980 --> 00:22:40.180
Ja

00:22:40.180 --> 00:22:42.800
Ihr wolltet heute über Dictionaries sprechen

00:22:42.800 --> 00:22:44.140
Ja, richtig verstanden

00:22:44.140 --> 00:22:46.100
Also was ist denn ein Python Dictionary?

00:22:46.220 --> 00:22:47.620
Ein Wörterbuch, ein

00:22:47.620 --> 00:22:50.040
Mapping von Dingen auf andere Dinge

00:22:50.040 --> 00:22:52.020
Wie verstehst du denn ein Python Dictionary?

00:22:52.200 --> 00:22:54.240
Also ich meine, der Jochen und ich, wir können uns gleich noch

00:22:54.240 --> 00:22:56.220
über die Interna unterhalten und da gibt es viele spannende

00:22:56.220 --> 00:22:57.720
Dinge, die man da besprechen kann

00:22:57.720 --> 00:22:59.980
Aber Dominik, wie siehst du denn ein Python Dictionary?

00:22:59.980 --> 00:23:01.320
Was ist denn für dich ein Python-Dict-Driven?

00:23:01.400 --> 00:23:04.120
Ja, das ist erstmal ein geschweifte, geklammertes,

00:23:04.220 --> 00:23:06.020
definiertes Objekt in Python, also das

00:23:06.020 --> 00:23:07.900
kein Z ist, sondern das eine Zuordnung immer macht von

00:23:07.900 --> 00:23:09.820
einem Key auf einen Wert

00:23:09.820 --> 00:23:11.980
und wo halt der Lookup, also das, wenn man

00:23:11.980 --> 00:23:13.900
nachgucken kann, sehr, sehr schnell geht, weil man schön

00:23:13.900 --> 00:23:15.960
drauf zugreifen kann und dann gibt es direkt

00:23:15.960 --> 00:23:17.900
einen Wert zurück, den es rausschmeißt. Das ist so, dass

00:23:17.900 --> 00:23:19.980
wie im Python-Dict man ihn einfach, glaube ich, schnell benutzt.

00:23:22.060 --> 00:23:23.800
Okay, Zuordnung von einem Key zu einem Wert.

00:23:24.320 --> 00:23:25.580
Das heißt, ich könnte mir jetzt zum Beispiel

00:23:25.580 --> 00:23:27.600
zum Key Dominic

00:23:27.600 --> 00:23:28.860
deine Telefonnummer speichern.

00:23:28.860 --> 00:23:30.420
und dann könntest du das

00:23:30.420 --> 00:23:32.940
Phone Numbers nennen oder sowas und dann machst du das

00:23:32.940 --> 00:23:34.760
gleich mit Jochen noch und ja. Und könnte ich mir aber nicht auch

00:23:34.760 --> 00:23:35.860
deine Adresse dazu merken?

00:23:37.660 --> 00:23:39.020
Ja, aber zu was? Also das ist ja

00:23:39.020 --> 00:23:40.800
die Frage, wie du das strukturieren möchtest.

00:23:41.180 --> 00:23:43.020
Da kann man ja beliebige

00:23:43.020 --> 00:23:44.660
Objekte als Value hinterlegen.

00:23:44.900 --> 00:23:46.700
Nee, das stimmt nicht. Achso, als Value schon, aber

00:23:46.700 --> 00:23:49.000
Key als Key nicht. Nein, aber genau, als Value

00:23:49.000 --> 00:23:51.000
hinterlegen, das heißt, da kannst du natürlich dann... Aber immer nur einen, oder?

00:23:52.500 --> 00:23:53.040
Value, du kannst

00:23:53.040 --> 00:23:53.780
einen Tupel reinpacken.

00:23:54.640 --> 00:23:56.720
Okay, ich kann einen Tupel reinpacken, aber ich könnte mir jetzt nicht

00:23:56.720 --> 00:23:59.000
2 mal zu dir zwei verschiedene Sachen merken.

00:23:59.340 --> 00:24:00.480
Also das müsste ich dann selber machen.

00:24:00.700 --> 00:24:02.700
Nee, tatsächlich. Also ein Key muss es

00:24:02.700 --> 00:24:03.960
unique in einem.

00:24:05.640 --> 00:24:06.900
Weil das ist ja in einem Wörterbuch

00:24:06.900 --> 00:24:08.840
nicht so. Und in einem Telefonbuch ist

00:24:08.840 --> 00:24:09.460
das auch nicht so.

00:24:11.720 --> 00:24:12.960
Das ist so eine

00:24:12.960 --> 00:24:14.960
Sache, die immer... Ich mache gelegentlich Python-Schulungen.

00:24:15.060 --> 00:24:16.760
Übrigens im Dezember wieder. Naja, aber wahrscheinlich

00:24:16.760 --> 00:24:18.920
ist dann so, dass wenn du das Lookup machst und dann Dominik

00:24:18.920 --> 00:24:21.020
nachguckst und dann gibt es verschiedene Dominiks, dann hast du erst eine Liste

00:24:21.020 --> 00:24:22.800
von Dominiks, die du zurückkriegst und in dieser Liste

00:24:22.800 --> 00:24:24.940
stehen dann die einzelnen. Ja, aber ich kriege ja

00:24:24.940 --> 00:24:54.920
und Jochen unterhalten sich über die Programmiersprache Python

00:24:54.940 --> 00:24:56.760
das bekommt, dann ist ja der Zugriff auf ein Einzelmüller genau,

00:24:56.820 --> 00:24:58.120
jetzt ist eigentlich nur eine Ebene tiefer.

00:24:58.980 --> 00:25:00.900
Was ich da so tiefer drin verstanden habe,

00:25:00.960 --> 00:25:03.020
ist, dass du irgendwie halt in den Speicher gemeldet wirst und das deswegen so schnell

00:25:03.020 --> 00:25:04.900
ist, weil er dann einfach dann die Speicheradresse

00:25:04.900 --> 00:25:06.240
nachschauen kann.

00:25:06.860 --> 00:25:08.520
Ja, das ist ja die Magie des Hashtables.

00:25:09.340 --> 00:25:10.840
Das Hashtable, das müssen wir auch gleich nochmal erklären,

00:25:10.900 --> 00:25:11.800
was da ein Hashtable ist.

00:25:13.660 --> 00:25:14.880
Was können denn Keys sein?

00:25:15.040 --> 00:25:16.840
Weißt du das, Dominik? Weißt du das auswendig? Das ist total

00:25:16.840 --> 00:25:18.900
spannend. Wenn ich den

00:25:18.900 --> 00:25:20.760
Jochen frage, da weiß ich, dass der das weiß.

00:25:21.020 --> 00:25:22.840
Ja, also ich weiß, was Strings

00:25:22.840 --> 00:25:24.660
sein können, was Zupels sein können.

00:25:24.660 --> 00:25:26.920
Ich weiß, dass es Integers sein können

00:25:26.920 --> 00:25:28.400
Noch was?

00:25:28.660 --> 00:25:29.220
Strings auch?

00:25:29.420 --> 00:25:30.340
Ja, genau, Strings habe ich ja gesagt

00:25:30.340 --> 00:25:32.360
Kann es auch ein Dictionary sein?

00:25:33.000 --> 00:25:33.180
Nee

00:25:33.180 --> 00:25:36.040
Doch, sind die hashable?

00:25:36.560 --> 00:25:37.000
Und eine Liste?

00:25:37.720 --> 00:25:38.620
Sind die hashable?

00:25:38.780 --> 00:25:40.260
Das war schon eine sehr, sehr gute Frage

00:25:40.260 --> 00:25:41.240
Die hashable

00:25:41.240 --> 00:25:44.540
Das frage ich nicht, Dominik

00:25:44.540 --> 00:25:45.540
Das weiß ich nicht

00:25:45.540 --> 00:25:47.820
Die Regel ist

00:25:47.820 --> 00:25:49.240
Tatsächlich ganz interessant

00:25:49.240 --> 00:25:53.300
Ein Key von einem Dictionary muss etwas sein, was sich nicht verändern kann

00:25:53.300 --> 00:25:55.600
Herrschable sind diese Typen alle

00:25:55.600 --> 00:25:57.860
aber der Herrsch kann sich verändern

00:25:57.860 --> 00:25:59.900
wenn sich das Objekt verändert

00:25:59.900 --> 00:26:02.000
und deshalb

00:26:02.000 --> 00:26:03.240
gibt es für Dictionary

00:26:03.240 --> 00:26:04.720
für Liste gibt es Tuple

00:26:04.720 --> 00:26:07.660
ich kann eine Liste nicht als Key verwenden, weil die sich verändern kann

00:26:07.660 --> 00:26:21.993
ich kann aber ein Tuple verwenden und ein Tuple ist ja im Wesentlichen nichts anderes als eine Liste die sich nicht ver kann F Dictionaries und f Sets gibt es einen Datentyp der hei FrozenDict und FrozenSet

00:26:21.993 --> 00:26:25.732
und das sind im Wesentlichen Dictionaries und Sets,

00:26:26.133 --> 00:26:29.232
die sich nicht verändern können. Das heißt, wenn ich ein Set

00:26:29.232 --> 00:26:32.773
als Key in einem Dictionary haben möchte, muss ich ein FrozenSet

00:26:32.773 --> 00:26:37.332
draus machen. Und das ist auch so ein bisschen der einzige Sinn

00:26:37.332 --> 00:26:39.072
für diese beiden Datentypen, dass du eben

00:26:39.072 --> 00:26:41.513
ein unveränderliches Dictionary oder ein unveränderliches

00:26:41.513 --> 00:26:43.212
Set haben kannst, um sie als

00:26:43.212 --> 00:26:44.673
Key in einem Dictionary zu verwenden.

00:26:44.893 --> 00:26:46.952
Und das machen wir, weil man ein Lookup haben will nach dem Motto,

00:26:46.993 --> 00:26:48.293
wenn das da drin ist, dann gib mir dies.

00:26:50.493 --> 00:26:51.293
Ja, oder

00:26:51.293 --> 00:26:53.273
halt auch, wenn man sie wieder in ein Set packen möchte,

00:26:53.373 --> 00:26:55.112
weil man möchte, dass da Schnittmengen

00:26:55.112 --> 00:26:57.133
von Sachen bilden können oder feststellen

00:26:57.133 --> 00:26:58.952
können, ob man das schon mal gesehen hat oder so.

00:26:59.232 --> 00:27:01.433
Ja, oder die Reihenfolge spielt keine Rolle.

00:27:02.232 --> 00:27:02.673
Das ist ja,

00:27:02.873 --> 00:27:04.232
als Mathematiker

00:27:04.232 --> 00:27:06.852
ist ein Set wie eine Liste ohne Reihenfolge.

00:27:07.332 --> 00:27:09.332
und die interessante Reihenfolge

00:27:09.332 --> 00:27:11.212
müssen wir uns auch merken, weil OrderedDict und sowas, weil das ja

00:27:11.212 --> 00:27:12.812
früher nicht so ging, das glaube ich default ist.

00:27:12.832 --> 00:27:14.913
Ja, muss man inzwischen nicht mehr. Früher musste man sich

00:27:14.913 --> 00:27:17.013
OrderedDict immer merken, aber inzwischen sind alle Dicts

00:27:17.013 --> 00:27:18.653
OrderedDicts, deshalb den Typ

00:27:18.653 --> 00:27:21.293
OrderedDict gibt es noch, aber der macht irgendwie gar nichts mehr.

00:27:21.433 --> 00:27:23.112
Ja, doch, doch, doch. Der hat noch einen reversed, aber

00:27:23.112 --> 00:27:24.913
das ist alles. Ja, doch, der hat, die verhalten sich

00:27:24.913 --> 00:27:27.112
unterschiedlich. Also

00:27:27.112 --> 00:27:29.033
tatsächlich macht das durchaus Sinn.

00:27:29.153 --> 00:27:30.673
Also man muss einfach mal, das ist vielleicht so ein bisschen,

00:27:30.832 --> 00:27:33.192
vielleicht sollte man das nicht müssen, aber je nachdem

00:27:33.192 --> 00:27:34.393
wie man Dict verhält,

00:27:35.112 --> 00:27:37.072
wie sich das Dict verhalten

00:27:37.072 --> 00:27:38.952
soll, das man verwendet. Also wenn man zum Beispiel

00:27:38.952 --> 00:27:41.092
viele Insatz hat von Keys,

00:27:41.732 --> 00:27:43.033
dann ist es besser, OrderDict

00:27:43.033 --> 00:27:44.612
zu nehmen statt dem

00:27:44.612 --> 00:27:46.933
Default-Ding. Also es gibt da

00:27:46.933 --> 00:27:48.913
tatsächlich subtile... Warum, Jochen? Wie wächst das denn?

00:27:48.933 --> 00:27:49.893
Wie wächst denn ein Dictionary?

00:27:50.793 --> 00:27:52.732
Genau. Ich habe es vorhin nachgeguckt.

00:27:54.332 --> 00:27:55.373
Soll ich es euch verraten?

00:27:55.393 --> 00:27:56.092
Ja, verraten.

00:27:56.092 --> 00:27:56.832
Ich hatte eh mal.

00:27:59.092 --> 00:28:00.273
Ein Dictionary fängt an

00:28:00.273 --> 00:28:01.633
mit null Buckets.

00:28:01.793 --> 00:28:04.072
Wenn du ein leeres Dictionary hast, das ist tatsächlich speziell.

00:28:04.133 --> 00:28:06.293
Das hat null Buckets, verbraucht 64 Byte.

00:28:07.072 --> 00:28:13.592
Das ist übrigens unterschiedlich zwischen 32 und 64 Bit Maschinen, aber ich glaube, wir sind alle inzwischen auf 64 Bit angewandt.

00:28:14.533 --> 00:28:17.673
Sobald ich eins einfüge, hat es acht Buckets.

00:28:18.793 --> 00:28:22.653
Buckets sind Speicherplätze, erklären wir gleich noch, weil es eben zu dieser Hashmap gehört.

00:28:23.612 --> 00:28:26.812
Und dann verdoppelt es sich jedes Mal, wenn es zwei Drittel voll ist.

00:28:29.153 --> 00:28:32.312
Der Speicherbereich wird vorreserviert für alles, was wir reinhaben.

00:28:32.312 --> 00:28:54.693
Genau, diese Datenstruktur, die heißt HashMap und die braucht leeren Platz, die kann nicht 100% voll sein und deshalb machen die halt immer eine Verdopplung, Verdopplung ist so eine Wachstumsstrategie, die gut funktioniert, auch bei Resizable Listen, die verdoppeln sich auch, das ist einfach so eine Wachstumsstrategie, die so eine gute Balance ist.

00:28:54.693 --> 00:28:56.873
am besten wäre es, glaube ich, wenn man Wurzel 3

00:28:56.873 --> 00:28:59.052
hätte als Wachstumsfaktor, das ist 2,3

00:28:59.052 --> 00:29:01.112
oder irgendwas, aber dann hast du die ganze Zeit

00:29:01.112 --> 00:29:02.472
krumme Zahlen und das ist auch nicht gut.

00:29:03.693 --> 00:29:04.952
Ja, stimmt, das ist bei dem

00:29:04.952 --> 00:29:06.533
Array-Modul,

00:29:06.753 --> 00:29:08.993
bei dem eingebauten, das habe ich

00:29:08.993 --> 00:29:10.653
mir mal näher angeguckt aus Gründen

00:29:10.653 --> 00:29:12.993
und da ist das auch so,

00:29:13.393 --> 00:29:14.773
weil das ist ja auch interessant,

00:29:14.893 --> 00:29:17.112
das ist ja quasi sozusagen

00:29:17.112 --> 00:29:18.013
wie eine Listefluss halt

00:29:18.013 --> 00:29:20.753
statisch gefühlt, quasi, ja,

00:29:21.033 --> 00:29:22.592
und man verbraucht tatsächlich nur den Platz,

00:29:22.592 --> 00:29:24.072
also für den Integer braucht man halt nur,

00:29:24.072 --> 00:29:25.852
je nachdem, das war natürlich bei 64-Bit.

00:29:26.592 --> 00:29:27.972
Und da ist es auch so,

00:29:28.293 --> 00:29:29.693
da kann man Append sagen hinten

00:29:29.693 --> 00:29:31.952
und wenn man da was hinzufügt und

00:29:31.952 --> 00:29:33.913
der Bereich der Memory-View innen

00:29:33.913 --> 00:29:35.972
drin ist erschöpft,

00:29:36.153 --> 00:29:37.572
dann verdoppelt sich das halt auch immer.

00:29:38.472 --> 00:29:39.993
Ja, das ist eine klassische Strategie.

00:29:40.493 --> 00:29:42.133
Okay, das bedeutet aber halt auch, man darf

00:29:42.133 --> 00:29:43.732
sich nicht darüber

00:29:43.732 --> 00:29:46.072
im Unklaren sein, so ein Dict-Journal verbraucht

00:29:46.072 --> 00:29:48.153
relativ viel Speicherplatz. Wenn ich einen Eintrag

00:29:48.153 --> 00:29:49.812
in ein Dict-Journal reintue, dann hat es direkt

00:29:49.812 --> 00:29:52.232
240-Byte-Hauptspeicher verbraucht.

00:29:52.232 --> 00:29:54.273
Das ist nicht ganz ohne

00:29:54.273 --> 00:29:56.653
Wenn ich 6 Einträge

00:29:56.653 --> 00:29:58.873
reintue, hat es direkt 480 Byte

00:29:58.873 --> 00:29:59.212
verbraucht

00:29:59.212 --> 00:30:02.433
Also es verbraucht relativ

00:30:02.433 --> 00:30:03.633
viel Speicherplatz

00:30:03.633 --> 00:30:06.513
Es geht hier nicht um Effizienz, sondern es geht um

00:30:06.513 --> 00:30:06.993
Schnelligkeit

00:30:06.993 --> 00:30:10.373
Und diese Schnelligkeit, die hat

00:30:10.373 --> 00:30:12.013
Dominik schon angesprochen, es ist sehr schnell

00:30:12.013 --> 00:30:14.253
Das heißt, es ist O von 1

00:30:14.253 --> 00:30:16.633
Jeder Zugriff dauert immer gleich

00:30:16.633 --> 00:30:17.633
lang, amortisiert

00:30:17.633 --> 00:30:20.033
amortisiert über die Verdopplungen

00:30:20.033 --> 00:30:24.452
weil wenn ich nämlich ein Dictionary habe, was sehr viele Einträge hat

00:30:24.452 --> 00:30:26.472
und das verdoppelt sich dann, dann muss dieses Dictionary

00:30:26.472 --> 00:30:27.793
angepasst werden

00:30:27.793 --> 00:30:29.753
und eventuell verschoben werden

00:30:29.753 --> 00:30:31.673
dann

00:30:31.673 --> 00:30:34.513
kann es schon sein, dass es eine Weile dauert

00:30:34.513 --> 00:30:36.493
aber amortisiert ist es auch von 1

00:30:36.493 --> 00:30:38.133
jeder Zugriff, das heißt jeder Zugriff dauert

00:30:38.133 --> 00:30:39.153
im Schnitt gleich schnell

00:30:39.153 --> 00:30:41.253
also amortisiert bedeutet für Dictionary der gleichen

00:30:41.253 --> 00:30:42.673
Länge?

00:30:42.693 --> 00:30:43.653
Nee, das bedeutet im Schnitt

00:30:43.653 --> 00:30:46.472
im Durchschnitt bedeutet das

00:30:46.472 --> 00:30:49.253
jeder Zugriff braucht ungefähr gleich lang

00:30:49.253 --> 00:30:50.452
und das ist eine konstante Zahl.

00:30:51.812 --> 00:30:53.293
Es gibt einzelne, die dauern ein bisschen länger.

00:30:53.312 --> 00:30:55.572
Ich habe diesen Worttransfer von amortisiert auf dem Schnitt hinbekommen.

00:30:57.033 --> 00:30:59.633
Wenn du eine große Anzahl

00:30:59.633 --> 00:31:01.193
Zugriffe machst, dann

00:31:01.193 --> 00:31:02.773
ist die

00:31:02.773 --> 00:31:05.133
Dauer

00:31:05.133 --> 00:31:07.033
so, als ob du eine konstante

00:31:07.033 --> 00:31:09.033
Okay, genau, weil das Umbauen quasi

00:31:09.033 --> 00:31:10.712
Grenzwert Null hat.

00:31:11.312 --> 00:31:13.352
Das Umbauen passiert selten genug.

00:31:13.832 --> 00:31:15.013
Genau, dass es Grenzwert Null hat.

00:31:16.513 --> 00:31:17.773
Deswegen wird es amortisiert.

00:31:17.773 --> 00:31:18.013
Okay.

00:31:19.253 --> 00:31:22.812
Also O von 1. Also O von 1 bedeutet, es ist kein Problem.

00:31:23.193 --> 00:31:24.773
Genau, O von 1. Wir O von 1 schreiben.

00:31:25.153 --> 00:31:27.633
Also wenn ich ein Element einfüge, dann dauert es O von 1.

00:31:27.812 --> 00:31:30.332
Und wenn ich ein Element rauslese, dauert es auch O von 1.

00:31:30.413 --> 00:31:31.673
Und beim Lesen ist es immer O von 1.

00:31:31.793 --> 00:31:34.052
Also das ist nicht nur amortisiertes O von 1, sondern das ist O von 1.

00:31:34.212 --> 00:31:36.373
Also das heißt tatsächlich, um nochmal einhören,

00:31:37.112 --> 00:31:38.072
das so ein bisschen näher zu bringen,

00:31:38.173 --> 00:31:41.193
dieser Zeitnotation, Big O, noch nicht so viel anfangen.

00:31:41.352 --> 00:31:44.052
O von 1 bedeutet, es dauert quasi keine Zeit, das zu tun.

00:31:44.572 --> 00:31:44.832
Doch, doch.

00:31:44.832 --> 00:31:45.653
Es dauert immer gleich lang.

00:31:46.653 --> 00:31:48.352
Es ändert sich mit der Menge.

00:31:48.352 --> 00:31:50.013
der, also normalerweise, wenn du jetzt sagen,

00:31:50.332 --> 00:31:52.493
O von 1 im Vergleich zu O von N

00:31:52.493 --> 00:31:53.832
ist jetzt, bedeutet

00:31:53.832 --> 00:31:56.033
das sozusagen, wenn deine

00:31:56.033 --> 00:31:58.352
Eingabedatenmenge

00:31:59.452 --> 00:32:00.373
halt nicht

00:32:00.373 --> 00:32:02.352
N ist, dann wenn du eine Hashmap

00:32:02.352 --> 00:32:04.572
hast, dann ist es halt immer noch O von, ist immer noch konstant.

00:32:04.712 --> 00:32:06.332
Genau, aber das wäre... Aber bei was

00:32:06.332 --> 00:32:08.153
andere, bei einer Liste ist es halt O von N, wenn du

00:32:08.153 --> 00:32:10.193
darauf zugreifen willst, weil du musst ja alle Dinge angucken,

00:32:10.293 --> 00:32:12.373
ob es das jetzt ist, was du haben wolltest oder nicht.

00:32:12.493 --> 00:32:14.413
Aber O von 1 bedeutet halt, ich kann halt nichts

00:32:14.413 --> 00:32:15.232
machen.

00:32:15.952 --> 00:32:17.212
Also es ist halt so

00:32:17.212 --> 00:32:19.373
und das ändert halt, genau, das heißt

00:32:19.373 --> 00:32:21.153
also auch egal ob kleine oder große Datenmengen,

00:32:21.232 --> 00:32:23.232
völlig wurscht, was da passiert und das heißt

00:32:23.232 --> 00:32:25.133
der steht quasi in meiner Berechnung, ob ich da irgendwas

00:32:25.133 --> 00:32:27.352
Algorithmus verbessern kann, zu vernachlässigen, weil das keine Rolle spielt,

00:32:27.493 --> 00:32:29.373
ob das, das muss halt einfach so.

00:32:29.873 --> 00:32:30.433
Ja, genau.

00:32:31.452 --> 00:32:33.493
Und das ist was ganz witziges,

00:32:34.572 --> 00:32:35.393
ich hatte mal

00:32:35.393 --> 00:32:37.193
in der Python-Schulung einen Teilnehmer,

00:32:37.312 --> 00:32:38.673
der da auch gut mitgemacht hat

00:32:38.673 --> 00:32:41.092
und der war empört darüber,

00:32:41.133 --> 00:32:42.592
das ist unmöglich, das kann gar nicht gehen,

00:32:43.112 --> 00:32:44.133
das kann gar nicht sein.

00:32:45.133 --> 00:32:47.153
Und dann haben wir tatsächlich einen kleinen Benchmark,

00:32:47.212 --> 00:32:48.732
geschrieben und haben das einfach mal ausprobiert.

00:32:49.352 --> 00:32:50.873
Und das ist eine sehr schöne Übung.

00:32:51.052 --> 00:32:52.812
Das ist eine sehr schöne Sache, einfach mal

00:32:52.812 --> 00:32:54.952
auszuprobieren, wie sich diese

00:32:54.952 --> 00:32:57.193
Laufzeiten verhalten. Wie lange es dauert,

00:32:57.612 --> 00:32:59.112
1000 Einträge einzufügen und

00:32:59.112 --> 00:33:00.972
10.000 Einträge einzufügen und 100.000

00:33:00.972 --> 00:33:03.153
Einträge einzufügen und die dann auch wieder rauszulesen

00:33:03.153 --> 00:33:04.993
im Vergleich zu

00:33:04.993 --> 00:33:05.413
einer Liste.

00:33:07.133 --> 00:33:08.972
Also du hast einfach quasi die Keys

00:33:08.972 --> 00:33:10.913
mit Brackets

00:33:10.913 --> 00:33:12.812
dann gesetzt in einer Schleife oder was?

00:33:12.812 --> 00:33:14.452
Genau. Und habe einfach

00:33:14.452 --> 00:33:16.732
die Zahlen von 1.000 bis 10.000 als

00:33:16.732 --> 00:33:20.793
Key und als Value, das spielt ja keine Rolle, wenn wir nur die Größe wissen wollen. Das ist dann ein sehr

00:33:20.793 --> 00:33:24.612
unnützes Dictionary, weil das halt einfach, wie man sagt, zum Key 1 gehört

00:33:24.612 --> 00:33:28.633
der Wert 1 und zum Key 10 gehört der Wert 10.

00:33:29.612 --> 00:33:32.533
Aber wenn es nur ums Benchmarken geht, dann ist das eine einfache Sache.

00:33:32.673 --> 00:33:36.273
Und bei einer Liste genauso, einfach mal eine Liste aus zwei Tupeln

00:33:36.273 --> 00:33:40.673
zusammengebaut. Und dann in dieser Liste einen bestimmten

00:33:40.673 --> 00:33:44.572
Eintrag suchen, ist halt O von N, weil durch diese Liste

00:33:44.572 --> 00:33:46.712
von vorne bis hinten durchgegangen werden muss.

00:33:46.893 --> 00:33:48.513
Und wenn ich jetzt den Eintrag 100 suche,

00:33:48.572 --> 00:33:50.352
dann muss ich halt das erste Element angucken und fragen,

00:33:50.452 --> 00:33:51.933
ist das 1? Nein.

00:33:52.673 --> 00:33:54.712
Und das zweite Element, ist das 1? Nein.

00:33:55.533 --> 00:33:56.793
Und das muss ich dann 99 Mal

00:33:56.793 --> 00:33:58.832
machen. Beim 100. sage ich, ist das Element 100?

00:33:59.732 --> 00:34:00.612
Und dann sage ich ja

00:34:00.612 --> 00:34:02.273
und dann bin ich fertig. Bei einem Dictionary,

00:34:03.052 --> 00:34:04.633
Hashmap, wir sprechen gleich, wie das

00:34:04.633 --> 00:34:06.673
funktioniert. Im Moment Magie.

00:34:08.052 --> 00:34:08.413
Dann

00:34:08.413 --> 00:34:10.393
passieren halt 10 Rechenschritte

00:34:10.393 --> 00:34:12.493
und dann steht da, okay, du hast

00:34:12.493 --> 00:34:13.973
jetzt so 100, hast du dir 100 gemerkt.

00:34:14.573 --> 00:34:16.812
und es spielt keine Rolle, ob das Dictionary

00:34:16.812 --> 00:34:18.812
einen Eintrag hat, nämlich nur diese 100

00:34:18.812 --> 00:34:20.852
oder ob es eine Million Einträge hat, das ist

00:34:20.852 --> 00:34:22.893
immer gleich schnell. Genau, aber was

00:34:22.893 --> 00:34:24.653
jetzt da interessant ist, hat zwei Dinge, also erstens

00:34:24.653 --> 00:34:26.953
wie man dann, also das ist eigentlich ein falscher Datentyp,

00:34:27.013 --> 00:34:28.752
aber wie man dann in der Liste das vielleicht

00:34:28.752 --> 00:34:30.573
schneller suchen könnte, weil also theoretisch

00:34:30.573 --> 00:34:32.613
könntest du ja in der Liste quasi auch daraus eine

00:34:32.613 --> 00:34:34.532
Hashtable bauen, irgendwie aus allen Einträgen dieser Liste

00:34:34.532 --> 00:34:36.713
einfach da nachgucken, wenn die Hashtables

00:34:36.713 --> 00:34:38.473
sind, diese Datentypen oder sowas, ja genau

00:34:38.473 --> 00:34:40.613
und dann halt überlegen sich irgendwie den Algorithmus,

00:34:40.673 --> 00:34:42.393
wie man relativ schnell die Dinge in dieser Liste findet,

00:34:42.393 --> 00:34:44.832
ohne, dass man halt über die ganze Liste

00:34:44.832 --> 00:34:46.673
iterieren muss. Ja, aber da brauchst du eine andere

00:34:46.673 --> 00:34:48.493
Datenstruktur. Wenn du nur die Liste hast, dann muss

00:34:48.493 --> 00:34:50.653
die Liste an sich garantiert

00:34:50.653 --> 00:34:52.532
dir das nicht. Die garantiert dir nur, dass es Elemente

00:34:52.532 --> 00:34:54.473
in einer Abfolge gibt. Die nächste Frage wäre jetzt, wie halt

00:34:54.473 --> 00:34:56.252
in der Stickt, was ja auch im Prinzip

00:34:56.252 --> 00:34:58.393
eine Liste von Keys ist, jetzt erstmal so

00:34:58.393 --> 00:35:00.673
in der Syntax, wie das dann in den Speicher

00:35:00.673 --> 00:35:02.612
so reinkommt, dass man diesen Lookup machen

00:35:02.612 --> 00:35:03.493
kann, dass man halt quasi

00:35:03.493 --> 00:35:06.473
aus dem Wert des Keys

00:35:06.473 --> 00:35:08.312
eine Speicheradresse bekommt quasi.

00:35:09.133 --> 00:35:10.572
Ich möchte noch dazu sagen,

00:35:10.572 --> 00:35:25.592
Ich möchte noch dazu sagen, du hast jetzt gesagt, das ist eine Liste von Keys, dem stimme ich so nicht ganz zu. Es gibt nämlich da drei Ansichten drauf. Es gibt die Keys, das ist ein Set, das ist eine Menge, die hat auch keine Reihenfolge.

00:35:25.592 --> 00:35:28.413
schon, aber

00:35:28.413 --> 00:35:30.072
früher nicht

00:35:30.072 --> 00:35:32.252
also hat eine Reihenfolge

00:35:32.252 --> 00:35:34.232
ja, aber es ist ein Set, weil

00:35:34.232 --> 00:35:35.453
im Sinne von

00:35:35.453 --> 00:35:37.052
die Reihenfolge

00:35:37.052 --> 00:35:39.433
ist nicht

00:35:39.433 --> 00:35:41.873
die Reihenfolge, die reingeschrieben worden sind

00:35:41.873 --> 00:35:43.513
ja, das ist die Reihenfolge

00:35:43.513 --> 00:35:46.373
die jetzt halt

00:35:46.373 --> 00:35:47.413
irgendwann dazukommen sind, aber

00:35:47.413 --> 00:35:50.193
wenn wir ein Dict von Python 3.4 nehmen, dann hat es

00:35:50.193 --> 00:35:51.433
keine Reihenfolge

00:35:51.433 --> 00:35:53.893
also in Python 3.5 kam ein Ordered Dict

00:35:53.893 --> 00:35:56.193
Ne, also ein Ordered Stick gab es schon immer, aber

00:35:56.193 --> 00:36:00.193
dass das sortiert ist, das kam in

00:36:00.193 --> 00:36:02.413
3.6 dazu, wurde aber noch nicht garantiert

00:36:02.413 --> 00:36:03.312
und ab 3.7

00:36:03.312 --> 00:36:06.633
ist es halt auch garantiert, dass es so bleibt

00:36:06.633 --> 00:36:08.193
Also in 3.6 war es ein

00:36:08.193 --> 00:36:10.193
Implementierungsdetail und in 3.7 gehört es

00:36:10.193 --> 00:36:11.052
zur Spezifikation

00:36:11.052 --> 00:36:14.232
Aber wenn man sich so

00:36:14.232 --> 00:36:16.493
ein ursprüngliches Stick mal anschaut

00:36:16.493 --> 00:36:18.173
dann sind die Keys eigentlich ein Set

00:36:18.173 --> 00:36:20.352
Die haben keine Reihenfolge

00:36:20.352 --> 00:36:20.913
in dem Sinne

00:36:20.913 --> 00:36:23.933
und die können auch keine Duplikate

00:36:23.933 --> 00:36:25.913
enthalten. Und das ist genau das, was eine Menge ausmacht.

00:36:26.373 --> 00:36:27.752
Also quasi ein Set of Sorted Set.

00:36:29.852 --> 00:36:31.413
Ja, wobei die Sortierung

00:36:31.413 --> 00:36:32.232
die

00:36:32.232 --> 00:36:35.812
Reihenfolge des

00:36:35.812 --> 00:36:37.873
Einfügens ist. Dann gibt es

00:36:37.873 --> 00:36:39.873
die Values. Das ist auch ein View

00:36:39.873 --> 00:36:41.792
auf diese Daten, die in dem

00:36:41.792 --> 00:36:43.852
Diktator drin sind. Das sind halt die Werte, die da gespeichert sind.

00:36:43.933 --> 00:36:45.032
Das ist im Wesentlichen eine Liste.

00:36:46.133 --> 00:36:47.913
Die Liste der Werte. Und dann

00:36:47.913 --> 00:36:48.913
gibt es noch die Items.

00:36:48.913 --> 00:36:53.513
das ist eine Menge aus Tupeln, die jeweils Key und Value enthalten

00:36:53.513 --> 00:36:57.752
und für mich sind die Items so ein bisschen das, was das Dictionary ausmacht

00:36:57.752 --> 00:36:59.133
das ist das, was da drin ist

00:36:59.133 --> 00:37:03.693
also damit kann man ja quasi auch über so ein Dictionary etablieren oder sowas

00:37:03.693 --> 00:37:05.752
man kann es einfach als Methode dot notated aufrufen

00:37:05.752 --> 00:37:09.552
und dann kannst du quasi for Key Value in Dict.Items

00:37:09.552 --> 00:37:12.792
genau, for Key Value in Dict.Items

00:37:12.792 --> 00:37:15.352
das ist so ein Muster, das sieht man ganz häufig, weil man da einfach durch

00:37:15.352 --> 00:37:17.052
quasi durch das gesamte Dictionary durchgeht

00:37:17.052 --> 00:37:18.953
Man könnte auch

00:37:18.953 --> 00:37:20.592
sagen for key in dictionary

00:37:20.592 --> 00:37:23.112
und dann sich jeweils

00:37:23.112 --> 00:37:24.913
den Value holen, weil es ist ja

00:37:24.913 --> 00:37:25.552
O von 1

00:37:25.552 --> 00:37:28.572
Das kostet ja so gesehen

00:37:28.572 --> 00:37:29.572
algorithmisch nichts

00:37:29.572 --> 00:37:32.592
Das kostet ausführungsweise schon was

00:37:32.592 --> 00:37:34.732
Wenn du eine Vorschleife machst über alle

00:37:34.732 --> 00:37:36.633
dann ist das halt schon O von N

00:37:36.633 --> 00:37:37.232
sozusagen

00:37:37.232 --> 00:37:40.473
Nur im Einzelfall halt nicht

00:37:40.473 --> 00:37:42.332
Aber die Value nochmal rauszuholen, wenn du die schon hast

00:37:42.332 --> 00:37:44.572
Genau, also die

00:37:44.572 --> 00:37:47.032
O-Notation von for key value

00:37:47.032 --> 00:37:48.052
in DictItems

00:37:48.052 --> 00:37:51.072
irgendwas tun und

00:37:51.072 --> 00:37:53.092
for key in Dictionary

00:37:53.092 --> 00:37:55.112
und dann den Value als Dict von

00:37:55.112 --> 00:37:56.812
Key holen, ist identisch.

00:37:57.792 --> 00:37:59.292
Aber die Laufzeiteigenschaften

00:37:59.292 --> 00:38:01.032
sind natürlich für den zweiten Fall schlechter,

00:38:01.112 --> 00:38:03.072
weil ich dann jedes Mal nochmal in das Dictionary

00:38:03.072 --> 00:38:05.013
rein muss. Natürlich nur für einen

00:38:05.013 --> 00:38:05.933
konstanten Faktor.

00:38:06.213 --> 00:38:09.493
Aber konstante Faktoren.

00:38:09.713 --> 00:38:10.772
Ja, konstante Faktoren.

00:38:11.312 --> 00:38:13.232
Also wenn etwas nur

00:38:13.232 --> 00:38:15.193
zehnmal langsamer ist, das ist auch ein konstanter

00:38:15.193 --> 00:38:15.493
Faktor.

00:38:17.032 --> 00:38:18.732
Macht schon einen Unterschied.

00:38:19.032 --> 00:38:19.913
Ist schon ein Unterschied, ja.

00:38:20.633 --> 00:38:20.792
Ja.

00:38:23.312 --> 00:38:23.752
Genau.

00:38:24.072 --> 00:38:25.633
Wie kann man denn Dicks bauen? Wisst ihr das?

00:38:26.052 --> 00:38:28.173
Ich habe vorhin einen ganz coolen Trick gelernt.

00:38:28.832 --> 00:38:30.112
Es gibt ja mehrere Wege,

00:38:30.213 --> 00:38:30.852
Dictionaries zu bauen.

00:38:32.572 --> 00:38:33.592
Ja, was meinte du?

00:38:34.153 --> 00:38:36.052
Syntaxmäßig, jetzt gescheuchte Kammer oder

00:38:36.052 --> 00:38:37.693
Dicht von... Wie ich ein Dictionary erzeuge.

00:38:37.693 --> 00:38:39.653
Also du kannst es natürlich einmal machen als Dictionary

00:38:39.653 --> 00:38:40.913
Contraintion, indem du sagst,

00:38:41.232 --> 00:38:42.832
gescheuchte Kammer, Key,

00:38:43.493 --> 00:38:45.792
Value, oder du machst

00:38:45.792 --> 00:38:47.792
hat einfach die Definition einfach in den eckigen

00:38:47.792 --> 00:38:49.373
Kammern, schreibst dann den Key und den Value hinterher

00:38:49.373 --> 00:38:51.453
oder du schreibst eine Liste von

00:38:51.453 --> 00:38:53.133
Keys und Values mit

00:38:53.133 --> 00:38:55.133
Gleichzeichen dahinter und machst dann Dict raus.

00:38:56.393 --> 00:38:56.993
Also Dict of.

00:38:57.473 --> 00:38:59.772
Ja genau, das ist der normale, also das ist der

00:38:59.772 --> 00:39:01.413
Konstruktoransatz.

00:39:01.953 --> 00:39:03.873
Du kannst die Keys auch in der Schleife

00:39:03.873 --> 00:39:04.592
einfach hinzufügen.

00:39:05.933 --> 00:39:07.513
Du kannst auch irgendwie, keine Ahnung,

00:39:07.612 --> 00:39:08.973
Tupel-Unpacking oder sowas,

00:39:09.572 --> 00:39:11.373
die ganzen Adrekte reingieben

00:39:11.373 --> 00:39:13.453
mit so Sternchen, Sternchen, Quarks und Tacks.

00:39:13.453 --> 00:39:18.513
bzw. wenn du eine Sequenz von Tupeln reingibst, von zwei Tupeln, dann nimmt er die automatisch.

00:39:19.032 --> 00:39:22.633
Eine Methode, die ich gerne verwende, ist dict.fromKeys.

00:39:25.272 --> 00:39:25.973
Was macht das?

00:39:26.673 --> 00:39:32.973
Naja, du gibst halt eine Liste von Keys und dann halt vielleicht einen Default-Wert oder so

00:39:32.973 --> 00:39:39.252
und dann erzeugt er das Ding dann raus mit diesem einen Factory-Methoden-Aufruf von dem Dict.

00:39:40.873 --> 00:39:42.213
Default-Dict gibt es noch irgendwie?

00:39:42.213 --> 00:39:44.032
Das ist schon etwas anderes.

00:39:44.232 --> 00:39:46.153
Müssen wir nachher noch drüber sprechen.

00:39:46.272 --> 00:39:47.252
Das ist nämlich auch eine spannende Sache.

00:39:47.732 --> 00:39:50.112
Ich möchte noch einmal kurz zu der Comprehension zurückkehren,

00:39:50.193 --> 00:39:51.732
weil die ist nämlich was sehr, sehr, sehr Cooles.

00:39:52.592 --> 00:39:54.052
Und die ist was, was auch für Leute, die

00:39:54.052 --> 00:39:57.653
das nicht kennen, super schwer zu verstehen ist.

00:39:59.832 --> 00:40:02.373
Diese Dictionary Comprehension ist eine der

00:40:02.373 --> 00:40:03.893
coolsten Wege, die es gibt,

00:40:03.973 --> 00:40:05.933
so ein Dictionary zu bauen, weil es halt im

00:40:05.933 --> 00:40:08.032
Wesentlichen diese Schleife, die man dazu

00:40:08.032 --> 00:40:09.732
braucht, in das Dictionary reintut.

00:40:10.913 --> 00:40:12.193
Also in die Konstruktion

00:40:12.193 --> 00:40:14.953
und das ist was

00:40:14.953 --> 00:40:16.913
sehr, sehr mächtiges. Die Syntax davon

00:40:16.913 --> 00:40:18.393
jetzt hier im Podcast zu besprechen ist vielleicht...

00:40:18.393 --> 00:40:19.913
Nee, mach nicht so viel, das muss man sich angucken.

00:40:20.232 --> 00:40:22.792
Das muss man sich ansehen, aber das ist auf jeden Fall was, was man

00:40:22.792 --> 00:40:24.792
ansehen kann. Ich habe vorhin noch einen

00:40:24.792 --> 00:40:26.713
sehr coolen Trick gelernt und das ist DictSip.

00:40:27.493 --> 00:40:28.933
Also wenn ich eine Liste von

00:40:28.933 --> 00:40:30.592
Keys habe und eine Liste von Values,

00:40:31.772 --> 00:40:33.893
dann kann ich die sippen und dann

00:40:33.893 --> 00:40:34.612
ein DictSignal draus machen.

00:40:36.013 --> 00:40:37.173
Das geht aber nur für gleich lange

00:40:37.173 --> 00:40:37.633
Listen, ne?

00:40:39.352 --> 00:40:40.873
Sip nimmt auch unterschiedlich lange Listen,

00:40:40.873 --> 00:40:42.032
und schneiden dann halt den Rest ab.

00:40:42.413 --> 00:40:43.893
Aber das ist, glaube ich, nicht der Sinn der Sache.

00:40:43.993 --> 00:40:46.352
Der Sinn der Sache ist, du hast schon die Keys und du hast schon die Values,

00:40:46.493 --> 00:40:48.332
aber in zwei Händen und mit Zip kannst du sie

00:40:48.332 --> 00:40:51.032
in eine schöne Reihenfolge bringen,

00:40:51.092 --> 00:40:51.612
die du schnell...

00:40:51.612 --> 00:40:52.653
Einmal Reißverschluss, bitte.

00:40:53.193 --> 00:40:58.772
So, wie kann man denn da Sachen wieder rauskriegen?

00:40:58.852 --> 00:41:00.792
Dominik, weißt du, ich frage dich jetzt ab.

00:41:00.873 --> 00:41:01.513
Ich finde das total gut.

00:41:03.272 --> 00:41:03.812
Was meinst du?

00:41:05.153 --> 00:41:06.413
Wie komme ich an die Werte wieder dran?

00:41:07.673 --> 00:41:08.792
Ja, du kannst einfach...

00:41:08.792 --> 00:41:10.373
Wenn ich jetzt ein Telefonbuch habe,

00:41:10.373 --> 00:41:11.592
wie kriege ich deine Telefonnummer raus?

00:41:11.893 --> 00:41:13.772
Du machst halt zum Beispiel entweder ein Get oder halt mit der

00:41:13.772 --> 00:41:15.732
Brackets-Syntax ziehst du die direkt raus.

00:41:16.653 --> 00:41:18.092
Bei Get kriegst du den Default-Wert

00:41:18.092 --> 00:41:19.913
zurück und du kriegst einen

00:41:19.913 --> 00:41:21.693
Error, wenn du

00:41:21.693 --> 00:41:23.993
daraus einfach so ein Key zu lesen ist, das es nicht gibt.

00:41:24.473 --> 00:41:25.873
Genau, wenn du es mit eckigen Klammern machst, kriegst du

00:41:25.873 --> 00:41:27.272
im besten Fall einen Key-Error.

00:41:28.653 --> 00:41:30.032
Der heißt tatsächlich Key-Error, also

00:41:30.032 --> 00:41:31.873
wenn man das abfangen möchte, ergibt es das.

00:41:32.013 --> 00:41:34.032
Genau, also beim Get kannst du halt dann den Default dranhängen.

00:41:34.673 --> 00:41:36.032
Es gibt noch zwei andere coole

00:41:38.232 --> 00:41:39.092
Attribute, die heißen

00:41:39.092 --> 00:41:40.752
Pop und PopItem.

00:41:41.592 --> 00:41:41.653
Ja.

00:41:43.153 --> 00:41:45.112
Und die sind quasi

00:41:45.112 --> 00:41:46.893
destruktiv, sie sind destruktiver Zugriff.

00:41:47.552 --> 00:41:47.772
Wenn ich sage,

00:41:48.393 --> 00:41:51.013
dictionary.pop.dominic,

00:41:51.393 --> 00:41:53.232
dann heißt es,

00:41:53.352 --> 00:41:55.112
entferne den Eintrag für Dominic,

00:41:55.252 --> 00:41:56.513
aber gib mir den Wert auch noch zurück.

00:41:57.173 --> 00:41:57.873
Wie bei einer Liste.

00:41:58.673 --> 00:42:01.072
Wie bei einer Liste, genau. Also, ja gut, halt mit diesem

00:42:01.072 --> 00:42:03.032
Key-Zugriff. Bei Pop muss ich immer

00:42:03.032 --> 00:42:05.173
den Key sagen, bei einer Liste müsste ich den Index

00:42:05.173 --> 00:42:06.693
sagen. Genau.

00:42:06.693 --> 00:42:08.373
Oder er gibt dir den ersten Wert.

00:42:08.373 --> 00:42:10.352
was natürlich beim Dick nicht geht, weil das nur einer ist

00:42:10.352 --> 00:42:12.373
genau, das heißt, Dick.pop muss

00:42:12.373 --> 00:42:14.532
immer einen Key haben, es gibt da keinen

00:42:14.532 --> 00:42:16.413
ersten oder letzten oder wie auch immer

00:42:16.413 --> 00:42:18.493
also das kann ich nicht machen, aber es gibt

00:42:18.493 --> 00:42:19.013
PopItem

00:42:19.013 --> 00:42:22.092
und PopItem

00:42:22.092 --> 00:42:24.453
das macht Lifo

00:42:24.453 --> 00:42:26.052
LastInFirstOut

00:42:26.052 --> 00:42:28.173
das heißt, es gibt dir tatsächlich den

00:42:28.173 --> 00:42:30.413
letzten Eintrag, der

00:42:30.413 --> 00:42:32.612
hinzugefügt wurde, zurück als Item mit Key und Value

00:42:32.612 --> 00:42:34.332
ach, dann braucht man den Key nicht mehr, das ist natürlich

00:42:34.332 --> 00:42:36.052
interessant, da kann man bestimmt... als Key und Value

00:42:36.052 --> 00:42:37.653
das ist schon sehr cool

00:42:37.653 --> 00:42:39.572
Das heißt, du kannst

00:42:39.572 --> 00:42:41.352
so eine While-Schleife machen und kannst

00:42:41.352 --> 00:42:43.732
dieses Dictionary sozusagen abarbeiten.

00:42:44.013 --> 00:42:45.693
Ja. Und hast dann so eine Art

00:42:45.693 --> 00:42:46.852
Dictionary-Queue. Und das ist

00:42:46.852 --> 00:42:49.732
eine praktische Sache, die ich erst

00:42:49.732 --> 00:42:51.612
heute gelesen habe. Ja, sehr schön.

00:42:52.013 --> 00:42:53.612
Ja, ne, hab ich auch so noch nicht verwendet, aber

00:42:53.612 --> 00:42:55.592
da fallen mir auch direkt viele Sachen zu ein, die man

00:42:55.592 --> 00:42:57.133
damit cool machen kann.

00:42:57.532 --> 00:42:59.612
Ja, wo man so ein Dictionary

00:42:59.612 --> 00:43:00.232
zerlegen kann.

00:43:01.732 --> 00:43:03.693
Ja, also es gibt noch

00:43:03.693 --> 00:43:05.852
Set Default.

00:43:06.213 --> 00:43:07.513
Das ist, ich weiß nicht,

00:43:07.513 --> 00:43:09.713
und man weiß, Leute, erzählen sollte das, was die Methode noch gibt.

00:43:10.153 --> 00:43:11.393
Das darf man nicht sagen.

00:43:11.393 --> 00:43:12.413
Naja, die ist eigentlich nicht gut.

00:43:13.852 --> 00:43:17.373
Also die liefert halt auch quasi das

00:43:17.373 --> 00:43:19.312
zurück, aber mit einem

00:43:19.312 --> 00:43:21.173
Default-Wert, den man dann noch angeben kann,

00:43:22.072 --> 00:43:23.673
wenn das nicht existiert.

00:43:24.493 --> 00:43:25.033
Ja, stimmt.

00:43:25.332 --> 00:43:27.173
Wo ich anfange, das erklärt sich mir schon ein, dass das

00:43:27.173 --> 00:43:28.033
vielleicht keine gute Idee ist.

00:43:28.413 --> 00:43:30.373
Es ist, glaube ich, besser, da direkt ein Default-Dict zu hören.

00:43:30.973 --> 00:43:33.232
Genau, das ist auch die Empfehlung, sollte man halt heutzutage

00:43:33.232 --> 00:43:34.033
eher Default-Dict nehmen.

00:43:34.053 --> 00:43:35.812
Oder ein Get und dann den Wert setzen.

00:43:37.513 --> 00:43:38.332
Wolltest du noch was?

00:43:38.332 --> 00:43:39.553
Was ist ein DefaultDict?

00:43:40.913 --> 00:43:42.553
Dafür müssen wir erst wissen, was ein DefaultDict ist.

00:43:42.673 --> 00:43:44.153
Dann erzähl mir, was ein DefaultDict ist.

00:43:44.893 --> 00:43:46.913
Ein DefaultDict ist ein Dictionary,

00:43:47.173 --> 00:43:48.812
eine Unterklasse von Dictionaries.

00:43:48.852 --> 00:43:51.092
Das keine Keys hat, aber wenn du einen Key abrufen willst,

00:43:51.112 --> 00:43:52.633
den es noch nicht gibt, dann gibst du den DefaultWert zurück.

00:43:53.112 --> 00:43:54.712
Genau. Du sagst eben,

00:43:54.832 --> 00:43:56.653
welchen Standardwert es haben soll und wenn du

00:43:56.653 --> 00:43:58.873
einen Key abrufst, den es noch nicht gibt, kriegst du den Standardwert.

00:43:59.732 --> 00:44:00.973
Und da gibt es drei

00:44:00.973 --> 00:44:02.493
große Varianten davon.

00:44:02.712 --> 00:44:04.653
Die erste ist die Lambda-Variante, wo du

00:44:04.653 --> 00:44:06.592
eine Funktion reingibst,

00:44:06.592 --> 00:44:08.712
die dann diesen Standardwert erzeugt

00:44:08.712 --> 00:44:10.993
und das ist sozusagen

00:44:10.993 --> 00:44:12.473
die allgemeine, das ist DefaultDict

00:44:12.473 --> 00:44:14.792
du musst dem DefaultDict irgendeine sogenannte Factory

00:44:14.792 --> 00:44:16.752
geben, damit er diesen Wert erzeugen kann

00:44:16.752 --> 00:44:18.993
und da kannst du jede beliebige Funktion reintun

00:44:18.993 --> 00:44:20.752
meistens ist das halt irgendeine kleine Lernintervention

00:44:20.752 --> 00:44:22.732
aber es gibt schon zwei Funktionen

00:44:22.732 --> 00:44:24.433
die du da verwenden kannst, nämlich List und Int

00:44:24.433 --> 00:44:26.953
die nützlich sind

00:44:26.953 --> 00:44:28.453
also wenn du DefaultDict

00:44:28.453 --> 00:44:30.612
Klammer auf, List Klammer zu machst

00:44:30.612 --> 00:44:32.712
dann heißt das, das ist ein Dictionary

00:44:32.712 --> 00:44:34.232
und wenn du da einen Key abrufst

00:44:34.232 --> 00:44:37.633
dann gibt er dir, wenn du noch nichts eingefügt hast

00:44:37.633 --> 00:44:39.112
für diesen Key, eine leere Liste zurück

00:44:39.112 --> 00:44:40.712
eine neue leere Liste

00:44:40.712 --> 00:44:43.653
und genauso

00:44:43.653 --> 00:44:45.232
für int, wenn du

00:44:45.232 --> 00:44:47.653
ein DefaultDict

00:44:47.653 --> 00:44:49.393
int hast, dann kannst du

00:44:49.393 --> 00:44:51.692
jeden beliebigen Key abrufen und kriegst 0 zurück

00:44:51.692 --> 00:44:53.692
Ja

00:44:53.692 --> 00:44:55.712
Du kannst einen Counter

00:44:55.712 --> 00:44:57.013
machen, das geht immer auf das

00:44:57.013 --> 00:44:59.033
Ja, aber Counter gibt es auch

00:44:59.033 --> 00:45:00.513
Da gibt es schon eine Klasse für, ja

00:45:00.513 --> 00:45:03.673
Und die ist richtig cool, diese Counter-Klasse, die müssen wir uns auch gleich noch

00:45:03.673 --> 00:45:06.232
Okay, wofür würde ich DefaultDict verwenden?

00:45:07.732 --> 00:45:08.433
Das klassische

00:45:08.433 --> 00:45:10.072
Beispiel ist, wenn man sich so ein Counter baut.

00:45:10.393 --> 00:45:12.212
Aber nochmal, wenn du das gleiche, nochmal

00:45:12.212 --> 00:45:14.013
auch, das gibt natürlich dann den neuen Wert zurück.

00:45:14.272 --> 00:45:16.232
Genau, also wenn du einen Wert in

00:45:16.232 --> 00:45:18.112
dieses DefaultDict

00:45:18.112 --> 00:45:20.092
reinspeicherst, dann ist es wie ein normales Dictionary.

00:45:20.332 --> 00:45:22.072
Also wenn es diesen Key schon gibt,

00:45:22.252 --> 00:45:24.212
dann kriegst du das, was da gespeichert wurde. Das kann auch

00:45:24.212 --> 00:45:25.993
was anderes sein als ein Int oder eine Liste.

00:45:26.533 --> 00:45:28.053
Das heißt, es ist nicht eine Typisierung,

00:45:28.252 --> 00:45:29.692
sondern es ist nur so dieser Fallback.

00:45:30.373 --> 00:45:32.453
Da ist nochmal noch eine Zwischenfrage,

00:45:32.453 --> 00:45:36.393
Kleiner Exkurs, wenn ich jetzt da ein Get mache auf so eine Liste, ja, auf so ein Default-Dict von der Liste

00:45:36.393 --> 00:45:40.192
und ich habe dann eine leere Liste in der Hand und ich schreibe in die was rein.

00:45:40.533 --> 00:45:44.572
Beim nächsten Mal auf denselben Key kippt ihr mir dann diese Liste, in der was drin ist.

00:45:45.352 --> 00:45:45.553
Nee.

00:45:46.673 --> 00:45:46.913
Oh.

00:45:48.013 --> 00:45:48.373
Warum nicht?

00:45:48.453 --> 00:45:51.153
Das wäre das, was Jochen vorher gesagt hätte, das wäre SetDefault.

00:45:51.772 --> 00:45:52.013
Ah.

00:45:52.772 --> 00:45:57.832
Weil du beim Abrufen entweder den Wert kriegst, der in der Liste, der in dem Dictionary drin ist,

00:45:59.612 --> 00:46:01.873
oder den, den die Factory erzeugt.

00:46:01.873 --> 00:46:03.873
aber der wird nicht automatisch in dieses

00:46:03.873 --> 00:46:05.873
Dictionary abgelegt. Aber das ist doch

00:46:05.873 --> 00:46:07.973
bei Listen, haben wir doch das Problem, dass dann das Objekt

00:46:07.973 --> 00:46:09.893
der Liste dann es doch schon gibt und dass das

00:46:09.893 --> 00:46:11.812
Objekt dieser Liste auf das dann ja... Genau, aber die wird nicht

00:46:11.812 --> 00:46:12.832
in das Dictionary abgelegt.

00:46:14.433 --> 00:46:16.072
Okay, das heißt, du musst die tatsächlich zuweisen.

00:46:16.072 --> 00:46:17.953
Die du nur in der Hand hast und du musst die dann tatsächlich

00:46:17.953 --> 00:46:20.173
zuweisen. Wenn du das möchtest,

00:46:20.232 --> 00:46:22.153
dass du eine Liste abrufst und die dann bearbeiten kannst,

00:46:22.232 --> 00:46:23.252
dann musst du SetDefault machen.

00:46:24.312 --> 00:46:25.272
Und SetDefault heißt,

00:46:26.133 --> 00:46:28.053
ruf einen Key ab, wenn es den schon gibt, gib mir

00:46:28.053 --> 00:46:30.153
das, was da drin ist, ansonsten setze in dem

00:46:30.153 --> 00:46:34.352
Dictionary den Wert, den ich dir da als Default angebe und gib ihn mir zurück.

00:46:34.633 --> 00:46:37.473
Okay, ja das dachte ich, dass wir das was Default-Dictionary machen würde.

00:46:37.633 --> 00:46:39.272
Okay, das heißt, dafür muss ich SetDefault machen.

00:46:39.732 --> 00:46:41.053
Genau, dafür musst du das SetDefault machen.

00:46:42.453 --> 00:46:46.553
Ja, aber die Funktion SetDefault, also sie ist in mehrerer Hinsicht verwirrend, sie ist

00:46:46.553 --> 00:46:49.413
auch verwirrend benannt, wie man es auch gerade wieder sehen konnte.

00:46:50.312 --> 00:46:53.352
Und vielleicht sollte man das echt, weil tatsächlich, wenn man so eine Default-Dict macht, ist es

00:46:53.352 --> 00:46:53.673
sauberer.

00:46:54.292 --> 00:46:58.653
Und ja, genau, was ich noch anmerken wollte zu den Factory-Funktionen, die man übergeben

00:46:58.653 --> 00:46:58.812
muss.

00:46:58.812 --> 00:47:00.812
also es kann eine Bedingung sein, die einzige

00:47:00.812 --> 00:47:02.953
Bedingung ist, sie darf keine Argumente

00:47:02.953 --> 00:47:04.092
nehmen. Genau.

00:47:05.112 --> 00:47:06.692
Wenn man jetzt so mehrfach

00:47:06.692 --> 00:47:08.513
verschachtelte Geschichten baut, das geht,

00:47:09.332 --> 00:47:10.752
aber das wird dann auch relativ schnell

00:47:10.752 --> 00:47:11.913
relativ unübersichtlich.

00:47:14.053 --> 00:47:14.772
Ich habe noch

00:47:14.772 --> 00:47:16.033
keine gute Lösung dafür, aber das ist,

00:47:16.453 --> 00:47:18.812
das sieht dann komisch aus, aber

00:47:18.812 --> 00:47:20.633
ja. Das ist ein bisschen blöd, dass es keine

00:47:20.633 --> 00:47:21.312
Argumente sein können.

00:47:22.832 --> 00:47:24.572
Also Factory-Striching-Manager gerne mal auf eine

00:47:24.572 --> 00:47:25.812
bestimmte Art und Weise initialisieren.

00:47:25.812 --> 00:47:27.893
Ja, das muss man ja irgendwie von einer

00:47:27.893 --> 00:47:30.053
die Fraud-Tag schon wie alles schon erben und muss das

00:47:30.053 --> 00:47:30.873
dann irgendwie schon hinstecken.

00:47:31.533 --> 00:47:33.553
Ja, aber da gibt es etwas, also

00:47:33.553 --> 00:47:35.973
zumal, wenn man jetzt bei unterschiedlichen

00:47:35.973 --> 00:47:38.013
Keys unterschiedliche Sachen machen möchte,

00:47:38.133 --> 00:47:39.852
das kann ja manchmal sein, du sagst so,

00:47:39.893 --> 00:47:41.913
wenn ich diesen Key habe, okay, dann möchte ich ja gar keine

00:47:41.913 --> 00:47:43.873
Liste dazu machen, sondern was ganz anderes oder so

00:47:43.873 --> 00:47:46.033
und dann geht das

00:47:46.033 --> 00:47:47.752
mit dem Default-Tag ja alles so nicht mehr so richtig,

00:47:47.973 --> 00:47:49.553
eben deswegen, weil man kann halt nicht

00:47:49.553 --> 00:47:51.832
Argumente angeben, was man dann, also

00:47:51.832 --> 00:47:53.993
das geht da nicht mehr,

00:47:54.053 --> 00:47:55.732
da gibt es aber auch etwas sehr Cooles, was ich auch erst

00:47:55.732 --> 00:47:57.332
in der Vorbereitung. Ich habe ja einfach nochmal geguckt,

00:47:57.953 --> 00:47:59.393
zu dieser Episode

00:47:59.393 --> 00:48:02.072
habe ich mir nochmal so ein bisschen angeguckt, was habe ich denn an Literatur

00:48:02.072 --> 00:48:03.973
zu Dicts? Steht da irgendwas Interessantes

00:48:03.973 --> 00:48:05.792
drin? Da habe ich tatsächlich etwas gefunden, was ich noch nicht wusste,

00:48:06.252 --> 00:48:07.873
wo ich auch sagen würde, oh cool, dass ich das jetzt

00:48:07.873 --> 00:48:09.933
weiß. Und zwar gibt es

00:48:09.933 --> 00:48:10.712
Dundamissing

00:48:10.712 --> 00:48:13.772
als

00:48:13.772 --> 00:48:15.212
sozusagen Spezialmethode,

00:48:15.433 --> 00:48:17.712
die man überschreiten kann, wo man

00:48:17.712 --> 00:48:19.592
dann den Key bekommt. Das ist quasi der Key Error.

00:48:19.933 --> 00:48:21.272
Du kannst den Key Error überschreiben.

00:48:21.692 --> 00:48:23.433
Ich mache dann DefaultDict,

00:48:23.493 --> 00:48:25.572
mache ich dann eine neue Klasse, die von DefaultDict erbt und überschreibt

00:48:25.572 --> 00:48:29.893
dann dann dann Missing und guckt dann mit einem Match-Case-Statement, was da drin ist.

00:48:30.013 --> 00:48:33.252
Genau, oder du kannst von Default-Ticket erben, na klar, aber

00:48:33.252 --> 00:48:37.873
das musst du dann ja im Grunde nicht mehr, weil wenn du die Methode überschreibst, dann bestimmst du ja selber, was passiert.

00:48:39.212 --> 00:48:41.712
Und da kannst du alles machen. Das ging früher übrigens auch nicht.

00:48:42.433 --> 00:48:45.332
Ich konnte früher nicht von Dict erben, deshalb gibt es noch eine Klasse, die UserDict heißt.

00:48:45.933 --> 00:48:49.852
Achso, das heißt dann, ich mache tatsächlich sowas ähnliches wie UserDict und ich mache

00:48:49.852 --> 00:48:53.953
eine neue Klasse auf die erbt einfach von Dict und da überschreibe ich dann nur die Missing-Methode und dann gucke ich halt,

00:48:53.953 --> 00:48:55.732
statt dem Key-Error rauszugeben,

00:48:56.092 --> 00:48:57.473
dass er dann tatsächlich irgendwas Neues anstellt.

00:48:57.812 --> 00:49:00.513
Das würde auch tatsächlich funktionieren, aber

00:49:00.513 --> 00:49:04.013
diese Diskussion hatten wir

00:49:04.013 --> 00:49:05.953
in dem Python User Group

00:49:05.953 --> 00:49:08.092
Düsseldorf Channel auch

00:49:08.092 --> 00:49:10.292
vor kurzem, ob es denn okay ist

00:49:10.292 --> 00:49:12.173
von Dict zu erben oder wenn man lieber von UserDict

00:49:12.173 --> 00:49:14.173
erben soll oder so. Und ich hatte das halt noch

00:49:14.173 --> 00:49:16.112
so im Hinterkopf, dass man von UserDict erben soll

00:49:16.112 --> 00:49:17.953
und nicht von Dict. Und

00:49:17.953 --> 00:49:20.112
tatsächlich habe ich jetzt auch

00:49:20.112 --> 00:49:22.153
nochmal nachgeguckt und nee, man soll

00:49:22.153 --> 00:49:23.272
von UserDict erben und nicht von Dict.

00:49:23.953 --> 00:49:25.493
Also man kann das ja zwar jetzt, aber

00:49:25.493 --> 00:49:26.913
Was ist da der Unterschied?

00:49:27.092 --> 00:49:29.633
Der entscheidende Unterschied, warum das

00:49:29.633 --> 00:49:31.913
unter Umständen einem Probleme machen kann,

00:49:32.133 --> 00:49:33.873
ist, dass

00:49:33.873 --> 00:49:35.373
bestimmte

00:49:35.373 --> 00:49:37.933
Methoden, also Missing

00:49:37.933 --> 00:49:39.712
ist jetzt, die funktioniert, die kann man überschreiben,

00:49:39.852 --> 00:49:41.673
aber bestimmte andere nicht. Und wenn du dann

00:49:41.673 --> 00:49:43.153
auch bestimmte andere Arten,

00:49:43.752 --> 00:49:45.792
wenn du da Sachen mitmachst, dann

00:49:45.792 --> 00:49:47.873
geht das an den Methoden, die du überschrieben hast,

00:49:47.953 --> 00:49:49.473
vorbei. Das heißt, wenn du

00:49:49.473 --> 00:49:51.453
von dem Bild entdeckt hast,

00:49:52.292 --> 00:49:53.812
und dann überschreibst

00:49:53.812 --> 00:49:55.933
halt irgendeine Methode und denkst, ja, müsste doch funktionieren,

00:49:56.013 --> 00:49:57.673
dann funktioniert es manchmal halt vielleicht nicht,

00:49:57.832 --> 00:49:59.852
weil zum Beispiel, also auch der Konstruktor

00:49:59.852 --> 00:50:01.792
davon ist halt so, der schreibt das halt

00:50:01.792 --> 00:50:03.953
irgendwie direkt, der geht nicht über die

00:50:03.953 --> 00:50:05.792
Set-Item, Get-Item-Geschichten,

00:50:05.893 --> 00:50:07.832
die es da halt normalerweise gibt. Das heißt,

00:50:07.953 --> 00:50:09.633
dann verhält sich das Ding unter Umständen

00:50:09.633 --> 00:50:12.013
unerwartet. Und ja, Laufzeitverhalten

00:50:12.013 --> 00:50:13.173
ist auch so ein bisschen anders.

00:50:13.993 --> 00:50:15.792
Und, das habe ich jetzt aber auch

00:50:15.792 --> 00:50:17.553
wieder vergessen, also es war auch irgendwie, ist eine

00:50:17.553 --> 00:50:19.592
wichtige Geschichte, warum das, wenn das

00:50:19.592 --> 00:50:21.732
ein Data-Attribut ist und sozusagen die Zugriffe

00:50:21.732 --> 00:50:22.873
daher nur delegiert werden.

00:50:23.513 --> 00:50:25.393
Das macht auch irgendwie, ich glaube, es kann sogar sein, dass

00:50:25.393 --> 00:50:27.352
das der Grund ist, weshalb man SetItem, GetItem

00:50:27.352 --> 00:50:29.473
dann überhaupt quasi richtig überschreiben

00:50:29.473 --> 00:50:31.212
kann, weil wenn das halt...

00:50:31.212 --> 00:50:32.913
Weil es delegiert wird. Ja, genau, genau.

00:50:34.053 --> 00:50:35.612
Und daher sollte

00:50:35.612 --> 00:50:37.553
man, wenn man das selber, wenn man

00:50:37.553 --> 00:50:39.393
erben will und will Sachen überschreiben, dann

00:50:39.393 --> 00:50:41.332
lieber UserDict nehmen, statt einfach

00:50:41.332 --> 00:50:43.393
von Build enternen. Also UserDict

00:50:43.393 --> 00:50:43.993
ist quasi

00:50:43.993 --> 00:50:47.352
eine Klasse, die das gleiche Interface hat wie

00:50:47.352 --> 00:50:49.352
Dictionary, aber

00:50:49.352 --> 00:50:51.572
eben ein Attribut heißt, das heißt

00:50:51.572 --> 00:50:51.973
Data

00:50:51.973 --> 00:50:55.393
und das ist ein Dictionary und einfach alles

00:50:55.393 --> 00:50:56.852
durchrecht an dieses Data.

00:50:57.933 --> 00:50:59.433
Und das bedeutet, dass wenn ich von UserDict

00:50:59.433 --> 00:51:01.072
ableite, kann ich jede beliebige Methode

00:51:01.072 --> 00:51:03.212
überschreiben und die wird dann auch korrekt

00:51:03.212 --> 00:51:05.133
aufgerufen, auch Konstruktor und alles mögliche.

00:51:05.373 --> 00:51:05.513
Ja, genau.

00:51:07.913 --> 00:51:08.272
Ja.

00:51:09.033 --> 00:51:11.393
Ja, okay, wusste ich auch nicht. Ich wusste nicht, dass es so Unterschiede gibt.

00:51:11.453 --> 00:51:13.173
Ja, es ist immer wieder interessant, auch wenn ich dachte,

00:51:13.173 --> 00:51:14.852
also ich meine, das verwendet man ja jeden Tag

00:51:14.852 --> 00:51:16.953
und irgendwie schon lange und so und dann ist es so,

00:51:17.252 --> 00:51:18.772
kann ja eigentlich nichts Neues mehr.

00:51:19.133 --> 00:51:20.533
Aber manchmal so, ja.

00:51:20.533 --> 00:51:23.433
Aber das ist was, was man doch relativ selten macht von Dictionary.

00:51:24.612 --> 00:51:25.092
Also generell,

00:51:25.173 --> 00:51:26.493
Bild-Ins, so Sachen,

00:51:26.673 --> 00:51:28.553
fühlt sich immer so ein bisschen komisch an.

00:51:28.553 --> 00:51:29.453
Ja, ist nicht so häufig.

00:51:30.752 --> 00:51:32.433
Die sind einfach gut genug.

00:51:34.033 --> 00:51:34.852
Beziehungsweise, wenn man

00:51:34.852 --> 00:51:36.852
eine neue Datastruktur sich schreibt,

00:51:36.993 --> 00:51:38.812
dann benutzt man normalerweise eben eine

00:51:38.812 --> 00:51:41.173
und leitet nicht direkt

00:51:41.173 --> 00:51:43.033
davon ab. So ist meine Erfahrung.

00:51:43.112 --> 00:51:44.993
Instanziert die dann irgendwie so mit so einem

00:51:44.993 --> 00:51:46.953
Invektor-Pattern oder sowas, dass man die halt dann benutzt?

00:51:46.953 --> 00:51:48.792
Genau, dieses Data, dass du halt

00:51:48.792 --> 00:51:55.913
und sagt, okay, mein Baum ist eigentlich eine Liste, aber ich habe eine Liste, die das macht.

00:51:56.033 --> 00:51:59.633
Ich habe nicht das Interface von Liste geerbt, sondern ich habe halt eine in der Hand, die das macht.

00:52:01.212 --> 00:52:03.133
Das ist so meine Erfahrung. Ich weiß nicht, wie ihr das seht.

00:52:03.533 --> 00:52:06.852
Doch, doch. Ich sehe das ganz genauso.

00:52:06.993 --> 00:52:13.092
Achso, das ist auch noch der eine Grund dafür, warum das mit dem Delegieren eine gute Idee ist,

00:52:13.092 --> 00:52:34.525
und Jochen unterhalten sich die Programmiersprache Python Also in einem Kontext wo man sich dann fragt wie man so Dia macht auf dein Objekt und dann sieht man halt einen ganzen Haufen komisches Zeug wo man sich dann so h warum ist das denn alles da drin was man halt einfach so mitbekommt wenn man das wenn man

00:52:34.525 --> 00:52:35.165
da direkt erbt.

00:52:36.725 --> 00:52:37.725
Also, ja.

00:52:38.525 --> 00:52:39.625
Okay, ich frage mich alles.

00:52:40.605 --> 00:52:42.345
Wir müssen noch so ein paar Sachen, ich habe jetzt meine

00:52:42.345 --> 00:52:44.445
Notizenliste ist leider gerade leer gegangen,

00:52:44.925 --> 00:52:45.085
aber

00:52:45.085 --> 00:52:48.325
da ist so ein Ladegerät und da ist

00:52:48.325 --> 00:52:50.365
ein, das kann man, das kannst du am Telefon anschließen.

00:52:50.385 --> 00:52:52.065
Oh, du hast USB-C? Wow.

00:52:52.065 --> 00:52:54.345
als Apple-Haushalt USB-C.

00:52:54.465 --> 00:52:55.825
Ja, ja, brauchen wir das schon.

00:52:56.725 --> 00:52:57.045
Cool.

00:52:57.685 --> 00:52:59.865
Es gibt eine Methode in Dictionary,

00:52:59.945 --> 00:53:01.685
wo wir gerade über das Dictionary-Interface

00:53:01.685 --> 00:53:03.965
sprechen, die ist in 3.9 dazugekommen.

00:53:04.165 --> 00:53:06.025
Es gibt eine, in 3.9 hat sich

00:53:06.025 --> 00:53:07.305
das Dictionary-Interface verändert.

00:53:08.625 --> 00:53:10.065
Und zwar ist der

00:53:10.065 --> 00:53:11.725
Pipe-Operator dazugekommen.

00:53:11.985 --> 00:53:12.725
Ah, ja, richtig.

00:53:12.725 --> 00:53:13.665
Ja, natürlich.

00:53:14.785 --> 00:53:16.585
Und das ist sowas, was,

00:53:16.825 --> 00:53:18.345
wenn man das braucht, dann ist das

00:53:18.345 --> 00:53:20.665
ungeheuer wichtig und wenn man es

00:53:20.665 --> 00:53:21.625
nicht braucht, dann ist es so.

00:53:22.065 --> 00:53:24.965
Okay, nie gedacht, dass jemand sowas brauchen könnte.

00:53:25.765 --> 00:53:27.285
Das ist Dictionary-Vereinigung.

00:53:27.725 --> 00:53:29.185
Ja, Unions zwischen von Dicts.

00:53:29.625 --> 00:53:31.325
Genau, da gibt es jetzt den Operator dafür.

00:53:31.425 --> 00:53:32.165
Früher musste man immer,

00:53:33.205 --> 00:53:34.925
jede von uns hat so eine Sammlung von Tricks,

00:53:35.025 --> 00:53:36.705
wie man Dictionaries vereinigt.

00:53:37.405 --> 00:53:39.205
Ja, das ist ganz einfach mit Stern, Stern

00:53:39.205 --> 00:53:40.745
und unter Dictionary und

00:53:40.745 --> 00:53:42.305
ja,

00:53:42.985 --> 00:53:44.865
und das gibt es jetzt als Operator und auch mit

00:53:44.865 --> 00:53:47.205
Pipe gleich, also man kann auch gleich rein

00:53:47.205 --> 00:53:49.345
vereinigen, wobei das einfach ein Update

00:53:49.345 --> 00:53:50.325
ist meiner Meinung nach, oder?

00:53:50.325 --> 00:53:58.085
Oh, das würde ich jetzt ausprobieren, das weiß ich auch nicht, aber es stimmt, ich wusste, dass das passiert ist, ich habe es aber nie verwendet,

00:53:58.085 --> 00:54:00.845
seitdem, daher ist es mir jetzt gar nicht mehr bewusst.

00:54:00.865 --> 00:54:05.365
Moment, ein Update ist ja Union, ist das exklusiv, ist die Frage, ne?

00:54:06.385 --> 00:54:08.905
Es ist immer exklusiv, weil du ja keine Keys verdoppelst.

00:54:08.925 --> 00:54:13.245
Ja, aber dann geht das nicht mit dem Update, weil bei Update werden ja nur die Keys geupdatet, die in dem Update enthalten sind.

00:54:13.845 --> 00:54:19.085
Nee, ein Punkt Update, ein dictionary.update übernimmt alle Keys und Values aus dem...

00:54:19.085 --> 00:54:21.385
dem Eingegebenen. Das überschreibt

00:54:21.385 --> 00:54:23.105
alles, was da drin ist. Genau, aber wenn welche

00:54:23.105 --> 00:54:24.905
vorher schon drin waren und die dann überschrieben werden,

00:54:25.425 --> 00:54:27.125
aber wenn die vorher schon drin wären, die nicht,

00:54:28.025 --> 00:54:29.565
nein, aber wenn die vorher schon drin waren

00:54:29.565 --> 00:54:31.345
und nicht in dem neuen drin sind, dann sind

00:54:31.345 --> 00:54:33.085
die, wie sie vorher waren. Aber wenn du den

00:54:33.085 --> 00:54:35.285
Union Operator gleich machst, dann sind sie eben

00:54:35.285 --> 00:54:36.185
nicht mehr drin,

00:54:37.505 --> 00:54:39.105
weil sie halt nicht in dem Update sind.

00:54:40.585 --> 00:54:41.505
Das verstehe ich jetzt nicht.

00:54:41.785 --> 00:54:43.305
Okay, du hast zwei einigermaßen

00:54:43.305 --> 00:54:45.225
Distributiven. Du hast D1 und D2.

00:54:45.305 --> 00:54:46.625
Genau, du hast zwei einigermaßen Distributiven.

00:54:46.905 --> 00:54:48.465
Und das sind irgendwie zwei Keys gleich.

00:54:48.465 --> 00:54:50.705
Wenn du jetzt mit dem Update machst,

00:54:51.185 --> 00:54:52.405
werden die zwei gleichen Keys

00:54:52.405 --> 00:54:53.925
in dem ersten Dictionary überschrieben.

00:54:54.505 --> 00:54:56.145
Wenn du das, ne, erstes Update,

00:54:56.405 --> 00:54:57.825
wenn du aber die

00:54:57.825 --> 00:54:58.985
Union machst,

00:54:59.305 --> 00:55:02.385
nein, dann sind nur noch die zwei Keys drin.

00:55:03.185 --> 00:55:03.925
Nee, das kann ich.

00:55:04.305 --> 00:55:06.545
Nee, das wäre ja der

00:55:06.545 --> 00:55:07.745
Schnitt nicht zu beantworten.

00:55:08.445 --> 00:55:09.405
Achso, stimmt.

00:55:09.885 --> 00:55:11.745
Das gibt es nicht. Das gibt es nur bei Set.

00:55:12.185 --> 00:55:14.085
Gibt es nicht auf den Schnitt? Das gibt es nur bei Set.

00:55:14.345 --> 00:55:15.405
Bei Set gibt es das.

00:55:15.405 --> 00:55:16.945
Das ist aber...

00:55:16.945 --> 00:55:18.925
Gibt es nicht auch die Intersect?

00:55:18.965 --> 00:55:21.145
Z.Intersect. Ne, für Dictionaries gibt es kein Intersect.

00:55:21.205 --> 00:55:21.985
Okay, schade eigentlich.

00:55:23.045 --> 00:55:25.105
Weil das wäre doch eigentlich sehr logisch, dass das mit dem...

00:55:25.105 --> 00:55:26.625
Siehst du, jetzt habe ich den Piper-Properator nicht richtig verstanden.

00:55:26.645 --> 00:55:29.025
Es wäre logisch, dass es diese ganzen mathematischen

00:55:29.025 --> 00:55:30.765
Operationen alle für Z und Dictionaries haben.

00:55:30.765 --> 00:55:32.925
Genau, dass du halt quasi dann nicht nur sagst, du machst halt

00:55:32.925 --> 00:55:34.945
einfach irgendwie ein und und oder wie auch immer man das machen will

00:55:34.945 --> 00:55:37.105
von dem anderen Dikt und dann hast du die Unions direkt.

00:55:37.785 --> 00:55:38.925
Das wäre doch schön syntaxisch.

00:55:39.145 --> 00:55:41.025
Ich probiere das mal in der Rappel aus.

00:55:41.465 --> 00:55:42.605
Ja, mach mal. Union ist oder

00:55:42.605 --> 00:55:44.865
und das ist

00:55:44.865 --> 00:55:46.765
einfach die Vereinigung.

00:55:46.945 --> 00:55:50.145
so die Keys aus dem einen Dictionary und die Keys aus dem anderen Dictionary.

00:55:50.165 --> 00:55:50.785
Ja, okay.

00:55:50.885 --> 00:55:52.225
Mit den Werten aus dem jeweils letzten.

00:55:52.385 --> 00:55:53.325
Mach mal und und.

00:55:53.725 --> 00:55:55.545
Nee, das geht in der, nee, und und geht schon mal gar nicht.

00:55:55.745 --> 00:55:56.785
Und und gibt es in Python sowieso nicht?

00:55:56.865 --> 00:55:57.185
Gibt es nicht.

00:55:58.125 --> 00:55:59.045
Aber und und geht nicht.

00:55:59.125 --> 00:56:01.505
Und dann sagt er unsupported operand.

00:56:01.685 --> 00:56:02.625
Bit twice geht auch nicht.

00:56:02.765 --> 00:56:03.085
Ja, okay.

00:56:03.905 --> 00:56:05.505
Also tatsächlich, es geht nur die Vereinigung, ja.

00:56:06.345 --> 00:56:06.645
Ja, okay.

00:56:06.725 --> 00:56:07.845
Dann ist das gleich wie ein Update.

00:56:08.065 --> 00:56:09.965
Wohingegen bei set, wenn man das jetzt so macht.

00:56:09.965 --> 00:56:11.305
Bei set gibt es intersect.

00:56:11.545 --> 00:56:12.585
Es gibt set.intersect.

00:56:12.585 --> 00:56:14.865
Es gibt z.union und es gibt z.

00:56:14.865 --> 00:56:14.885
und es gibt z.

00:56:14.885 --> 00:56:18.105
Es gibt noch eine dritte, difference.

00:56:19.225 --> 00:56:20.745
Symmetric difference oder sowas.

00:56:21.005 --> 00:56:21.165
Ja, genau.

00:56:21.945 --> 00:56:24.085
Symmetric difference ist ja das eine

00:56:24.085 --> 00:56:25.825
plus das andere minus das eine.

00:56:27.205 --> 00:56:28.405
Schade, dass ihr Interfekt nicht habt.

00:56:28.485 --> 00:56:30.165
Warum hat der das denn nicht? Also bei selben, das bei set geht,

00:56:30.245 --> 00:56:32.365
aber bei dix nicht. Das müsste ja irgendwann mal reinkommen.

00:56:32.465 --> 00:56:34.765
Die Frage ist, wie sollen denn dann die Values

00:56:34.765 --> 00:56:35.165
aussehen?

00:56:36.545 --> 00:56:38.005
Bei der Intersection der Keys.

00:56:38.505 --> 00:56:39.245
Welche nimmst du denn dann?

00:56:41.505 --> 00:56:41.785
Hm.

00:56:41.785 --> 00:56:42.865
Jetzt hast du mich.

00:56:44.645 --> 00:56:46.625
Eine Liste von beiden wahrscheinlich.

00:56:47.005 --> 00:56:48.745
Ja, aber das wäre dann schon sehr unerwartet, oder?

00:56:48.885 --> 00:56:50.505
Ich meine, man könnte auch auf die Idee kommen,

00:56:50.545 --> 00:56:52.405
es müsste anders sein und dann wundert man sich halt,

00:56:52.505 --> 00:56:53.125
was passiert ist.

00:56:54.045 --> 00:56:55.785
Also eigentlich müsstest du

00:56:55.785 --> 00:56:58.285
den Schnitt über die Keys machen

00:56:58.285 --> 00:57:00.265
und dann entscheiden, aus welcher

00:57:00.265 --> 00:57:01.865
Quelle du die Value nimmst.

00:57:02.865 --> 00:57:04.085
Das ist halt quasi wie beim Update

00:57:04.085 --> 00:57:06.365
mit Exclude oder sowas.

00:57:06.365 --> 00:57:07.505
Kann man das machen mit Exclude?

00:57:08.565 --> 00:57:08.825
Nee.

00:57:10.445 --> 00:57:11.105
Auch doof.

00:57:11.785 --> 00:57:13.925
Ja, also was mir jetzt wieder anfällt,

00:57:13.985 --> 00:57:15.745
es ist irgendwie relativ ähnlich zu dem, was man irgendwie

00:57:15.745 --> 00:57:17.705
bei den neuen Sachen hat, wie mit Data Classes oder

00:57:17.705 --> 00:57:19.325
PyDentic oder sowas oder

00:57:19.325 --> 00:57:21.405
was gibt es denn noch, alles Ethos oder sowas?

00:57:22.325 --> 00:57:23.525
Also was diese, ja,

00:57:23.705 --> 00:57:25.465
oh, das gibt es auch noch, ja,

00:57:25.885 --> 00:57:27.745
Named Tuple. Ja, genau, Named Tuple.

00:57:27.905 --> 00:57:29.905
Genau, das ist auch spannend. Warum denn

00:57:29.905 --> 00:57:31.105
Named Tuple?

00:57:32.365 --> 00:57:33.805
Ja, das ist ein total komischer

00:57:33.805 --> 00:57:36.085
Name dafür. Ich weiß auch nicht.

00:57:36.165 --> 00:57:37.805
Um dot notated Zugriffe auf

00:57:37.805 --> 00:57:39.465
irgendwelche Objekte zu haben für die einzelnen.

00:57:40.305 --> 00:57:41.685
Okay, aber dann, also

00:57:41.685 --> 00:57:44.705
Was ist denn der Unterschied zwischen einem Dictionary und einer Klasse?

00:57:46.265 --> 00:57:52.725
Weil bei einer Klasse habe ich auch Namen drin, Punkt irgendwas und da ist genau ein Wert dazu drin.

00:57:52.845 --> 00:57:55.145
Du hast einen Konstruktor und irgendwie noch...

00:57:55.145 --> 00:57:56.485
Ja gut, aber das ist ja...

00:57:56.485 --> 00:57:57.665
Der Konstruktor ist nur eine Konvention.

00:57:58.485 --> 00:58:00.785
Du kannst auch deine Sachen anders konstruieren, genau.

00:58:01.305 --> 00:58:05.005
Also ich würde sagen, es gibt keinen großen Unterschied.

00:58:05.145 --> 00:58:08.085
Tatsächlich ist es eine sehr ähnliche Geschichte und ich glaube, es ist ja auch so...

00:58:08.085 --> 00:58:09.825
Alles die Interpretierung ist tatsächlich auch so.

00:58:09.825 --> 00:58:14.325
Genau, also in Python-Objekte, das sind halt Dicts, was ihre Struktur angeht.

00:58:14.985 --> 00:58:16.785
Mit ein kleines bisschen Syntax dazu.

00:58:18.965 --> 00:58:19.485
Genau.

00:58:20.085 --> 00:58:27.005
Tatsächlich ist es sogar, also ich weiß nicht, ob das bekannt ist, unter uns dreien sicherlich, aber unter den Hörern vielleicht nicht.

00:58:27.785 --> 00:58:32.105
Jede Instanz einer Klasse ist im Wesentlichen ein Dictionary.

00:58:32.685 --> 00:58:36.605
Also das hat ein Attribut, das heißt unterstrich, unterstrich, Dict, unterstrich, unterstrich.

00:58:36.605 --> 00:58:38.765
und da stehen die Dinge drin, die

00:58:38.765 --> 00:58:41.325
die Values in dieser Instanz sind.

00:58:41.425 --> 00:58:43.405
Also eine Instanz ist immer ein Dictionary

00:58:43.405 --> 00:58:43.885
in Python.

00:58:44.525 --> 00:58:45.945
Das ist irgendwie

00:58:45.945 --> 00:58:49.285
komisch oder seltsam.

00:58:49.565 --> 00:58:51.225
Gerade wenn man von anderen Programmiersprachen

00:58:51.225 --> 00:58:53.105
kommt, weil in anderen Programmiersprachen ist es ja nicht so.

00:58:54.125 --> 00:58:55.285
Weiß ich nicht. Also ich würde gerade

00:58:55.285 --> 00:58:56.965
sagen, bei dem, was üblicherweise

00:58:56.965 --> 00:58:58.165
so als Skriptsprache

00:58:58.165 --> 00:59:00.825
qualifiziert wird,

00:59:01.625 --> 00:59:03.205
da ist das auch, also bei JavaScript,

00:59:03.405 --> 00:59:04.705
da heißen die Dinger sogar Object.

00:59:04.705 --> 00:59:07.165
Vielleicht ist das das entscheidende Merkmal

00:59:07.165 --> 00:59:08.925
in der Skriptsprache

00:59:08.925 --> 00:59:10.625
Also bei

00:59:10.625 --> 00:59:13.125
oder bei Perl war das auf jeden Fall auch so

00:59:13.125 --> 00:59:14.805
da waren auch, also ich meine

00:59:14.805 --> 00:59:15.945
das hat ja keine offizielle

00:59:15.945 --> 00:59:19.085
Bei dynamischen Klassen und dynamischen Instanzen geht es ja

00:59:19.085 --> 00:59:20.965
quasi nicht anders, du musst ja quasi diese Zuordnung

00:59:20.965 --> 00:59:22.865
haben von Attributname zu

00:59:22.865 --> 00:59:23.445
irgendeinem Wert

00:59:23.445 --> 00:59:27.265
Bei kompilierten Sprachen ist das ja anders

00:59:27.265 --> 00:59:28.345
Ne, da ist es anders, genau

00:59:28.345 --> 00:59:31.225
Bei kompilierten Sprachen musst du es nur während der Kompilierungszeit machen

00:59:31.225 --> 00:59:33.265
und dann kannst du sagen, okay, das Attribut

00:59:33.265 --> 00:59:35.005
mit dem Namen x ist halt Feld Nummer 2.

00:59:35.445 --> 00:59:37.345
Ja. Man kann das in Python

00:59:37.345 --> 00:59:39.085
auch machen, quasi. Man kann das halt

00:59:39.085 --> 00:59:40.965
festdengeln, ohne dass das halt dann

00:59:40.965 --> 00:59:43.225
noch so dynamisch...

00:59:43.225 --> 00:59:44.685
Ja, man kann halt die Attribute

00:59:44.685 --> 00:59:47.025
in einem Spezialattribut

00:59:47.025 --> 00:59:48.865
Thunder Slots angeben und dann

00:59:48.865 --> 00:59:50.285
sind die halt da fix.

00:59:50.545 --> 00:59:52.665
Die kann man dann aber auch nicht mehr dynamisch zuweisen.

00:59:53.585 --> 00:59:54.885
Das ist aber auch nur

00:59:54.885 --> 00:59:56.765
Konvention, oder? Ne, ne, das ist dann tatsächlich

00:59:56.765 --> 00:59:57.185
schneller.

00:59:58.245 --> 01:00:00.785
Wenn ich ein Slot-Tick mache, dann kann ich das trotzdem

01:00:00.785 --> 01:00:01.485
zusätzlich machen.

01:00:01.485 --> 01:00:02.385
nochmal dann sein Slot.

01:00:02.625 --> 01:00:05.365
Achso, Moment, kann ich dann trotzdem

01:00:05.365 --> 01:00:07.665
dynamisch zuweisen? Ich weiß es nicht, meine, das geht dann nicht mehr.

01:00:08.085 --> 01:00:08.965
Das muss ich ausprobieren.

01:00:09.145 --> 01:00:10.285
Jochen macht seinen Editor an.

01:00:11.625 --> 01:00:13.265
Einer von uns beide ist gleich falsch.

01:00:15.285 --> 01:00:17.205
Oder eben NameTupel. NameTupel ist

01:00:17.205 --> 01:00:19.145
genauso, nur halt

01:00:19.145 --> 01:00:20.425
schneller.

01:00:21.285 --> 01:00:23.165
Weil der eben diesen Aufruf nicht über ein Dictionary macht,

01:00:23.265 --> 01:00:25.425
sondern über eine lineare Liste, weil die Annahme ist,

01:00:25.425 --> 01:00:27.585
dass du nicht so viele

01:00:27.585 --> 01:00:29.065
davon hast. Oder vielleicht

01:00:29.065 --> 01:00:30.365
ist das so eine Hybrid-Sache.

01:00:31.485 --> 01:00:36.105
So ein bisschen ist das Dictionary ja der Kern von Python.

01:00:36.325 --> 01:00:38.425
Es gibt ja so eine Liste...

01:00:38.425 --> 01:00:39.945
Moment, ich habe es gerade ausprobiert.

01:00:40.245 --> 01:00:42.305
Nein, wenn man halt Slots definiert hat

01:00:42.305 --> 01:00:44.165
und dann was anderes dynamisch zuweisen möchte,

01:00:44.245 --> 01:00:45.765
kriegt man Exception, Attribute, Error.

01:00:46.945 --> 01:00:48.205
Also wenn man Slots macht, dann ist es kein

01:00:48.205 --> 01:00:49.485
richtiges Dictionary, sondern nur...

01:00:49.485 --> 01:00:52.185
Also es ist halt auch so ein Trick, damit kann man halt, wenn man viele

01:00:52.185 --> 01:00:54.165
Objekte hat oder so, damit kann man die Objekte selber

01:00:54.165 --> 01:00:55.905
schneller machen und sie brauchen viel weniger Speicher.

01:00:56.985 --> 01:00:57.865
Jetzt muss man noch erklären.

01:00:58.245 --> 01:00:59.905
Aber Nailtubel macht das genauso, oder Jochen?

01:00:59.905 --> 01:01:01.645
jetzt ist auch schneller als

01:01:01.645 --> 01:01:03.245
eine allgemeine Klasse.

01:01:03.725 --> 01:01:05.465
Ja, ja, klar. Name-Tupel macht das genauso

01:01:05.465 --> 01:01:07.685
und darüber funktioniert, ich glaube,

01:01:07.765 --> 01:01:09.525
dann intern kann es sogar sein, dass die interne Datenstruktur

01:01:09.525 --> 01:01:11.485
Tupel ist und sich dann sozusagen

01:01:11.485 --> 01:01:13.465
nur eine Zuordnung gemerkt wird von

01:01:13.465 --> 01:01:15.645
Index auf irgendeinen Namen.

01:01:15.925 --> 01:01:17.485
Aber das würde ja schon nichts bringen,

01:01:17.685 --> 01:01:19.145
sondern das würde ja dann Hashtag den gleichen

01:01:19.145 --> 01:01:21.585
aufrufen, sondern das muss eine andere Struktur

01:01:21.585 --> 01:01:22.645
sein, das ist keine Hashmap.

01:01:23.025 --> 01:01:24.905
Ja, ja, ja, nee, das ist irgendwas anderes, keine Ahnung.

01:01:25.785 --> 01:01:26.145
Was auch immer.

01:01:27.585 --> 01:01:29.465
Man darf nicht vergessen, wenn ich eine kleine

01:01:29.465 --> 01:01:31.225
Menge an

01:01:31.225 --> 01:01:33.325
Keys hat, dann ist

01:01:33.325 --> 01:01:35.325
so eine Art Listenzuweisung, also ich

01:01:35.325 --> 01:01:37.465
merke mir einfach, die Keys

01:01:37.465 --> 01:01:39.385
in einer Liste und gehe die Liste linear durch,

01:01:40.345 --> 01:01:41.365
das kann schneller sein als

01:01:41.365 --> 01:01:42.225
so ein Hashmap-Zugriff.

01:01:42.925 --> 01:01:44.225
Für kleine Werte von n.

01:01:45.345 --> 01:01:47.305
Für kleine Werte von n ist o von n

01:01:47.305 --> 01:01:48.905
kleiner als o von 1. Kann sein.

01:01:49.205 --> 01:01:50.625
Kann gut sein, ja. Und

01:01:50.625 --> 01:01:53.445
das ist, glaube ich, der Trick von Slots und der Trick von Name-Tupel,

01:01:53.525 --> 01:01:55.125
dass die halt sagen, okay, wir

01:01:55.125 --> 01:01:57.265
machen keine allgemeine Zuweisung, sondern wir

01:01:57.265 --> 01:01:58.965
sagen, aha, wir haben ja nur drei

01:01:58.965 --> 01:02:02.005
benannte Attribute, dann ist es besser, die in einer Liste zu haben.

01:02:03.465 --> 01:02:03.865
Okay,

01:02:04.405 --> 01:02:06.065
Slots bitte noch einmal explizit erklären,

01:02:06.145 --> 01:02:07.565
weil das kommt gerade zum ersten Mal vor.

01:02:07.645 --> 01:02:08.545
Slots und Name-Tupel.

01:02:10.105 --> 01:02:11.225
Wie gesagt,

01:02:12.145 --> 01:02:13.845
darüber weiß ich jetzt gar nicht.

01:02:13.945 --> 01:02:15.645
Ich dachte, wir machen was.

01:02:15.645 --> 01:02:17.405
Erklär es mal als Name-Tupel.

01:02:17.605 --> 01:02:18.545
Was ist denn ein Name-Tupel?

01:02:19.945 --> 01:02:21.325
Ich wollte gerade nach Slots fragen.

01:02:21.645 --> 01:02:23.165
Ja, das kommt gleich.

01:02:24.145 --> 01:02:26.045
Naja, da definierst du sozusagen

01:02:26.045 --> 01:02:27.905
ein Objekt dadurch, dass du am Anfang

01:02:27.905 --> 01:02:29.545
Du gehst also, glaube ich, wie ist der Aufruf?

01:02:29.625 --> 01:02:31.065
Name-Truppel, dann sagt man irgendwie

01:02:31.065 --> 01:02:33.345
einen Namen dafür und dann sagt man die

01:02:33.345 --> 01:02:35.905
Attribute, die das haben kann

01:02:35.905 --> 01:02:36.785
und dann

01:02:36.785 --> 01:02:39.605
Und das verhält sich dann aber wie eine Klasse. Ja, genau.

01:02:39.765 --> 01:02:41.085
Und dann kann man mit Punkt drauf zugreifen.

01:02:41.445 --> 01:02:43.445
Aber nur mit diesen, die ich da angegeben habe.

01:02:43.585 --> 01:02:45.345
Also wenn ich ein Name-Truppel habe, das heißt

01:02:45.345 --> 01:02:47.025
Fuba

01:02:47.025 --> 01:02:49.785
Keine Ahnung, das heißt Fuba und das hat die Attribute

01:02:49.785 --> 01:02:50.505
A, B und C

01:02:50.505 --> 01:02:54.025
Dann kann ich ein Fuba.a

01:02:54.025 --> 01:02:55.745
machen und Fuba.b und Fuba.c

01:02:55.745 --> 01:02:57.665
und kriege die entsprechenden, das verhält sich

01:02:57.665 --> 01:02:59.625
dann wie ein Dictionary für diese drei

01:02:59.625 --> 01:03:01.425
Keys. Aber Dict kann ich ja nicht mit

01:03:01.425 --> 01:03:03.185
Dot machen, muss ja mit den Key-Ketten. Genau.

01:03:03.445 --> 01:03:04.445
Also das ist wie eine Klasse.

01:03:05.985 --> 01:03:07.705
Also das ist so

01:03:07.705 --> 01:03:09.425
ein Ding, das mache ich häufig, dass ich

01:03:09.425 --> 01:03:11.265
einfach eine Klasse mache, die heißt DataHolder

01:03:11.265 --> 01:03:13.405
und die hat keine Attribute,

01:03:13.505 --> 01:03:14.905
weil dann kann ich nämlich mit Punkt irgendwas.

01:03:15.005 --> 01:03:17.185
Wenn wir jetzt gerade schon bei NamedTouples noch sind, da gibt es übrigens

01:03:17.185 --> 01:03:19.305
auch eine kleine Neuerung, weil früher gab es ja immer vom Collections

01:03:19.305 --> 01:03:21.345
NamedTouple, man musste NamedTouple off machen und

01:03:21.345 --> 01:03:23.345
jetzt gibt es aber auch das Typing NamedTouple und Typing

01:03:23.345 --> 01:03:25.285
NamedTouple ist nur ein bisschen eleganter, weil dann kannst du einfach

01:03:25.285 --> 01:03:26.065
das wie eine Klasse schreiben.

01:03:26.065 --> 01:03:28.305
und darunter die Attribute.

01:03:28.525 --> 01:03:30.185
Ich würde NameTupel gar nicht so

01:03:30.185 --> 01:03:32.425
prominent, weil auch das

01:03:32.425 --> 01:03:34.225
ist, glaube ich, nicht mehr so wirklich

01:03:34.225 --> 01:03:36.485
empfohlen und nicht mehr so richtig aktuell.

01:03:36.765 --> 01:03:37.965
Das gibt es halt noch.

01:03:39.105 --> 01:03:40.505
Aber eigentlich, was man

01:03:40.505 --> 01:03:42.305
darunter stellt...

01:03:43.125 --> 01:03:44.365
Wenn man NameTupel verstanden hat,

01:03:44.625 --> 01:03:46.185
dann ist Slots leicht zu erklären, weil Slots ist

01:03:46.185 --> 01:03:48.125
nämlich eine andere Syntax für die

01:03:48.125 --> 01:03:48.925
gleiche Funktionalität.

01:03:50.785 --> 01:03:52.085
Du sagst, welche

01:03:52.085 --> 01:03:54.125
Attribute eine Klasse haben darf und

01:03:54.125 --> 01:03:55.725
dann hat es nur genau diese Attribute.

01:03:55.725 --> 01:03:57.745
Das heißt, okay, also in Slots ist eine Dann-Dann-Methode,

01:03:57.845 --> 01:03:59.185
die in einer Klasse drinstehen kann.

01:03:59.385 --> 01:04:01.145
Nicht eine Methode, nein, nein, das ist ein Attribut.

01:04:01.225 --> 01:04:02.705
Das ist ein Attribut, ah, okay, das ist ein Attribut.

01:04:02.845 --> 01:04:03.985
Und das ist eine Liste von Namen rein.

01:04:04.005 --> 01:04:07.125
Und das ist eine Liste und in der Liste stehen quasi

01:04:07.125 --> 01:04:09.245
die Strings drin von den

01:04:09.245 --> 01:04:11.465
Namen, die als Attribut

01:04:11.465 --> 01:04:13.365
einer Klasse, die als Methode oder Attribut

01:04:13.365 --> 01:04:14.365
erlaubt sind.

01:04:14.485 --> 01:04:16.785
In unserem Beispiel von eben wäre dann die Klasse, die Klasse hieße Fuba

01:04:16.785 --> 01:04:19.325
und die hätte ein Attribut, das hieße Dann-Dann-Slots

01:04:19.325 --> 01:04:21.165
und da steht drin A, B und C

01:04:21.165 --> 01:04:22.845
als Strings. Stehen da auch

01:04:22.845 --> 01:04:24.825
Methodennamen drin oder nur

01:04:24.825 --> 01:04:25.825
Attributnamen.

01:04:25.965 --> 01:04:27.045
Nur die Attributnamen.

01:04:27.925 --> 01:04:30.245
Und wenn ich da Methodennamen reinschreibe, dann kann ich da eine Methode für definieren,

01:04:30.325 --> 01:04:31.105
die trotzdem funktioniert?

01:04:31.605 --> 01:04:33.305
Kannst du machen, klar, wenn du willst.

01:04:33.725 --> 01:04:35.225
Da müsste man ja ausprobieren, was da passieren kann.

01:04:35.485 --> 01:04:37.445
Das kannst du generell machen.

01:04:37.525 --> 01:04:39.805
Du kannst generell an jede Klasseninstanz

01:04:39.805 --> 01:04:42.165
eine Methode dran machen, die muss halt

01:04:42.165 --> 01:04:43.265
den Parameter self haben.

01:04:43.985 --> 01:04:46.505
Als erstes. Und dann funktioniert das wie die Methode.

01:04:46.605 --> 01:04:48.365
Weil Methoden an Klassen sind nichts anderes

01:04:48.365 --> 01:04:48.885
als

01:04:48.885 --> 01:04:52.505
Funktionen, die den Parameter self haben.

01:04:52.585 --> 01:04:54.125
Aber was ist denn, wenn das nicht in den Stops drinsteht?

01:04:54.125 --> 01:04:57.425
Ja, wenn es nicht in den Slots drinsteht, kannst du nicht darauf zugreifen.

01:04:57.585 --> 01:05:00.145
Genau, das heißt, die Methode kann ich nicht aufrufen, weil es nicht in den Slots drinsteht.

01:05:00.225 --> 01:05:02.645
Das heißt, auch die Slots sind für Methoden dann exklusiv.

01:05:02.645 --> 01:05:07.825
Du kannst die Methode in die Klassendefinition reinschreiben und die kommt dann zusätzlich zu den Slots dazu.

01:05:07.865 --> 01:05:10.185
Du kannst sie halt nicht dynamisch hinzufügen.

01:05:10.265 --> 01:05:11.525
Du kannst sie nicht dynamisch hinzufügen.

01:05:11.785 --> 01:05:16.265
A-Slots wird zusammengebaut aus dem, was in dem Attributslot drinsteht und in den Namen, die als die Methode dienen.

01:05:16.265 --> 01:05:17.445
Da wäre ich mir nicht so sicher.

01:05:17.905 --> 01:05:18.885
Probier es mal auszuhochen.

01:05:19.045 --> 01:05:20.325
Ja, ist meiner Meinung nach so.

01:05:22.705 --> 01:05:23.765
Jetzt müssen wir gerade ein bisschen tippen.

01:05:23.765 --> 01:05:25.025
und wir gucken, ob wir die solche haben.

01:05:25.025 --> 01:05:25.385
Okay.

01:05:28.445 --> 01:05:30.285
Also foo.astl.

01:05:30.305 --> 01:05:31.265
Das funktioniert schon mal.

01:05:31.605 --> 01:05:32.425
Also genau so.

01:05:33.045 --> 01:05:35.105
Und jetzt sagen wir foo.slots.

01:05:35.425 --> 01:05:37.045
Ich glaube nicht, dass das zusammengebaut wird.

01:05:37.185 --> 01:05:38.645
Ich glaube, dass slots bleibt so, wie es ist.

01:05:39.125 --> 01:05:40.905
Aber das funktioniert. Methoden gehen, ohne dass

01:05:40.905 --> 01:05:42.525
ein Slots drin steht und es ist nicht ein Slots drin.

01:05:42.565 --> 01:05:44.485
Du kannst aber Methoden hinzufügen.

01:05:44.865 --> 01:05:47.425
Weil die Methoden

01:05:47.425 --> 01:05:49.005
an dem Typ dranhängen und nicht

01:05:49.005 --> 01:05:49.745
in der Instanz.

01:05:51.725 --> 01:05:52.985
Das heißt, an einer

01:05:52.985 --> 01:05:54.885
Instanz, die ein Slots-Attribut hat,

01:05:54.965 --> 01:05:56.925
kannst du nichts verändern. Du hast nur genau

01:05:56.925 --> 01:05:58.285
diese Keys, die da drin sind.

01:05:58.885 --> 01:06:00.025
In dem darüberliegenden

01:06:00.025 --> 01:06:02.885
Typ hast du Methoden drin und da kannst du

01:06:02.885 --> 01:06:04.645
auch, kannst du alles mögliche drin haben. Das ist deine

01:06:04.645 --> 01:06:07.045
normale Klasse. Okay, es geht leider nur für die Instanz,

01:06:07.145 --> 01:06:08.365
die Slots. Genau.

01:06:08.765 --> 01:06:10.865
Die Slots sind für Instanzen von dieser Klasse

01:06:10.865 --> 01:06:12.885
und wenn diese Klasse aber selbst

01:06:12.885 --> 01:06:14.825
noch Methoden hat oder Attribute, ja, du kannst

01:06:14.825 --> 01:06:16.845
auch in diese Klasse ein Attribut reinschreiben. Du kannst da x gleich

01:06:16.845 --> 01:06:19.205
10 reinschreiben und das kannst du auch auslesen

01:06:19.205 --> 01:06:20.865
und du kannst es auch an der Klasse

01:06:20.865 --> 01:06:22.825
verändern. Ja, okay.

01:06:22.985 --> 01:06:24.105
aber nicht in den Instanzen.

01:06:24.625 --> 01:06:26.805
Weil in den Instanzen darfst du nur auf Slots zugreifen.

01:06:27.685 --> 01:06:27.765
Ja.

01:06:28.605 --> 01:06:30.605
Und das bedeutet, dass

01:06:30.605 --> 01:06:33.005
eine Klasse mit Slots im Wesentlichen

01:06:33.005 --> 01:06:34.905
wie ein Name-Tupel ist, nur besser.

01:06:35.225 --> 01:06:36.865
Mit besserer Syntax und

01:06:36.865 --> 01:06:38.865
mehr Methoden. Und das ist auch

01:06:38.865 --> 01:06:40.945
der Grund, warum Name-Tupel nicht mehr so richtig...

01:06:40.945 --> 01:06:42.605
Jawohl, aber ich finde, dass das neue Name-Tupel von

01:06:42.605 --> 01:06:43.865
Typing ist doch gar nicht so schlecht.

01:06:44.625 --> 01:06:46.225
Nee, also es hat auch noch andere Nachteile.

01:06:47.125 --> 01:06:48.625
Es gibt ja jetzt auch

01:06:48.625 --> 01:06:50.425
etwas, was man vielleicht eher

01:06:50.425 --> 01:06:51.825
nehmen... Also vielleicht meinst du es so,

01:06:51.825 --> 01:06:54.765
Es gibt ja Dataclasses, die sind ja auch jetzt in der Sprache drin.

01:06:54.925 --> 01:06:55.665
Ja, genau.

01:06:56.225 --> 01:06:59.325
Und die sind auch in eigentlichen, also es gab es auch, ich weiß nicht, Artikel dazu.

01:07:00.045 --> 01:07:02.585
Ich meine, ich habe es jetzt nur mal so gelesen, ich habe es nicht wirklich selber überprüft,

01:07:02.685 --> 01:07:06.165
aber so, wo Leute sagen, also bitte nehmt doch alle Dataclasses und nicht mehr nehmt Tuppel,

01:07:06.245 --> 01:07:09.265
weil Dataclasses ist schneller, ist besser, ist in jeder Hinsicht besser.

01:07:09.345 --> 01:07:10.345
Es gibt keinen Grund mehr dafür.

01:07:10.645 --> 01:07:11.685
Das alte Zeug ist nur noch drin.

01:07:11.845 --> 01:07:12.605
Man kann es lesen.

01:07:13.065 --> 01:07:13.225
Ja.

01:07:14.185 --> 01:07:14.785
Okay, ja.

01:07:16.365 --> 01:07:18.345
Es kann mehr und es ist schneller.

01:07:18.525 --> 01:07:20.385
Also ich meine, es gibt keine großen Nachteile.

01:07:21.825 --> 01:07:24.805
und es gibt das natürlich, also

01:07:24.805 --> 01:07:26.765
das Vorbild für

01:07:26.765 --> 01:07:28.445
Dataclass ist halt dieses

01:07:28.445 --> 01:07:30.585
Atris-Modul, das sehr beliebt ist.

01:07:30.665 --> 01:07:31.845
Das kann halt dann noch viel mehr.

01:07:33.165 --> 01:07:34.845
Und ist auch relativ schnell, wenn ich das richtig verstehe.

01:07:34.885 --> 01:07:35.845
Ist auch sehr nett, ja.

01:07:37.245 --> 01:07:38.885
Und also das ist

01:07:38.885 --> 01:07:40.785
was vielleicht damit angefangen hat, dann Dataclass

01:07:40.785 --> 01:07:42.665
ist eingebaut und jetzt gibt es halt auch noch sowas wie

01:07:42.665 --> 01:07:44.445
Pydentic, das ist ja auch so ähnlich.

01:07:45.025 --> 01:07:45.585
Das ist noch schneller.

01:07:46.045 --> 01:07:48.085
Der Münster bei Dataclass ist nicht schneller als Atris.

01:07:48.785 --> 01:07:50.765
Ich weiß nicht, ne, Pydentic meine ich auch

01:07:50.765 --> 01:07:53.245
eine eigene Geschichte. Ja, bei Denny ist es eigen, aber es ist nicht da.

01:07:53.905 --> 01:07:54.305
Doch, doch.

01:07:54.625 --> 01:07:55.685
Nee, ist es nicht? Nee.

01:07:56.345 --> 01:07:58.165
Es ist ein Einstehen sogar langsamer als Etos zum Beispiel.

01:07:58.745 --> 01:08:00.345
Okay. Jochen dachte, es wäre schneller.

01:08:00.465 --> 01:08:02.145
Ich dachte, es wäre Data-Klari-Grunden drin.

01:08:04.125 --> 01:08:06.285
Ich habe irgendwo so ein Video, das muss ich eigentlich mal in den

01:08:06.285 --> 01:08:08.605
Schirm losverdenken, wo jemand das ganz gut auseinander nimmt,

01:08:08.705 --> 01:08:10.525
wo der so im Timing-Stop... Also, das muss

01:08:10.525 --> 01:08:12.185
sich mal irgendjemand ganz genau angucken und

01:08:12.185 --> 01:08:13.965
Bescheid sagen, wie das denn wirklich ist.

01:08:14.545 --> 01:08:16.505
Und dann in der Episode hier in den

01:08:16.505 --> 01:08:18.545
Podcast kommen und uns das allen erklären, wie es ist.

01:08:18.565 --> 01:08:19.205
Genau, das wäre gut.

01:08:20.765 --> 01:08:21.485
Ja, absolut.

01:08:23.485 --> 01:08:24.865
Genau, aber es ist auf jeden Fall ein Ding,

01:08:25.065 --> 01:08:26.505
was halt, und

01:08:26.505 --> 01:08:28.785
diese ganzen Dinge, wenn man

01:08:28.785 --> 01:08:30.705
die sich alle anguckt, also NameTouple

01:08:30.705 --> 01:08:32.765
ist halt das, was man am wenigsten nehmen sollte von den ganzen

01:08:32.765 --> 01:08:33.105
Sachen.

01:08:34.285 --> 01:08:36.605
Ich finde ja die moderne Sondergeschichte, das sieht eigentlich ganz hübsch aus.

01:08:36.845 --> 01:08:37.625
Das ist halt so schnell.

01:08:39.285 --> 01:08:40.365
Wenn du es halt aufschreiben willst,

01:08:40.405 --> 01:08:42.545
vom Typing-Import NameTouple, dann machst du einfach

01:08:42.545 --> 01:08:44.905
auf, keine Ahnung, NameTouple

01:08:44.905 --> 01:08:46.705
define NameTouple und irgendwas und dann

01:08:46.705 --> 01:08:48.585
schreibst du halt die Attribute untereinander wie in der Klasse,

01:08:48.585 --> 01:08:50.785
definierst. Dir ist klar, welchen Datentyp haben die denn

01:08:50.785 --> 01:08:52.385
und so. Das sieht schon so aus als...

01:08:52.385 --> 01:08:54.145
Okay, vielleicht muss ich mir das auch nochmal angucken, weil

01:08:54.145 --> 01:08:56.705
das ich das vom Typing importiere, kenne ich jetzt noch

01:08:56.705 --> 01:08:58.465
gar nicht. Ja, aber das ist auf jeden Fall, glaube ich,

01:08:58.625 --> 01:09:00.745
ich weiß auch gar nicht, ob sich eine Implementierung da was geändert hat,

01:09:00.845 --> 01:09:02.745
aber ich glaube, wir werden es eigentlich haben, oder?

01:09:03.245 --> 01:09:04.705
Also das musst du erstmal kurz aufmachen,

01:09:04.765 --> 01:09:05.485
um dir das mal anzuschauen.

01:09:06.465 --> 01:09:07.345
Okay, dann muss ich da mal eingehen.

01:09:07.805 --> 01:09:10.645
Ich würde tatsächlich eher Dataclasses verwenden für diesen

01:09:10.645 --> 01:09:11.345
Newscase, aber

01:09:11.345 --> 01:09:14.965
ich habe ja immer seltsame Ansichten.

01:09:14.965 --> 01:09:16.025
Ja, das ist eine neue Sache.

01:09:16.065 --> 01:09:17.725
Abgefunden, dass ich nicht im Standard bin.

01:09:18.585 --> 01:09:20.665
Ach, so sieht das...

01:09:20.665 --> 01:09:21.505
Nee, okay.

01:09:23.145 --> 01:09:24.525
Ach doch, so sieht das aus, ja, okay.

01:09:24.845 --> 01:09:26.485
Ja, typing.namet-tuppel

01:09:26.485 --> 01:09:28.725
und dann sagt man hier irgendwie...

01:09:28.725 --> 01:09:30.085
Ja, aber das ist sogar noch...

01:09:30.085 --> 01:09:30.985
Moment, jetzt muss ich mal...

01:09:30.985 --> 01:09:34.245
Ja, da unten, also das nächste Beispiel...

01:09:34.245 --> 01:09:35.825
Wir wissen, dass die Zuhörer den Monitor nicht sehen können.

01:09:36.065 --> 01:09:37.365
Genau, das ist das Problem bei Podcasts.

01:09:38.185 --> 01:09:40.065
Und das Problem ist auch, ich kann das jetzt nicht vorlesen,

01:09:40.145 --> 01:09:41.485
kann ich schon, hilft nur nicht.

01:09:42.045 --> 01:09:43.825
Ja, genau, aber ich finde so die Gesundheit,

01:09:43.865 --> 01:09:44.845
das sieht doch gar nicht so schlecht aus.

01:09:45.165 --> 01:09:46.245
Ja, okay, also gut.

01:09:46.245 --> 01:09:49.065
und muss ich das mal jemandem anklicken

01:09:49.065 --> 01:09:50.165
und dann muss ich es halt sagen.

01:09:51.205 --> 01:09:53.225
Also es ist auch eine Möglichkeit, die man machen kann.

01:09:53.565 --> 01:09:54.105
Ja, ja, ja.

01:09:56.085 --> 01:09:56.445
Ja.

01:09:57.325 --> 01:09:58.065
Ja, ja.

01:09:58.365 --> 01:10:00.245
Okay, aber das ist ja nur syntaktischer Zucker, oder?

01:10:00.725 --> 01:10:01.985
Ja, syntaktisch Zucker.

01:10:03.405 --> 01:10:03.945
Sehr gut.

01:10:04.265 --> 01:10:05.685
Also dann ist es quasi Name-Double.

01:10:05.805 --> 01:10:06.765
Okay, schön. Das ist auch okay.

01:10:08.265 --> 01:10:10.805
Es gibt noch zwei Dinge, die ich

01:10:10.805 --> 01:10:12.265
vorhin gelernt habe. Das erste ist Counter.

01:10:12.265 --> 01:10:13.365
Wir haben es schon kurz angesprochen.

01:10:14.385 --> 01:10:15.965
Counter ist auch eine Dictionary-Subklasse.

01:10:16.245 --> 01:10:20.645
und die macht im Wesentlichen das, was sie sagt.

01:10:20.825 --> 01:10:24.345
Ich gebe eine Sequenz rein und die zählt, wie oft jedes Element drin vorkommt.

01:10:25.605 --> 01:10:28.025
Das heißt, wenn ich einen String reingebe, dann habe ich hinterher ein Dictionary

01:10:28.025 --> 01:10:32.885
und in dem Dictionary steht drin, wie oft jeder Buchstabe in diesem String vorkommt.

01:10:34.745 --> 01:10:37.665
Und das ist großartig, weil das baut man sich so oft selbst

01:10:37.665 --> 01:10:43.565
und das baut man sich so oft von Hand und macht ein Default-Dict oder macht ein Get

01:10:43.565 --> 01:10:46.065
und inkrementiert die Zahl dann und so weiter.

01:10:46.245 --> 01:10:48.445
einfach einen Counter und die Sequenz

01:10:48.445 --> 01:10:50.345
reintun und fertig. Und man kriegt einen Dickschneider

01:10:50.345 --> 01:10:52.165
raus mit der Anzahl.

01:10:52.405 --> 01:10:54.445
Super, ist großartig. Und das hat auch diese ganzen

01:10:54.445 --> 01:10:56.365
Funktionen, die man dazu braucht. Also wenn man das dann

01:10:56.365 --> 01:10:57.605
updaten möchte oder wenn man das

01:10:57.605 --> 01:11:00.065
wenn man

01:11:00.065 --> 01:11:01.685
einen Generator hat oder wenn man

01:11:01.685 --> 01:11:04.365
irgendwas anderes in der Hand hat und das nicht genau

01:11:04.365 --> 01:11:06.245
vorher weiß oder wenn man zwischendurch noch was machen möchte,

01:11:06.445 --> 01:11:08.305
ist großartig. Ein Counter

01:11:08.305 --> 01:11:10.225
zusammen mit einer Comprehension, super.

01:11:10.965 --> 01:11:11.485
Ja, ja.

01:11:12.425 --> 01:11:14.345
Es deckt so viele von diesen Fällen ab, für die man

01:11:14.345 --> 01:11:15.385
sonst Default-Dict verwendet.

01:11:16.245 --> 01:11:19.885
Ich habe noch was anderes schönes gefunden

01:11:19.885 --> 01:11:21.505
und zwar heißt es Chainmap

01:11:21.505 --> 01:11:23.205
Das ist auch ein Corrections-Modul drin

01:11:23.205 --> 01:11:25.025
Was ist denn eine Chainmap?

01:11:25.505 --> 01:11:26.225
Eine Chainmap

01:11:26.225 --> 01:11:28.305
das ist so ein

01:11:28.305 --> 01:11:31.645
Ich hatte so ein bisschen an JavaScript Objects erinnert

01:11:31.645 --> 01:11:33.865
Wenn du

01:11:33.865 --> 01:11:35.585
nach einem Key suchst

01:11:35.585 --> 01:11:37.865
dann suchst du quasi durch die ganze

01:11:37.865 --> 01:11:39.785
Reihe durch. Das heißt Chainmap nimmt eine

01:11:39.785 --> 01:11:40.805
Menge von Dictionaries

01:11:40.805 --> 01:11:43.925
und wenn du nach einem Key fragst

01:11:43.925 --> 01:11:45.785
dann guckt er im ersten

01:11:45.785 --> 01:11:49.765
Dictionary, ist der da drin? Wenn er da drin ist, kriegst du den Wert. Wenn er nicht drin ist,

01:11:49.825 --> 01:11:53.785
guckt er im zweiten nach. Wenn er da drin ist, kriegst du den Wert. Wenn er nicht drin ist, guckt er im dritten

01:11:53.785 --> 01:11:57.805
nach und so weiter, bis er alle seine darunterliegenden Dictionaries

01:11:57.805 --> 01:12:00.965
durchgeschaut hat. Wenn er es nirgendwo findet, kriegst du immer noch einen Key Error.

01:12:02.265 --> 01:12:04.505
Wenn du aber einen Wert reinschreibst,

01:12:05.145 --> 01:12:08.325
in diese Chain Map, dann schreibt er das immer in das oberste

01:12:08.325 --> 01:12:13.485
Dictionary rein. Das heißt, du veränderst nur das erste Dictionary aus deiner Kette,

01:12:13.485 --> 01:12:15.525
hast aber lesenden Zugriff

01:12:15.525 --> 01:12:16.565
auf die darunterliegenden.

01:12:18.485 --> 01:12:19.325
Und das ist so ein bisschen

01:12:19.325 --> 01:12:21.185
so wie Objekte in JavaScript

01:12:21.185 --> 01:12:23.505
funktionieren, wie Object in JavaScript funktioniert.

01:12:24.225 --> 01:12:25.605
Wenn du liest, liest du immer

01:12:25.605 --> 01:12:27.585
aus dem Ersten, was verfügbar ist,

01:12:27.645 --> 01:12:29.345
aber wenn du schreibst, schreibst du immer ins Oberste rein.

01:12:30.785 --> 01:12:31.385
Ja, ja, ja.

01:12:33.245 --> 01:12:35.265
Ja, ich überlege gerade auch, also ich meine,

01:12:35.565 --> 01:12:37.445
das ist auch sowas, ja, ich weiß es nicht genau,

01:12:37.445 --> 01:12:39.725
aber ich mache jetzt auch so ein bisschen

01:12:39.725 --> 01:12:41.585
JavaScript gerade und

01:12:41.585 --> 01:12:45.765
und was dann doch ein bisschen einfacher hinzuschreiben ist als in Python,

01:12:45.905 --> 01:12:50.705
ist halt diese 3-Punkt-Spratch-Operator-Syntax,

01:12:51.005 --> 01:12:53.465
wo man sich neue Sachen generiert, indem man ein altes Ding nimmt

01:12:53.465 --> 01:12:55.285
und dann sagt man Punkt, Punkt, Punkt, altes Ding

01:12:55.285 --> 01:12:58.045
und dann schreibt man noch ein neues Ding dazu oder so.

01:12:58.405 --> 01:13:01.745
Und mit Chainmap hat man ja da quasi was ganz Ähnliches.

01:13:02.645 --> 01:13:05.845
Das ist eben, wie gesagt, diese Prototypsache.

01:13:06.425 --> 01:13:09.385
JavaScript ist halt der Kern von JavaScript.

01:13:09.385 --> 01:13:10.985
jedes

01:13:10.985 --> 01:13:13.805
Object oder jedes Dictionary in JavaScript

01:13:13.805 --> 01:13:16.005
hat einen Prototypen, auf den

01:13:16.005 --> 01:13:18.085
du zurückfallen kannst und das kannst

01:13:18.085 --> 01:13:19.365
du hier mit Chainmap nachbauen.

01:13:20.525 --> 01:13:22.305
Ja, nett.

01:13:22.705 --> 01:13:24.105
Fand ich sehr schön, dass es gibt.

01:13:24.285 --> 01:13:25.885
Habe ich noch nie gebraucht.

01:13:26.605 --> 01:13:28.005
Wüsste jetzt auch nicht, an welcher Stelle ich das

01:13:28.005 --> 01:13:29.145
einsetzen würde, aber

01:13:29.145 --> 01:13:31.705
gibt es auf jeden Fall.

01:13:32.485 --> 01:13:34.065
Ich glaube, wenn man das braucht, ist das eine sehr

01:13:34.065 --> 01:13:34.745
sehr nützliche Sache.

01:13:34.745 --> 01:13:36.745
und

01:13:36.745 --> 01:13:39.845
weil man so Hierarchien damit bauen kann.

01:13:42.745 --> 01:13:42.985
Ja.

01:13:43.685 --> 01:13:45.745
Vielleicht noch einmal ganz kurz, weil ich gerade nachgeguckt

01:13:45.745 --> 01:13:47.325
hatte zu diesem, which Python

01:13:47.325 --> 01:13:49.485
Data Classes best, habe ich ein Artikel,

01:13:49.585 --> 01:13:51.525
also ein Video gefunden von einem Kanal

01:13:51.525 --> 01:13:53.385
M-Coding heißt und

01:13:53.385 --> 01:13:55.025
da vergleicht jemand tatsächlich

01:13:55.025 --> 01:13:57.245
Data Classes, NameTupil, Tupil

01:13:57.245 --> 01:13:59.085
Etters und Pydentic

01:13:59.085 --> 01:14:01.205
nach Geschwindigkeit und

01:14:01.205 --> 01:14:03.225
Memory Efforts und so und da scheint

01:14:03.225 --> 01:14:06.465
Pidentik vor allem beim Erstellen von den Objekten relativ schlecht ab.

01:14:06.745 --> 01:14:07.705
Okay, gut, ja.

01:14:08.425 --> 01:14:11.325
Das irgendwie 15 Mal so lange dauert oder so.

01:14:12.225 --> 01:14:13.305
Aber sonst vielleicht schnell.

01:14:14.445 --> 01:14:14.925
Ja, gut.

01:14:16.325 --> 01:14:19.205
Im Laufe seines Programmiererlebens hat er sich davon weg entfernt.

01:14:19.445 --> 01:14:20.065
Aber Geschwindigkeit.

01:14:20.245 --> 01:14:22.185
Er hat den Notizzettel wieder angemacht.

01:14:22.285 --> 01:14:23.565
Ja, genau, Geschwindigkeit, ja.

01:14:23.565 --> 01:14:25.105
Da ist die Frage, braucht man das überhaupt, will man das?

01:14:25.565 --> 01:14:25.825
Genau.

01:14:26.205 --> 01:14:27.325
Haben wir nicht genug Hauptspeicher?

01:14:27.925 --> 01:14:29.385
Das war von anderen Bereichen.

01:14:29.385 --> 01:14:31.005
Nie genügend Geschwindigkeit und nie genügend.

01:14:31.005 --> 01:14:32.845
und kommt darauf an.

01:14:32.845 --> 01:14:33.645
Letztens jemand,

01:14:35.585 --> 01:14:37.625
den kennt ihr bestimmt auch,

01:14:38.025 --> 01:14:39.585
Pavel Mayer

01:14:39.585 --> 01:14:40.465
aus

01:14:40.465 --> 01:14:43.665
Chaos Radio

01:14:43.665 --> 01:14:45.205
oder

01:14:45.205 --> 01:14:47.005
aus dem Chaosumfeld, ne, die kenne ich aber nicht.

01:14:47.145 --> 01:14:48.825
Ah, okay, der, naja, gut.

01:14:49.765 --> 01:14:50.985
Der hatte das mal

01:14:50.985 --> 01:14:53.185
irgendwie so beschrieben, dass ein Computer

01:14:53.185 --> 01:14:54.905
eigentlich für ihn nur eine relevante Eigenschaft,

01:14:55.385 --> 01:14:56.165
also ein

01:14:56.165 --> 01:14:59.465
Attribut hat, das irgendwie wichtig ist

01:14:59.465 --> 01:15:00.705
oder das drei gibt,

01:15:01.005 --> 01:15:30.985
und die Programmiersprache Python.

01:15:31.005 --> 01:15:32.665
in denen das wichtig ist,

01:15:32.805 --> 01:15:34.905
die Geschwindigkeit und Geschwindigkeit ist immer irgendwie

01:15:34.905 --> 01:15:36.985
so ein Faktor, der wichtig

01:15:36.985 --> 01:15:39.005
ist, aber man kann

01:15:39.005 --> 01:15:40.885
da so tief reingehen, wie man

01:15:40.885 --> 01:15:42.925
möchte und es gibt immer noch jemanden, der das schneller macht.

01:15:44.185 --> 01:15:44.925
Ich sehe mir

01:15:44.925 --> 01:15:47.025
sehr gerne die Videos von Casey Muratori an

01:15:47.025 --> 01:15:49.185
und der kommt halt aus der Spieleentwicklung

01:15:49.185 --> 01:15:50.165
und der sagt,

01:15:51.205 --> 01:15:52.945
man kann den C alles machen, also solltest

01:15:52.945 --> 01:15:54.885
du den C auch alles machen, aber wenn es schnell

01:15:54.885 --> 01:15:56.845
sein muss, dann musst du halt schon auf die Intrinsics

01:15:56.845 --> 01:15:59.045
gehen und den Prozessor kennen, den du da

01:15:59.045 --> 01:16:00.665
gerade benutzt und dann

01:16:00.665 --> 01:16:02.805
den Befehlssatz

01:16:02.805 --> 01:16:04.565
kennen, weil dann kannst du nämlich alles

01:16:04.565 --> 01:16:06.665
256 Mal so schnell machen wie vorher.

01:16:08.665 --> 01:16:09.105
Ja,

01:16:09.985 --> 01:16:11.165
das ist prinzipiell

01:16:11.165 --> 01:16:11.525
korrekt.

01:16:13.425 --> 01:16:15.245
Vielleicht ist SMB-Coden auch zu langsam,

01:16:15.445 --> 01:16:16.525
also wenn man es gut kann, ich weiß nicht.

01:16:17.125 --> 01:16:19.025
Man kann es sicherlich gut genug,

01:16:19.125 --> 01:16:20.785
aber...

01:16:20.785 --> 01:16:22.725
Noch kurz zu...

01:16:22.725 --> 01:16:25.165
Da gibt es auch gerade auf Netflix so eine

01:16:25.165 --> 01:16:26.465
Miniserie oder so,

01:16:26.625 --> 01:16:28.725
The Billion Dollar Code, die ist quasi mehr so,

01:16:28.725 --> 01:16:30.465
und orientiert sich an

01:16:30.465 --> 01:16:32.605
deren Biografien.

01:16:35.345 --> 01:16:37.145
Und die scheint wohl ganz gut.

01:16:37.765 --> 01:16:39.205
Wir machen wieder Werbung, Jochen,

01:16:39.245 --> 01:16:40.305
das ist aber eine werbungsvolle Folge.

01:16:41.145 --> 01:16:43.105
Diesmal ist ja noch gar nicht so...

01:16:43.105 --> 01:16:44.985
Gut, wir machen Werbung,

01:16:45.065 --> 01:16:47.505
Werbung machen wir immer, aber wir werden nicht dafür bezahlt.

01:16:49.385 --> 01:16:49.765
Netflix,

01:16:49.925 --> 01:16:51.425
falls ihr zuhört, der Jochen wäre

01:16:51.425 --> 01:16:53.165
durchaus offen dafür, bezahlt zu werden.

01:16:53.865 --> 01:16:55.365
Also Johannes Verkunde ist ja nicht mit

01:16:55.365 --> 01:16:57.605
anderen Werbepartnern direkt parallel...

01:16:57.605 --> 01:16:59.605
Also Netflix-Termin würde ich vielleicht auch schenken.

01:17:00.545 --> 01:17:01.425
Also wir hatten ja letztes Mal,

01:17:01.485 --> 01:17:02.825
also wenn wir jetzt schon das Thema Werbung haben,

01:17:02.925 --> 01:17:05.425
ich mache mal eine Chapter Mark hier.

01:17:05.925 --> 01:17:07.465
Ja, wir haben ja

01:17:07.465 --> 01:17:09.185
überlegt, ob wir Werbung mal schalten sollen

01:17:09.185 --> 01:17:11.265
und ein bisschen uns darüber lustig gemacht und wir haben ein bisschen

01:17:11.265 --> 01:17:13.125
Feedback bekommen, wo wir sagen, ja, mach doch einfach.

01:17:13.965 --> 01:17:15.005
Ja, dann haben wir jetzt auch gedacht, ja, okay.

01:17:15.085 --> 01:17:15.725
Na gut, dann machen wir halt.

01:17:18.025 --> 01:17:19.525
So ein bisschen kostendeckend arbeiten.

01:17:19.765 --> 01:17:21.325
Gibt es Leute, die euch bezahlen?

01:17:21.425 --> 01:17:22.045
Das ist ja verrückt.

01:17:22.825 --> 01:17:24.745
Aber berührt und schockiert.

01:17:25.525 --> 01:17:26.565
Du wirst nicht bezahlt.

01:17:26.565 --> 01:17:27.345
und das macht ja gar keiner.

01:17:28.185 --> 01:17:29.365
Achso, ja gut dann.

01:17:29.985 --> 01:17:32.425
Ja, nicht so direkt,

01:17:32.505 --> 01:17:34.565
aber ich meine, das wäre natürlich so eine Sache, die man machen könnte.

01:17:34.705 --> 01:17:36.065
Man könnte also einmal Hosting

01:17:36.065 --> 01:17:38.265
kosten und so die Anfälle ein bisschen damit vielleicht

01:17:38.265 --> 01:17:40.305
bezahlen.

01:17:40.385 --> 01:17:42.005
Aber was man auch machen könnte, wir könnten

01:17:42.005 --> 01:17:44.485
dem Johannes ordentliches Audio-Equipment

01:17:44.485 --> 01:17:45.805
schicken zum Beispiel.

01:17:46.305 --> 01:17:47.545
Ja, da müssen wir nochmal drüber nachdenken.

01:17:47.545 --> 01:17:49.485
Dann ist das jetzt hiermit der Spendenaufruf.

01:17:49.645 --> 01:17:52.365
Wenn die Zuhörer gerne möchten, dass ihr mich besser hören könnt,

01:17:52.365 --> 01:17:54.965
dann folgen wir

01:17:54.965 --> 01:17:55.705
mit Bitcoin-Adresse.

01:17:55.705 --> 01:17:57.045
Wir schalten ab jetzt einfach Werbung.

01:17:59.205 --> 01:18:02.585
Aber wenn ihr dann Werbung schalten würdet

01:18:02.585 --> 01:18:04.845
und dann auch Geld einnehmen würdet,

01:18:04.925 --> 01:18:06.825
dann könntet ihr euch ja auch richtige Gäste leisten.

01:18:07.765 --> 01:18:08.625
Wir haben keine richtigen Gäste.

01:18:08.625 --> 01:18:11.205
Ich wäre dann einfach gar nicht mehr hier.

01:18:11.865 --> 01:18:16.985
Vielleicht könnte man sich dann auch andere Hosts leisten,

01:18:17.085 --> 01:18:18.245
die das so etwas professioneller machen

01:18:18.245 --> 01:18:19.845
und sowieso eine andere Webseite,

01:18:20.005 --> 01:18:21.065
die auch nicht so schnacker aussieht.

01:18:22.405 --> 01:18:23.825
Was könnten wir denn dann eigentlich machen?

01:18:24.045 --> 01:18:25.065
Dann könnten wir uns ein Strand kaufen.

01:18:25.705 --> 01:18:28.065
zur Ruhe setzen und mal eure Hobbys verfolgen.

01:18:28.185 --> 01:18:29.025
Vielleicht, keine Ahnung.

01:18:29.325 --> 01:18:30.525
Vielleicht machen wir einen Podcast auf.

01:18:30.525 --> 01:18:31.025
Ja.

01:18:35.025 --> 01:18:35.325
Naja.

01:18:36.625 --> 01:18:46.498
Ich warte immer noch auf mein Schloss Ja M du auch noch einen Spendenaufruf starten Also mein Spendenaufruf war f ein gescheites Mikrofon Dominiks Spendenaufruf ist f ein Schloss

01:18:47.478 --> 01:18:48.898
Ja, für mein, nicht für ein Schloss,

01:18:48.958 --> 01:18:49.538
für mein Schloss.

01:18:49.558 --> 01:18:50.438
Ja, ja, für sein Schloss.

01:18:52.358 --> 01:18:54.658
In diesen ganzen anderthalb Stunden,

01:18:54.758 --> 01:18:55.918
wo wir jetzt schon zusammensitzen,

01:18:56.578 --> 01:18:58.998
haben wir jetzt tatsächlich noch gar nicht drüber gesprochen,

01:18:59.118 --> 01:19:00.338
was ein Hashmap überhaupt ist.

01:19:00.418 --> 01:19:01.398
Du hast die Stunde vorher vergessen,

01:19:01.398 --> 01:19:03.158
wenn wir gebraucht haben, unser Audioequipment vorzubereiten,

01:19:03.238 --> 01:19:03.618
obwohl wir alle...

01:19:03.618 --> 01:19:06.398
Ja, das ist halt am einen schlechten Mikrofon, aber...

01:19:06.618 --> 01:19:08.978
Trotzdem sind wir noch nicht so weit gekommen

01:19:08.978 --> 01:19:10.858
zu erklären, was überhaupt eine Hashmap ist

01:19:10.858 --> 01:19:11.618
und wie sie funktioniert

01:19:11.618 --> 01:19:14.698
Das ist irgendwas, wo man

01:19:14.698 --> 01:19:16.838
ganz schnell nachgucken kann, weil man direkt weiß, wo es ist

01:19:16.838 --> 01:19:18.458
Also man kann quasi dem Key

01:19:18.458 --> 01:19:21.078
ansehen, wo er sein muss

01:19:21.078 --> 01:19:21.578
oder so

01:19:21.578 --> 01:19:24.718
Dem Key nicht, aber man kann aus dem Key was

01:19:24.718 --> 01:19:25.418
rauskitzeln

01:19:25.418 --> 01:19:28.898
Okay, aber aus diesem Rauskitzeln weiß man direkt, wo es sein muss

01:19:28.898 --> 01:19:31.118
weil das irgendwie

01:19:31.118 --> 01:19:33.678
Ja, der Trick ist

01:19:33.678 --> 01:19:36.598
und der Trick ist im Wesentlichen schon im Namen.

01:19:36.838 --> 01:19:39.478
Also man nimmt nicht die Keys selber, sondern man nimmt Hashes von Keys.

01:19:39.698 --> 01:19:41.078
Deswegen muss es auch hashable sein.

01:19:41.498 --> 01:19:42.778
Genau, deshalb muss es hashable sein.

01:19:43.698 --> 01:19:49.258
Und weil eine Eigenschaft eine Hash-Funktion sein soll,

01:19:50.278 --> 01:19:52.478
dass sie nicht vorhersehbar ist, bedeutet das auch,

01:19:52.798 --> 01:19:57.838
dass sie gleich verteilt ist über den Raum der möglichen Hash-Ausgänge.

01:19:58.858 --> 01:20:01.758
Das bedeutet, wenn ich aus einem Wert einen Hash mache,

01:20:01.758 --> 01:20:31.738
und Jochen unterhalten sich über die Programmiersprache Python

01:20:31.758 --> 01:20:33.078
macht da viele coole Tricks,

01:20:33.858 --> 01:20:33.958
die

01:20:33.958 --> 01:20:37.538
dir helfen. Magie.

01:20:37.818 --> 01:20:39.718
Aber das ist bei einer Hashmap

01:20:39.718 --> 01:20:41.778
immer so, die hat so einen Füllungsgrad,

01:20:41.858 --> 01:20:43.518
wir haben es vorhin schon angesprochen, bei Python ist es

01:20:43.518 --> 01:20:45.778
maximal zwei Drittel voll. Also Wurzel

01:20:45.778 --> 01:20:47.877
drei, hast du gesagt. Wurzel drei

01:20:47.877 --> 01:20:48.978
wäre noch besser, aber

01:20:48.978 --> 01:20:51.518
das ist halt leider kein Integer.

01:20:51.638 --> 01:20:52.778
Ist das der goldene Schnitt? Nein.

01:20:54.718 --> 01:20:55.778
Nee, der goldene Schnitt ist

01:20:55.778 --> 01:20:57.858
1,618 noch was.

01:20:58.078 --> 01:20:59.738
Was ist Wurzel drei? Der heißt auch

01:20:59.738 --> 01:20:59.958
V.

01:21:01.758 --> 01:21:03.498
Brüssel 3 ist 1,7.

01:21:03.918 --> 01:21:04.458
Das war knapp.

01:21:08.318 --> 01:21:09.377
Vielleicht noch besser.

01:21:09.638 --> 01:21:10.978
Ist übrigens auch interessant, weil

01:21:10.978 --> 01:21:13.478
ternäre Logik wäre besser, weil das

01:21:13.478 --> 01:21:15.018
an irgendeiner Zahl dran ist.

01:21:15.078 --> 01:21:16.377
Ach, keine Ahnung, spielt keine Rolle jetzt.

01:21:18.218 --> 01:21:19.138
Das Wichtige ist,

01:21:19.958 --> 01:21:22.138
wenn ich aus einem

01:21:22.138 --> 01:21:23.478
Diktionario rauslesen möchte,

01:21:25.078 --> 01:21:25.858
dann nehme ich

01:21:25.858 --> 01:21:27.838
den Key, den ich lesen möchte

01:21:27.838 --> 01:21:28.618
und hashe den

01:21:28.618 --> 01:21:31.578
und nehme dann diesen Hash

01:21:31.578 --> 01:21:33.158
als Index in eine Liste rein.

01:21:33.838 --> 01:21:35.698
Und wenn in dieser Liste an der Stelle was steht,

01:21:36.578 --> 01:21:37.338
was nicht None ist,

01:21:39.078 --> 01:21:39.958
dann ist es der Wert,

01:21:40.698 --> 01:21:41.838
der zu diesem

01:21:41.838 --> 01:21:42.838
Key gespeichert wurde.

01:21:44.998 --> 01:21:46.118
Und umgekehrt,

01:21:46.158 --> 01:21:47.498
wenn ich in eine

01:21:47.498 --> 01:21:49.538
HashMap etwas reinschreiben möchte,

01:21:50.678 --> 01:21:51.098
dann

01:21:51.098 --> 01:21:53.578
mache ich den Hash aus diesem Key

01:21:53.578 --> 01:21:55.377
und schreibe den Wert

01:21:55.377 --> 01:21:57.658
in diese Liste

01:21:57.658 --> 01:21:59.638
an der Stelle des HashIndex

01:21:59.638 --> 01:22:02.018
rein. Und das ist sozusagen der Trick.

01:22:02.578 --> 01:22:03.598
Ich berechne einen

01:22:03.598 --> 01:22:05.938
zufälligen Index

01:22:05.938 --> 01:22:06.698
in diese Liste,

01:22:07.838 --> 01:22:09.758
weil der gleich verteilt ist, weil diese

01:22:09.758 --> 01:22:11.198
Hash-Funktion gleich verteilt ist,

01:22:12.038 --> 01:22:13.798
füllt die diese Liste gleichmäßig auf

01:22:13.798 --> 01:22:14.738
und

01:22:14.738 --> 01:22:17.438
kann dann

01:22:17.438 --> 01:22:20.218
eben in O von 1,

01:22:20.338 --> 01:22:21.838
weil diese Berechnung dieses Hashes immer

01:22:21.838 --> 01:22:23.938
gleich lange dauert, diesen zufälligen Index

01:22:23.938 --> 01:22:25.598
finden und dann da reinschreiben.

01:22:25.938 --> 01:22:27.678
Jetzt gibt es ein Problem. Was ist, wenn

01:22:27.678 --> 01:22:32.038
wenn zwei Keys auf den gleichen Hash-Index zeigen.

01:22:32.718 --> 01:22:33.898
Und das passiert.

01:22:34.258 --> 01:22:36.918
Wenn wir ein Dictionary haben, was acht Einträge hat,

01:22:37.618 --> 01:22:40.238
dann ist die Wahrscheinlichkeit, dass zwei auf den gleichen Index zeigen,

01:22:40.358 --> 01:22:41.078
vergleichsweise hoch.

01:22:41.758 --> 01:22:42.538
Eins zu acht.

01:22:44.318 --> 01:22:47.498
Das heißt, man muss sich eine Technik überlegen,

01:22:47.618 --> 01:22:49.898
um sogenannte Kollisionen zu vermeiden.

01:22:51.798 --> 01:22:53.138
Und da gibt es zwei Möglichkeiten.

01:22:53.138 --> 01:22:57.178
Entweder kann ich sagen, jeder Eintrag in meinem Dictionary ist eine Liste.

01:22:57.678 --> 01:23:00.378
das heißt, wenn zwei auf die gleiche Sache

01:23:00.378 --> 01:23:02.278
hashen, dann muss ich halt durch diese Liste durchgucken

01:23:02.278 --> 01:23:03.798
und da den entsprechenden Wert rausholen

01:23:03.798 --> 01:23:05.558
das heißt Chaining

01:23:05.558 --> 01:23:06.718
oder

01:23:06.718 --> 01:23:10.238
man kann einen neuen Hash berechnen

01:23:10.238 --> 01:23:12.198
und sagen, wenn da eine Kollision ist, dann

01:23:12.198 --> 01:23:14.558
verändere ich meine Hash-Berechnung

01:23:14.558 --> 01:23:16.298
und

01:23:16.298 --> 01:23:18.458
wähle sozusagen einen neuen zufälligen Hash

01:23:18.458 --> 01:23:20.318
und die Wahrscheinlichkeit, dass da eine Kollision auftritt

01:23:20.318 --> 01:23:22.318
wird eben jedes Mal kleiner und das heißt

01:23:22.318 --> 01:23:22.998
Open Addressing

01:23:22.998 --> 01:23:26.158
und Python Dictionaries machen tatsächlich Open Addressing

01:23:26.158 --> 01:23:27.838
das heißt die haben keine Liste

01:23:27.838 --> 01:23:29.978
an jeder Stelle gespeichert

01:23:29.978 --> 01:23:31.798
sondern die sagen halt wenn da eine Kollision ist

01:23:31.798 --> 01:23:34.038
wenn das nicht der richtige Key ist den ich da gefunden habe

01:23:34.038 --> 01:23:35.298
dann

01:23:35.298 --> 01:23:37.958
muss ich diesen Prozess fortsetzen

01:23:37.958 --> 01:23:40.038
muss einfach sozusagen nochmal

01:23:40.038 --> 01:23:41.238
einen Hash berechnen

01:23:41.238 --> 01:23:44.118
Ja da wird dann so ein

01:23:44.118 --> 01:23:46.118
Counter mitlaufen gelassen damit man

01:23:46.118 --> 01:23:47.938
eben wieder diese Eigenschaft hat aber sozusagen

01:23:47.938 --> 01:23:49.918
diese Bits wiederverwenden kann

01:23:49.918 --> 01:23:51.958
dass du nicht

01:23:51.958 --> 01:23:54.058
in zwei Richtungen wächst sondern dass

01:23:54.058 --> 01:23:55.498
deine Hash einfach nur in eine Richtung

01:23:55.498 --> 01:23:59.418
Das sind Implementierungsdetails.

01:23:59.538 --> 01:24:01.958
Aber das ist im Wesentlichen die Magie, dass man aus dem Key

01:24:01.958 --> 01:24:03.818
einen Hash berechnet und dieser Hash hat eine gewisse

01:24:03.818 --> 01:24:05.578
Eigenschaft und die heißt gleich verteilt.

01:24:06.758 --> 01:24:07.818
Und auch wenn ich die auf

01:24:07.818 --> 01:24:09.918
einen Index zusammendampfe, dann sind sie immer noch

01:24:09.918 --> 01:24:11.318
gleich verteilt und das ist der Trick da drin.

01:24:11.898 --> 01:24:13.698
Bedeutet halt, dass der Key hashable sein muss.

01:24:14.918 --> 01:24:15.678
Es gibt eine ähnliche

01:24:15.678 --> 01:24:17.238
Struktur, die heißt TreeMap.

01:24:19.238 --> 01:24:19.938
Da werden die

01:24:19.938 --> 01:24:21.258
Keys in einen Tree abgelegt.

01:24:21.478 --> 01:24:23.878
Dann müssen sie nicht hashable sein, dann müssen sie sortierbar sein.

01:24:25.498 --> 01:24:29.438
und dann habe ich halt einen Tree, dann habe ich Zugriffe, die alle logenden sind.

01:24:30.298 --> 01:24:33.818
Genau, ich weiß nicht, ob es immer noch so ist,

01:24:34.058 --> 01:24:43.258
die Hash-Map-Default-Implementation der Standard-C++-Bibliothek von Boost war irgendwie so ein Tree-Map

01:24:43.258 --> 01:24:50.018
und hat dann irgendwie, als wenn man was optimieren wollte, dann ein C++ geschrieben haben

01:24:50.018 --> 01:24:53.258
und dann war das überraschend von der Performance her, weil das war dann hinterher langsamer.

01:24:53.258 --> 01:24:55.998
großartig

01:24:55.998 --> 01:24:59.918
in Java gibt es diese beiden Optionen

01:24:59.918 --> 01:25:01.618
unter diesen Namen, es gibt HashMap und es gibt

01:25:01.618 --> 01:25:03.618
DreamMap, das heißt bei Java muss man sich immer

01:25:03.618 --> 01:25:04.598
raussuchen, was man haben möchte

01:25:04.598 --> 01:25:07.658
die Antwort ist immer HashMap, aber egal

01:25:07.658 --> 01:25:15.298
und natürlich bei einer HashMap

01:25:15.298 --> 01:25:17.298
ist das, dass man immer Hash-Funktionen haben muss

01:25:17.298 --> 01:25:19.498
und Hash-Funktionen sind auch so eine Sache

01:25:19.498 --> 01:25:21.518
die müssen schnell sein

01:25:21.518 --> 01:25:23.338
und trotzdem gut und ich möchte gerne viele

01:25:23.338 --> 01:25:24.798
verschiedene haben und

01:25:24.798 --> 01:25:27.378
die sollen alle schnell sein und alle möglichst gut

01:25:27.378 --> 01:25:29.538
und da die richtige Hash-Funktion

01:25:29.538 --> 01:25:31.598
rauszufinden und eine gute Implementation

01:25:31.598 --> 01:25:33.258
davon zu haben, ist nicht ganz einfach.

01:25:35.278 --> 01:25:36.498
Welche wird verwendet?

01:25:37.298 --> 01:25:38.058
Das weiß ich nicht.

01:25:39.798 --> 01:25:41.357
Ich stelle die Frage.

01:25:41.638 --> 01:25:42.318
Ja, das weiß ich nicht.

01:25:42.738 --> 01:25:45.598
Es gibt ja so Hash-Funktionen, die kennt man ja. Es gibt MD5

01:25:45.598 --> 01:25:47.898
und SHA-1 und SHA-256

01:25:47.898 --> 01:25:49.678
und CRC32

01:25:49.678 --> 01:25:51.418
und die sind aber alle nicht

01:25:51.418 --> 01:25:52.098
geeignet dafür.

01:25:53.238 --> 01:25:55.318
Und dann gibt es so welche, die kennt man überhaupt nicht

01:25:55.318 --> 01:25:57.578
und die haben auch abgefahrene

01:25:57.578 --> 01:25:59.498
lustige Namen, von denen ich jetzt keinen

01:25:59.498 --> 01:26:01.058
einzigen sagen kann, weil ich kenne sie ja nicht,

01:26:01.938 --> 01:26:03.118
die aber eben keine

01:26:03.118 --> 01:26:05.158
kryptografischen Hashes sind, sondern eben solche

01:26:05.158 --> 01:26:07.258
Hash-Funktionen, die man für solche Datenstrukturen verwendet,

01:26:08.158 --> 01:26:09.578
die dann

01:26:09.578 --> 01:26:11.318
halt aber andere Eigenschaften haben. Die brauchen dann nur

01:26:11.318 --> 01:26:13.298
acht Cycles und geben

01:26:13.298 --> 01:26:15.318
nur zwei Byte als Hash zurück oder irgendwie solchen

01:26:15.318 --> 01:26:17.278
Quatsch, weil das hierfür

01:26:17.278 --> 01:26:17.938
viel wichtiger ist.

01:26:18.738 --> 01:26:21.218
Ich kenne die Hash-Funktionen für

01:26:21.218 --> 01:26:26.118
für kleine Integers und die ist sehr einfach.

01:26:26.398 --> 01:26:27.598
Die ist das Integer selber.

01:26:29.398 --> 01:26:31.738
Also der Hash von 1 ist 1, der Hash von 2 ist 2.

01:26:32.498 --> 01:26:34.138
Aber das wird dann, wenn die Zahlen größer werden,

01:26:34.238 --> 01:26:34.857
ist das nicht mehr so toll.

01:26:34.857 --> 01:26:36.718
Aber was ist der Hash von 128, Jochen?

01:26:37.558 --> 01:26:38.938
Das glaube ich auch immer noch, 128.

01:26:39.718 --> 01:26:40.918
Ich glaube, es geht nur bis 127.

01:26:41.258 --> 01:26:41.398
Ja?

01:26:42.158 --> 01:26:44.598
Ich glaube, Small Integer in Python geht nur bis 127.

01:26:44.598 --> 01:26:46.658
Moment, Moment, ich habe doch hier die Rattle schon aufgemacht,

01:26:46.658 --> 01:26:49.918
da kann ich auch gleich nochmal Hash 128.

01:26:51.218 --> 01:26:53.218
Ich habe ja kürzlich ein paper.

01:26:53.218 --> 01:26:55.098
Aber wenn ich 512

01:26:55.098 --> 01:26:57.438
verdoppeln, war eine gute Strategie,

01:26:57.498 --> 01:26:57.998
habt ihr eben gesagt.

01:26:58.658 --> 01:26:59.478
512 ist auch immer noch,

01:26:59.638 --> 01:27:01.578
bei 1024 auch immer noch.

01:27:03.098 --> 01:27:05.338
512 ist bei Integers einfach immer so.

01:27:06.138 --> 01:27:07.118
Nein, nein,

01:27:07.218 --> 01:27:09.278
wenn die wirklich groß werden, dann ist es nicht so.

01:27:09.738 --> 01:27:10.958
Okay, sie müssen wirklich groß werden.

01:27:11.038 --> 01:27:13.258
Ich bin gerade schon bei einer Million, bei einer Milliarde.

01:27:13.357 --> 01:27:14.598
Dann sind es vermutlich 32.

01:27:14.898 --> 01:27:15.738
Über 32.

01:27:16.758 --> 01:27:19.218
An signed in, man weiß es nicht.

01:27:19.318 --> 01:27:20.258
Mal ein Minus.

01:27:20.258 --> 01:27:21.338
Ah, okay.

01:27:21.598 --> 01:27:23.278
Es gibt ja ein sehr schönes Paper, das heißt

01:27:23.278 --> 01:27:26.198
People Mistake Knowledge on the Internet

01:27:26.198 --> 01:27:27.098
for their own knowledge.

01:27:27.678 --> 01:27:29.218
Du hast eine gefunden. Also, ich habe eine gefunden,

01:27:29.498 --> 01:27:31.498
aber da musste ich jetzt schon irgendwie 20, 30 Nullen

01:27:31.498 --> 01:27:33.158
hintendran machen. Ich weiß gar nicht mehr, wie das heißt.

01:27:35.118 --> 01:27:35.758
Das sind die, die

01:27:35.758 --> 01:27:37.078
früher L hießen. Das ist auch super.

01:27:37.498 --> 01:27:38.598
Erstmal mal verdoppeln, also

01:27:38.598 --> 01:27:41.318
12.420, dann 10.000, 100.000,

01:27:41.398 --> 01:27:43.278
eine Million, 10 Millionen, 100 Millionen,

01:27:43.378 --> 01:27:45.278
dann auf einmal so. Ich weiß nicht, wie die Zahl

01:27:45.278 --> 01:27:47.378
jetzt da aufgefallen ist, aber ich weiß jetzt

01:27:47.378 --> 01:27:49.478
doch, bis wo denn das wohl ist.

01:27:49.478 --> 01:27:51.798
das ist wohl tatsächlich bis zur Grenze, bis zur 64-Bit-Grenze.

01:27:52.198 --> 01:27:53.338
Weil das, was hier rausgefallen ist,

01:27:53.378 --> 01:27:55.158
ist maximal 64-Bit.

01:27:55.218 --> 01:27:57.238
Aber wo Zeit-Implementation-Decay sind,

01:27:57.278 --> 01:27:59.058
das ist eigentlich Sines oder Unsines in Python?

01:27:59.258 --> 01:28:01.158
Und was ist das in 64 oder in 32?

01:28:01.158 --> 01:28:03.158
Sines meine ich.

01:28:04.458 --> 01:28:05.238
In Python

01:28:05.238 --> 01:28:07.178
die Integer sind Long-Integer.

01:28:07.818 --> 01:28:08.438
Also 64.

01:28:08.938 --> 01:28:11.418
Es gab früher eine Unterscheidung zwischen Long-Integer und Integer.

01:28:11.798 --> 01:28:12.898
Die gibt es seit Python 3 nicht mehr.

01:28:12.898 --> 01:28:15.198
Da ist jeder Integer eine Ganzzahl

01:28:15.198 --> 01:28:17.138
und die verhalten sich auch korrekt wie mathematische

01:28:17.138 --> 01:28:18.658
Ganzzahlen. Du kannst beliebig viele Stellen machen.

01:28:19.478 --> 01:28:21.598
Die Implementation dahinter schaltet um

01:28:21.598 --> 01:28:23.818
zwischen Integers und Long Integers.

01:28:24.058 --> 01:28:25.178
Aber das ist ja nur ein

01:28:25.178 --> 01:28:27.478
Implementationsdetail, das ist nur ein Umsetzungsdetail.

01:28:29.357 --> 01:28:30.938
Hash von minus eins minus...

01:28:30.938 --> 01:28:34.218
Hash von minus eins minus zwei, ja schön.

01:28:35.538 --> 01:28:36.178
Interessant, okay.

01:28:37.138 --> 01:28:37.918
Wieder was gelernt.

01:28:38.058 --> 01:28:40.138
Die exakte Funktion spielt gar keine Rolle.

01:28:41.078 --> 01:28:42.357
Wenn du Hash von irgendeinem String machst,

01:28:42.458 --> 01:28:43.698
kriegst du halt auch irgendeine Zahl raus.

01:28:45.438 --> 01:28:47.598
Das Wichtige ist eher, dass es schnell sein muss

01:28:47.598 --> 01:28:49.518
und dass es deterministisch ist

01:28:49.518 --> 01:28:51.318
und so weiter und diese ganzen Eigenschaften, die man

01:28:51.318 --> 01:28:52.378
so stellt an

01:28:52.378 --> 01:28:55.378
Funktionen und halt, dass

01:28:55.378 --> 01:28:57.218
es gleich verteilt ist über die Menge der Hashes.

01:28:57.338 --> 01:28:59.278
Und ich glaube, die Menge der Hashes, wenn du die Zahlen

01:28:59.278 --> 01:29:01.357
vor dir hast, Jochen, die sehen aus wie 32-Bit-Zahlen,

01:29:01.438 --> 01:29:01.498
oder?

01:29:02.878 --> 01:29:03.278
Ja.

01:29:04.418 --> 01:29:05.098
Minus 2?

01:29:07.678 --> 01:29:08.298
Minus 4.

01:29:08.958 --> 01:29:09.498
Nein, keine Ahnung.

01:29:10.978 --> 01:29:13.218
Oh, HASH-1 ist gleich HASH-2.

01:29:14.658 --> 01:29:14.857
Da.

01:29:15.058 --> 01:29:16.238
Da hast du direkt eine Kollision.

01:29:16.238 --> 01:29:17.658
und musste Open Addressing machen.

01:29:17.978 --> 01:29:19.318
Ja, okay.

01:29:20.758 --> 01:29:21.898
Ja, witzig, witzig.

01:29:22.818 --> 01:29:24.998
Das heißt, kann man Dict-Keys,

01:29:25.218 --> 01:29:26.298
wenn das Int sein können,

01:29:26.357 --> 01:29:27.478
können das auch negative Int sein?

01:29:27.778 --> 01:29:28.818
Ja, na klar.

01:29:29.618 --> 01:29:31.138
Alles was Flash-Build ist.

01:29:31.258 --> 01:29:34.578
Das heißt, wenn du minus 1 reinschreibst,

01:29:34.678 --> 01:29:36.078
dann muss er tatsächlich eine Kollision machen

01:29:36.078 --> 01:29:38.198
und minus 2, dann muss er quasi eine Ebene tiefer gehen.

01:29:38.518 --> 01:29:38.878
Ja, okay.

01:29:39.978 --> 01:29:42.158
Also man kann es auch deine eigenen Objekte

01:29:42.158 --> 01:29:44.278
machen. Ja, genau. Das ist auch etwas, was ich gerne

01:29:44.278 --> 01:29:44.978
mache tatsächlich.

01:29:46.238 --> 01:29:48.118
und was Leute mal so überrascht,

01:29:48.218 --> 01:29:49.857
wenn man dann Objekte als Keys hat,

01:29:50.038 --> 01:29:50.678
dann sagen die immer so

01:29:50.678 --> 01:29:53.838
Oh nein, das geht.

01:29:54.038 --> 01:29:54.478
Das ist okay.

01:29:54.998 --> 01:29:57.698
Du solltest dann eigentlich auch immer noch Frozen-Versionen machen.

01:29:58.158 --> 01:29:59.918
Also musst du dann eine Methode an deine Klasse dran machen,

01:30:00.018 --> 01:30:00.678
die hashable ist?

01:30:00.798 --> 01:30:02.498
Ja, das muss natürlich hashable sein.

01:30:02.938 --> 01:30:05.558
Und wie wird das hashable? Also was versucht der beim Hash denn zu machen?

01:30:05.878 --> 01:30:07.998
Du implementierst einfach dunder hash.

01:30:08.258 --> 01:30:08.998
Dunder hash, okay.

01:30:09.218 --> 01:30:11.338
Dann wird dir aufgerufen und dann kannst du,

01:30:11.478 --> 01:30:14.158
wenn du eine ID schon hast, dann kannst du die natürlich auch zurückgeben.

01:30:14.498 --> 01:30:16.218
Oder du kannst halt, ja,

01:30:16.238 --> 01:30:18.818
und das Bring Representation von deinem Effekt.

01:30:20.058 --> 01:30:22.058
Jedes Objekt ist doch hashable, oder?

01:30:22.658 --> 01:30:24.558
Die Objektidentität als Hashfunktion.

01:30:25.718 --> 01:30:26.718
Ja, das kann natürlich sein,

01:30:26.798 --> 01:30:28.258
dass das der Default ist.

01:30:30.538 --> 01:30:32.538
Wie könnte man das jetzt schnell rausfinden?

01:30:35.178 --> 01:30:37.498
Help, dann dann Hash.

01:30:38.618 --> 01:30:39.618
Help, dann dann Hash.

01:30:39.738 --> 01:30:40.278
Wie wäre das denn?

01:30:40.838 --> 01:30:42.118
Aber du kannst natürlich

01:30:42.118 --> 01:30:43.978
deine eigene Hash...

01:30:43.978 --> 01:30:45.378
Scheint so zu sein, ja.

01:30:45.378 --> 01:30:46.238
mal help, dann dein Hash.

01:30:48.798 --> 01:30:49.698
Du kannst natürlich

01:30:49.698 --> 01:30:51.678
deine eigene Funktion da reinschreiben. Das heißt, du kannst

01:30:51.678 --> 01:30:53.558
eine Hash-Methode schreiben,

01:30:53.758 --> 01:30:55.538
die für deine Objekte spezifisch ist.

01:30:56.798 --> 01:30:57.818
Aber wenn du das machst,

01:30:59.058 --> 01:30:59.758
wenn man seine eigene

01:30:59.758 --> 01:31:01.738
Hash-Methode implementiert, dann muss

01:31:01.738 --> 01:31:02.857
man wirklich darauf achten,

01:31:03.758 --> 01:31:05.618
dass sich Keys in dem Dictionary nicht ändern

01:31:05.618 --> 01:31:07.738
dürfen. Das heißt, wenn ich

01:31:07.738 --> 01:31:08.318
einem Objekt

01:31:08.318 --> 01:31:11.238
eine Hash-Funktion gebe,

01:31:11.558 --> 01:31:13.738
eine Hash-Methode gebe, die sich

01:31:13.738 --> 01:31:15.698
zwischendurch verändern kann, dann geht mein

01:31:15.698 --> 01:31:16.338
Dictionary kaputt.

01:31:18.658 --> 01:31:19.778
Und das geht dann auch

01:31:19.778 --> 01:31:21.598
gleich richtig kaputt, weil dann finde ich gar nichts mehr

01:31:21.598 --> 01:31:22.158
in meinem Dictionary.

01:31:26.538 --> 01:31:27.857
Ja, ja, ja.

01:31:27.938 --> 01:31:29.798
Also da muss man natürlich aufpassen.

01:31:29.938 --> 01:31:31.598
Aber ich meine, oft hat man ja tatsächlich eine

01:31:31.598 --> 01:31:32.398
ID, die man nehmen kann.

01:31:33.258 --> 01:31:35.678
Und bei der Hash-Print-Tool, man rechnet das nicht selber

01:31:35.678 --> 01:31:37.438
aus, sondern man gibt halt etwas zurück,

01:31:37.578 --> 01:31:39.438
was dann durch Hash nochmal durchläuft.

01:31:39.738 --> 01:31:41.038
Man fällt zurück auf irgendwas.

01:31:41.038 --> 01:31:43.218
Aber dass man halt sagt, okay, eine Adresse

01:31:43.218 --> 01:31:47.478
ist halt, der Hash einer Adresse ist der Hash aus der Straße und der Postleitzahl

01:31:47.478 --> 01:31:51.357
und der Stadt. Das ist ja schon irgendwie naheliegend, dass du halt

01:31:51.357 --> 01:31:53.598
irgendeinen wegbildest, was du dann hashst.

01:31:55.238 --> 01:31:58.318
Und klar, das kann man natürlich machen.

01:31:59.178 --> 01:32:03.258
In meiner Erfahrung tritt es nicht so häufig auf, aber wenn du sagst, dass du das gerne machst,

01:32:03.538 --> 01:32:05.478
dann...

01:32:05.478 --> 01:32:11.518
Mit Zusammenhang mit Data Classes,

01:32:11.518 --> 01:32:12.258
beziehungsweise so Atos.

01:32:12.918 --> 01:32:14.578
Dataclass ist ja automatisch hashable, oder?

01:32:14.938 --> 01:32:17.738
Ja, bei Dataclass, das weiß ich gar nicht so genau.

01:32:18.018 --> 01:32:18.978
Also ich habe das jetzt,

01:32:19.058 --> 01:32:20.338
was ich jetzt im Kopf habe, ist mit Atos.

01:32:20.838 --> 01:32:22.818
Da kann man dann auch solche Sachen sagen.

01:32:22.938 --> 01:32:25.418
Man kann es natürlich selber implementieren, aber man kann auch sagen,

01:32:25.758 --> 01:32:27.898
also es soll hashable sein

01:32:27.898 --> 01:32:29.978
und diese Attribute will ich dafür verwenden

01:32:29.978 --> 01:32:31.578
und die müssen dann natürlich auch in der Uni sein.

01:32:33.878 --> 01:32:35.598
Und dann macht es manchmal Sinn,

01:32:35.698 --> 01:32:37.538
weil dann kann man halt bestimmte Sachen

01:32:37.538 --> 01:32:39.218
look-upen

01:32:39.218 --> 01:32:40.638
mit einem anderen bestimmten Ding.

01:32:40.638 --> 01:32:42.738
und dann ist es manchmal ganz praktisch.

01:32:43.958 --> 01:32:45.338
Ja, das ist ja oft so,

01:32:45.458 --> 01:32:45.798
dass man

01:32:45.798 --> 01:32:48.998
seine Algorithmen beschleunigen kann,

01:32:49.058 --> 01:32:49.938
wenn man so ein Lookup macht,

01:32:50.838 --> 01:32:52.458
wenn es in dem Algorithmus vorkommt.

01:32:53.578 --> 01:32:55.058
Wir hatten einmal so einen Fall

01:32:55.058 --> 01:32:56.718
im Computerclub,

01:32:57.058 --> 01:32:59.158
da war der Bison auch da und hat da eben seinen Algorithmus

01:32:59.158 --> 01:33:01.078
mit einer Liste geschrieben,

01:33:01.078 --> 01:33:03.158
wo er dann eben immer die Elemente aus der Liste raussuchen

01:33:03.158 --> 01:33:05.038
musste, wo er immer nachgucken musste, habe ich diesen

01:33:05.038 --> 01:33:06.058
Knoten schon besucht

01:33:06.058 --> 01:33:08.778
in der Liste und das war halt O von N

01:33:08.778 --> 01:33:10.658
und dann haben wir es umgebaut zu einem Set,

01:33:12.558 --> 01:33:12.838
was

01:33:12.838 --> 01:33:14.938
im O von 1 ist, wo diese Operation O von 1

01:33:14.938 --> 01:33:16.758
ist und dann wird es halt deutlich schneller. Also wenn man

01:33:16.758 --> 01:33:18.038
das braucht, ist das

01:33:18.038 --> 01:33:19.938
schon ein super Power.

01:33:22.498 --> 01:33:22.857
Ja.

01:33:23.018 --> 01:33:23.138
Ja.

01:33:24.258 --> 01:33:26.018
Hast du noch etwas auf deiner Liste stehen, Johannes?

01:33:26.658 --> 01:33:28.178
Nee, ich habe jetzt tatsächlich meinen ganzen

01:33:28.178 --> 01:33:29.357
Notizzettel

01:33:29.357 --> 01:33:32.458
abgefrühstückt. Jochen, hast du noch was zu Dikt,

01:33:32.658 --> 01:33:34.578
was wir noch nicht gesehen haben? Also ja, was ich

01:33:34.578 --> 01:33:35.678
ganz gerne vielleicht noch

01:33:35.678 --> 01:33:38.458
sagen wollen würde oder so, ist halt,

01:33:38.458 --> 01:33:40.798
und dass man auch selber sich Sachen implementieren kann,

01:33:40.898 --> 01:33:42.218
die dann halt so funktionieren wie Dix.

01:33:42.658 --> 01:33:44.857
Es gibt ja seit Python 3.3, glaube ich,

01:33:45.378 --> 01:33:46.558
Protocols oder was weiß ich wie das.

01:33:46.778 --> 01:33:48.558
Man hat halt auf jeden Fall diese F-Sec-Base-Classes,

01:33:49.018 --> 01:33:50.918
wo es dann Interfaces für diese ganzen Geschichten gibt.

01:33:51.238 --> 01:33:52.898
Und da hat man dann halt...

01:33:52.898 --> 01:33:54.238
Moment, also Protocols sind

01:33:54.238 --> 01:33:56.458
fertige ABCs, F-Sec-Base-Classes

01:33:56.458 --> 01:33:58.458
für die Implementierung

01:33:59.098 --> 01:34:00.798
von Python-Modulen,

01:34:00.918 --> 01:34:01.338
die es schon gibt?

01:34:02.438 --> 01:34:04.258
Ach, cool. Die kommen ja auch fürs Typing der Modus.

01:34:04.638 --> 01:34:06.958
Ja, genau. Und die sind großartig fürs Typing.

01:34:06.958 --> 01:34:09.178
Da kann man nämlich richtig gutes Ducktyping

01:34:09.178 --> 01:34:10.558
machen, was aber trotzdem getypt ist.

01:34:10.718 --> 01:34:12.458
Genau, und dann kannst du eben

01:34:12.458 --> 01:34:15.218
für deinen Anwendungsfall

01:34:15.218 --> 01:34:17.357
etwas Spezielles hinbauen, wo du dann sicher sein kannst,

01:34:17.638 --> 01:34:19.138
dass sich das dann aber genauso verhält und

01:34:19.138 --> 01:34:21.278
auch an den Stellen verwendet werden kann,

01:34:21.578 --> 01:34:22.857
wo du normalerweise ein DIC benutzen würdest.

01:34:23.398 --> 01:34:25.178
Da kannst du auch sehr coole Sachen mitmachen.

01:34:26.498 --> 01:34:27.398
Wobei das Protokoll

01:34:27.398 --> 01:34:29.218
von einem DIC-Tiering ist ja vergleichsweise groß.

01:34:29.378 --> 01:34:30.058
Was ist das denn?

01:34:30.918 --> 01:34:32.558
Das ist, meine ich, mappable, aber

01:34:32.558 --> 01:34:35.238
ich gucke mal gerade, wo haben wir das denn da?

01:34:35.698 --> 01:34:36.798
Es gibt Mapping.

01:34:36.958 --> 01:34:38.238
Mapping heißt das, genau.

01:34:39.538 --> 01:34:41.098
Ein Mapping. Mutable Mapping.

01:34:42.738 --> 01:34:43.138
So,

01:34:43.898 --> 01:34:45.218
ach, jetzt steht das Interface

01:34:45.218 --> 01:34:45.738
hier aber nicht dabei.

01:34:47.178 --> 01:34:48.238
Collections.abc

01:34:48.238 --> 01:34:50.958
Import. Abstract

01:34:50.958 --> 01:34:53.038
Base Class. Moment, ich importiere

01:34:53.038 --> 01:34:54.918
das gerade mal. Mach mal ein Diagramm. Ja, das ist cool, weil dann kannst du

01:34:54.918 --> 01:34:57.038
einfach von Mapping ergen lassen und alles, was du nicht implementiert

01:34:57.038 --> 01:34:58.898
hast, wird dann einfach direkt geraced.

01:35:00.138 --> 01:35:00.978
Genau. Wenn das halt

01:35:00.978 --> 01:35:01.438
nicht da ist.

01:35:02.198 --> 01:35:04.938
Beziehungsweise ein MyPy oder ein TypeChecker sagt dir der auch

01:35:04.938 --> 01:35:06.838
direkt das. Ja, genau. Du wirst direkt gezwungen, das richtig zu

01:35:06.838 --> 01:35:07.357
implementieren.

01:35:09.978 --> 01:35:11.158
ABC Broad Collections.

01:35:11.178 --> 01:35:12.158
Ja, ich habe mich gerade geschützt.

01:35:12.938 --> 01:35:14.818
Weil ABC ist ja die ABC selber drin.

01:35:14.818 --> 01:35:15.538
Ich weiß, ich weiß.

01:35:17.357 --> 01:35:18.938
Gleichzeitig reden, tippen

01:35:18.938 --> 01:35:19.678
und das alles.

01:35:21.638 --> 01:35:22.798
Mach mal ein neues Objekt

01:35:22.798 --> 01:35:23.658
von Mapping auf, einfach.

01:35:26.198 --> 01:35:27.238
Das kann ich nicht

01:35:27.238 --> 01:35:27.398
interessieren.

01:35:27.418 --> 01:35:31.218
Das geht nicht.

01:35:31.538 --> 01:35:33.138
Genau, da steht aber jetzt dann, was du brauchst.

01:35:34.438 --> 01:35:35.318
Ja, okay.

01:35:35.318 --> 01:35:38.478
Ich muss da GetItem, Itter und Längen definieren

01:35:38.478 --> 01:35:39.738
von meinem Wrapping.

01:35:40.318 --> 01:35:42.538
Okay, zumindest. Also das Interface

01:35:42.538 --> 01:35:44.438
selber ist jetzt doch etwas größer. Das sind halt

01:35:44.438 --> 01:35:46.338
37

01:35:46.338 --> 01:35:48.578
Methoden und das ist natürlich

01:35:48.578 --> 01:35:50.478
schon eine ganze Menge. Ja, das hatten wir ja vorhin auch schon

01:35:50.478 --> 01:35:52.478
angesprochen, dass eben Dicts relativ

01:35:52.478 --> 01:35:53.578
viel Oberfläche haben.

01:35:54.918 --> 01:35:56.438
Weil sie halt für alles verwendet werden.

01:35:57.518 --> 01:35:57.638
Ja.

01:35:59.317 --> 01:36:00.458
Ja, aber eben.

01:36:00.678 --> 01:36:01.778
Also man kann das halt verwenden.

01:36:02.778 --> 01:36:03.538
Interessant, interessant.

01:36:03.538 --> 01:36:05.378
Ja

01:36:05.378 --> 01:36:07.198
Ist das euer Lieblingsdatentyp?

01:36:09.918 --> 01:36:11.758
Ja, also von den primitiven Dingen

01:36:11.758 --> 01:36:13.438
auf jeden Fall, ich hab das auch letztens

01:36:13.438 --> 01:36:15.857
diese ganzen Type-Hints

01:36:15.857 --> 01:36:18.078
Typisierungsgeschichten

01:36:18.078 --> 01:36:19.718
die es jetzt neuerdings gibt, es gibt ja immer so

01:36:19.718 --> 01:36:21.298
auf Twitter gibt es dann so die

01:36:21.298 --> 01:36:23.738
alten Säcke, die da rumhängen und

01:36:23.738 --> 01:36:25.898
die äußern sich

01:36:25.898 --> 01:36:27.218
Wie alt bist du gleich noch?

01:36:27.218 --> 01:36:28.018
Wie jung genug war

01:36:28.018 --> 01:36:31.298
Ja, sie sind noch alt

01:36:31.298 --> 01:36:32.878
Die im Kopf alten Säcke

01:36:32.878 --> 01:36:35.338
Ja, nee, also

01:36:35.338 --> 01:36:37.498
verdiente Veteranen

01:36:37.498 --> 01:36:39.278
Ah ja, ja, ja, okay, sehr schön, sehr schön auch

01:36:39.278 --> 01:36:41.278
der Python Community und

01:36:41.278 --> 01:36:43.758
die sich manchmal so ein bisschen despektierlich äußern

01:36:43.758 --> 01:36:45.218
was so, was diese ganzen

01:36:45.218 --> 01:36:46.798
neuen Entwicklungen angeht, ja

01:36:46.798 --> 01:36:48.258
Die ganze Scheiße ist gar nicht mehr Pythonic

01:36:48.258 --> 01:36:51.218
Genau, und so ein bisschen kann ich das natürlich auch, kann ich das nachvollziehen

01:36:51.218 --> 01:36:53.558
muss ich sagen, also zum Beispiel, ich sag jetzt mal

01:36:53.558 --> 01:36:55.518
einen Namen, David Beasley zum Beispiel

01:36:55.518 --> 01:36:57.518
der ganz viel cooles

01:36:57.518 --> 01:36:59.158
Zeug gemacht hat, der auch eines der besten

01:36:59.158 --> 01:37:01.098
Bücher, Python Bücher geschrieben hat, irgendwie

01:37:01.098 --> 01:37:03.538
Essential Reference, glaube ich.

01:37:03.817 --> 01:37:05.398
War lange super. Jetzt gibt es

01:37:05.398 --> 01:37:07.238
da sogar Python Distilled. Ist jetzt

01:37:07.238 --> 01:37:09.398
nochmal eine neue Ausgabe.

01:37:10.498 --> 01:37:11.078
Super Buch.

01:37:11.638 --> 01:37:13.258
Und der sagt so, also

01:37:13.258 --> 01:37:14.878
ich weiß nicht, dieses ganze Typing-Zeugs,

01:37:15.578 --> 01:37:17.518
ich finde, das sieht nicht gut aus.

01:37:17.578 --> 01:37:18.878
Ich mag das nicht. Und was wir

01:37:18.878 --> 01:37:21.317
früher, als wir nichts hatten, was wir gemacht haben,

01:37:21.598 --> 01:37:23.218
wir haben immer irgendwie Dicts genommen

01:37:23.218 --> 01:37:25.238
und ein paar List Comprehensions und damit haben

01:37:25.238 --> 01:37:26.758
wir alles gemacht. Alles haben wir damit gemacht.

01:37:27.078 --> 01:37:29.118
Und das war viel besser, als wenn einer sich mit

01:37:29.118 --> 01:37:30.798
Java hingesetzt hat und dann irgendwie so

01:37:30.798 --> 01:37:32.838
angefangen, erstmal Interfaces zu definieren

01:37:32.838 --> 01:37:34.138
und dann irgendwie, keine Ahnung,

01:37:34.618 --> 01:37:35.698
sich erstmal in

01:37:35.698 --> 01:37:38.958
so ein

01:37:38.958 --> 01:37:40.918
Spinnennetz aus komischen Dingen,

01:37:40.938 --> 01:37:42.598
die man alle so machen muss, weil man sie halt machen muss,

01:37:42.778 --> 01:37:44.878
hinschreibt, genau,

01:37:44.978 --> 01:37:46.198
Getter, Setter, dieses ganze Zeugs.

01:37:46.578 --> 01:37:47.898
Dann hat man sich in so einem Spinnennetz von Dingen

01:37:47.898 --> 01:37:50.698
verheddert, bevor man auch nur

01:37:50.698 --> 01:37:52.378
eine Teile produktiven Code geschrieben hat.

01:37:52.438 --> 01:37:54.518
Und dann ist man mit den Dicks und den Lisp Comprehensions

01:37:54.518 --> 01:37:55.258
so lange fertig.

01:37:55.998 --> 01:37:57.878
Und damit hat er nicht so ganz Unrecht.

01:37:58.298 --> 01:38:00.718
Tatsächlich ist es so, dass Dicks, wenn man das beherrscht,

01:38:00.718 --> 01:38:02.598
und so wirklich verstanden hat, wie das funktioniert,

01:38:02.758 --> 01:38:04.278
mit eben vielleicht noch

01:38:04.278 --> 01:38:06.518
DigComprehensions, vielleicht noch

01:38:06.518 --> 01:38:08.498
GeneratorExpressions würde ich dazu nehmen und

01:38:08.498 --> 01:38:10.638
ListComprehensions. Damit kann man

01:38:10.638 --> 01:38:12.658
einen Großteil von dem, was man so

01:38:12.658 --> 01:38:14.518
im Alltag an Programmierproblemen hat,

01:38:14.658 --> 01:38:15.878
tatsächlich lösen und

01:38:15.878 --> 01:38:18.518
es ist sehr, ja,

01:38:18.838 --> 01:38:19.798
man kommt da schnell hin.

01:38:19.998 --> 01:38:22.198
Sehr convenient und halt dem Python-Prinzip eigentlich.

01:38:22.718 --> 01:38:23.898
Simples, better than complex.

01:38:24.618 --> 01:38:26.238
Das ist auch so ein bisschen die Stärke

01:38:26.238 --> 01:38:27.317
von Python.

01:38:28.258 --> 01:38:29.357
Ich muss auch

01:38:29.357 --> 01:38:31.298
gelegentlich andere Sprachen machen, jetzt so ein bisschen

01:38:31.298 --> 01:38:33.498
TypeScript kommt auf mich zu und

01:38:33.498 --> 01:38:34.638
C Sharp

01:38:34.638 --> 01:38:37.598
und da sind solche Mapping-Typen

01:38:37.598 --> 01:38:39.438
einfach unhandlich, die sind einfach

01:38:39.438 --> 01:38:41.698
schwieriger zu benutzen.

01:38:42.278 --> 01:38:43.498
Du musst definieren,

01:38:43.578 --> 01:38:45.198
was da für Typen drin sind, nicht in TypeScript.

01:38:45.357 --> 01:38:46.158
In TypeScript kannst du einfach,

01:38:46.938 --> 01:38:49.158
der Trick an TypeScript, kannst du einfach immer Annie sagen.

01:38:50.738 --> 01:38:51.558
Jeder Typ ist Annie

01:38:51.558 --> 01:38:53.698
in TypeScript, aber in C Sharp

01:38:53.698 --> 01:38:55.538
kannst du es auch machen, kannst du auch

01:38:55.538 --> 01:38:56.418
Annie sagen, aber

01:38:56.418 --> 01:38:58.258
wird nicht gerne gesehen.

01:38:58.258 --> 01:39:01.118
Also mein letzter Lippet Andy übrigens, der sagt, das reicht ihm nicht.

01:39:01.658 --> 01:39:02.378
Ja, okay, gut.

01:39:02.618 --> 01:39:04.838
Das ist eine Einstellungsnachricht, das kannst du ja abschneiden.

01:39:04.838 --> 01:39:05.317
Ja, kann ich.

01:39:05.758 --> 01:39:06.458
Das geht trotzdem.

01:39:08.258 --> 01:39:14.158
Aber es ist einfach unhandlicher und das ist auch sowas, wenn man sich an diese Art zu denken gewöhnt hat,

01:39:14.918 --> 01:39:16.118
dann sieht man auch überall Dictionaries.

01:39:16.938 --> 01:39:18.338
Und dann will man sie auch überall verwenden.

01:39:18.478 --> 01:39:22.518
Deshalb mir fällt die Schauprogrammierung sehr, sehr schwer, weil ich mir ganz oft denke,

01:39:22.598 --> 01:39:25.578
ja, da könnte ich jetzt einen Dictionary verwenden, aber kann ich an der Stelle nicht.

01:39:25.578 --> 01:39:29.978
und muss aber zwölf Umwege

01:39:29.978 --> 01:39:31.798
machen.

01:39:32.258 --> 01:39:33.618
Ich sehe aber auch, also

01:39:33.618 --> 01:39:35.718
ich sehe auch den Vorteil von diesen Typingern.

01:39:35.918 --> 01:39:37.718
Ich bin da ganz klar

01:39:37.718 --> 01:39:39.638
auf der Seite der jungen Hüpfer wie dir, Jochen.

01:39:42.357 --> 01:39:43.778
Und das ist für mich so ein bisschen

01:39:43.778 --> 01:39:45.598
diese, es gibt ja diesen klassischen

01:39:45.598 --> 01:39:47.618
Kampf zwischen Explore and

01:39:47.618 --> 01:39:48.098
Exploit,

01:39:51.978 --> 01:39:53.438
wo jeder entscheiden muss,

01:39:53.678 --> 01:39:55.018
was er machen muss, um

01:39:55.018 --> 01:39:56.438
um ein Problem zu lösen.

01:39:56.578 --> 01:39:59.018
Explore heißt unbekannte Dinge angucken

01:39:59.018 --> 01:40:00.958
und Exploit heißt bekannte Dinge so lange gegenhauen,

01:40:01.058 --> 01:40:01.898
bis es irgendwie kaputt geht.

01:40:02.558 --> 01:40:05.058
Ja genau, also Explore heißt Lösungen ausprobieren,

01:40:05.278 --> 01:40:07.498
die dir selber noch nicht bekannt sind.

01:40:08.378 --> 01:40:09.538
Also suchen quasi.

01:40:09.678 --> 01:40:11.038
Und Exploit heißt Dinge anwenden,

01:40:11.158 --> 01:40:11.738
die du schon weißt.

01:40:13.398 --> 01:40:15.198
Und Menschen

01:40:15.198 --> 01:40:16.998
sind da halt sehr unterschiedlich und das ist tatsächlich

01:40:16.998 --> 01:40:18.118
wohl so, dass das mit dem Alter

01:40:18.118 --> 01:40:20.817
eher zu Exploit geht als zu Explore,

01:40:20.878 --> 01:40:22.978
was ja auch okay ist, weil du viel Explore schon

01:40:22.978 --> 01:40:25.078
gemacht hast und dann eben

01:40:25.078 --> 01:40:27.038
die Dinge anwendest, die du schon weißt. Wenn du mehr weißt,

01:40:27.118 --> 01:40:28.878
ist das natürlich effektiver, als wenn du weniger weißt.

01:40:28.978 --> 01:40:30.118
Kinder machen viel, viel mehr Explore.

01:40:30.118 --> 01:40:32.938
Ich wusste, dass einige Hacker schon von Anfang an

01:40:32.938 --> 01:40:34.118
Greise im Kopf gewesen sind.

01:40:34.478 --> 01:40:35.738
Ja, das...

01:40:35.738 --> 01:40:39.058
Man muss sich das auch manchmal wieder

01:40:39.058 --> 01:40:40.998
zurück in den Kopf rufen, dass man vielleicht

01:40:40.998 --> 01:40:42.978
gelegentlich wieder Explore machen muss. Das ist auch

01:40:42.978 --> 01:40:44.878
der Grund, warum ich C-Sharp und TypeScript und so weiter mache,

01:40:45.138 --> 01:40:46.718
damit man mal ein bisschen wieder was anderes macht.

01:40:46.718 --> 01:40:48.538
Ich dachte, C-Sharp machst du, damit du endlich noch ein Spiel

01:40:48.538 --> 01:40:50.158
realisieren kannst. Ja,

01:40:50.498 --> 01:40:52.638
irgendwie muss man ja sein Schloss sicher

01:40:52.638 --> 01:40:53.018
arbeiten.

01:40:55.118 --> 01:40:56.658
Wie erschlossen arbeiten?

01:40:56.878 --> 01:40:58.357
Das spricht sich doch schon von alleine.

01:41:00.018 --> 01:41:00.618
Ja, erben,

01:41:00.978 --> 01:41:01.438
ich glaube,

01:41:01.817 --> 01:41:03.138
wird bei mir schwierig.

01:41:03.518 --> 01:41:05.698
Oder erobern. Schlösser müssen eigentlich geobert werden

01:41:05.698 --> 01:41:08.438
mit Verteidigungsanlagen. Oder heirat.

01:41:09.838 --> 01:41:10.838
Ja, das ist auch eine Art

01:41:10.838 --> 01:41:11.298
der Eroberung.

01:41:11.298 --> 01:41:12.738
Ja, das ist eine gewisse Art.

01:41:13.938 --> 01:41:14.817
Sieht bei mir jetzt

01:41:14.817 --> 01:41:17.198
so gut aus. Ich bin schon

01:41:17.198 --> 01:41:19.158
verheiratet und mit Erben.

01:41:19.478 --> 01:41:20.938
Ich habe meinen Vater gefragt, aber

01:41:20.938 --> 01:41:23.018
im Inventar.

01:41:23.698 --> 01:41:25.598
Hast halt die hübsche genommen, ist ja eine schlechte Entscheidung.

01:41:28.018 --> 01:41:28.458
Absolut.

01:41:29.098 --> 01:41:31.458
Und hübsch und schlau, das sind ja schon zwei Ereignschaften,

01:41:31.857 --> 01:41:33.398
die man sonst nicht im Paket kriegt.

01:41:35.238 --> 01:41:37.138
Hat mich mein Vater gefragt, wann du das Erb

01:41:37.138 --> 01:41:38.738
direkt die Schlösser austauschen lässt.

01:41:45.398 --> 01:41:47.158
Ja, aber das ist eben, man muss

01:41:47.158 --> 01:41:49.438
sich auch immer wieder in den Kopf rufen,

01:41:49.438 --> 01:41:51.338
dass man ein bisschen Explore macht und nicht nur Exploit

01:41:51.338 --> 01:41:53.438
also nicht nur das anwenden was man kann, sondern auch mal was

01:41:53.438 --> 01:41:54.538
ausprobieren was man noch nicht kann

01:41:54.538 --> 01:41:57.718
und Dictionaries und Typing

01:41:57.718 --> 01:41:59.478
gehören halt

01:41:59.478 --> 01:42:01.278
dazu. Es gibt so eine

01:42:01.278 --> 01:42:02.778
witzige Liste von

01:42:02.778 --> 01:42:05.438
wie man Programmiersprachen beschreiben kann

01:42:05.438 --> 01:42:07.418
und die fangen alle an mit

01:42:07.418 --> 01:42:09.658
What if everything was

01:42:09.658 --> 01:42:11.418
und C zum Beispiel

01:42:11.418 --> 01:42:13.018
bei C ist das Mandat

01:42:13.018 --> 01:42:15.357
What if everything was a pointer und in Java

01:42:15.357 --> 01:42:16.938
ist What if everything was an object

01:42:16.938 --> 01:42:19.298
und Python ist halt

01:42:19.298 --> 01:42:20.378
What if everything was a dictionary?

01:42:21.198 --> 01:42:23.258
Und das ist schon so. Dictionaries sind so ein bisschen

01:42:23.258 --> 01:42:24.578
der Kern von Python.

01:42:25.258 --> 01:42:27.338
Die sind leicht zu verwenden, die sind sehr mächtig,

01:42:27.398 --> 01:42:29.698
man kann so gut wie alles damit machen und

01:42:29.698 --> 01:42:30.838
die

01:42:30.838 --> 01:42:32.878
formen dann so ein bisschen das Denken.

01:42:33.338 --> 01:42:35.118
Das ist aber ein bisschen verherrlich, wenn man jetzt noch gar nicht die Nachteile

01:42:35.118 --> 01:42:37.198
davon erklärt. Warum will man das denn vielleicht

01:42:37.198 --> 01:42:37.998
nicht benutzen?

01:42:38.357 --> 01:42:41.218
Es könnte es jetzt noch für Nachteile geben.

01:42:41.357 --> 01:42:43.118
Es ist O von 1, es kann alles speichern,

01:42:43.178 --> 01:42:45.098
das ist großartig. Also vielleicht so ein

01:42:45.098 --> 01:42:45.878
Speicherverbrauch.

01:42:46.518 --> 01:42:48.298
Ja, das haben wir am Anfang schon gesagt.

01:42:48.298 --> 01:42:51.098
Also ein Dictionary verbraucht direkt ein Viertel Kilobyte.

01:42:51.618 --> 01:42:57.518
Das heißt bei so einem Vetted Programming oder irgendwelche so IoT Sachen ist es dann vielleicht nicht die richtige Wahl.

01:42:58.718 --> 01:43:01.817
Es ist auf jeden Fall relativ wasteful.

01:43:02.258 --> 01:43:04.478
Also man hat immer einen großen Overhead.

01:43:04.878 --> 01:43:06.018
Immer mindestens 40% Overhead.

01:43:06.018 --> 01:43:09.258
Wir laufen alle auf so Kisten, wo wir genug Speicher haben, da ist das wurscht.

01:43:09.418 --> 01:43:11.698
Ja, natürlich. Das ist die Ausrede, die man heutzutage macht.

01:43:11.778 --> 01:43:14.178
Aber es gibt natürlich auch Fälle, wo es eben nicht so der Fall ist.

01:43:14.178 --> 01:43:15.518
Oder wo man an die Grenzen kommt.

01:43:15.518 --> 01:43:16.838
wo man eben

01:43:16.838 --> 01:43:19.458
eine Waschmaschine hat halt für 4 KB

01:43:19.458 --> 01:43:20.678
Hauptarbeitsspeicher

01:43:20.678 --> 01:43:23.598
Wenn du 1000 TPS machen kannst statt eine Million

01:43:23.598 --> 01:43:24.838
und du brauchst dann eine Million, dann

01:43:24.838 --> 01:43:27.357
wird das halt schon irgendwann relevant

01:43:27.357 --> 01:43:29.558
Ja, Moore's Law

01:43:29.558 --> 01:43:31.598
wird alles gut machen, langfristig

01:43:31.598 --> 01:43:33.498
und auch eine Waschmaschine bekommt

01:43:33.498 --> 01:43:35.438
mehrere Gigabyte Speicher

01:43:35.438 --> 01:43:36.438
für einzelne Waschprogramme

01:43:36.438 --> 01:43:38.317
Wir haben ja heutzutage schon mehr

01:43:38.317 --> 01:43:39.518
Hauptspeicher

01:43:39.518 --> 01:43:41.718
Irgendwann musst du da einfach nur noch so Grundrohstoffe reinkippen

01:43:41.718 --> 01:43:44.238
wie Sand und Salz

01:43:44.238 --> 01:43:45.838
oder sowas und da baut es automatisch

01:43:45.838 --> 01:43:47.898
Waschmittel raus und das

01:43:47.898 --> 01:43:49.118
perfekt für die Wäsche geeignet ist.

01:43:51.058 --> 01:43:52.218
Du kannst doch schon

01:43:52.218 --> 01:43:53.738
so Waschmaschinen, Waschmittel,

01:43:53.878 --> 01:43:55.998
Cartridges kaufen und die werden dann auch

01:43:55.998 --> 01:43:58.118
so dosiert, dass es für den Waschmittelhersteller

01:43:58.118 --> 01:43:58.738
optimal ist.

01:44:01.238 --> 01:44:02.498
Für den Waschmittelhersteller,

01:44:02.498 --> 01:44:03.578
das ist natürlich, ja egal.

01:44:04.258 --> 01:44:05.378
Ja, leider nicht.

01:44:05.918 --> 01:44:08.317
Ich hoffe euch hat eure Folge, unsere Folge zu Dicts

01:44:08.317 --> 01:44:10.278
heute gefallen. Falls dir noch irgendwas dazu einfällt,

01:44:10.398 --> 01:44:10.918
dann...

01:44:10.918 --> 01:44:13.938
Pics und sowas machen wir irgendwann anders.

01:44:14.238 --> 01:44:16.698
Ja, ich glaube, wir sind jetzt heute weit fortgeschritten.

01:44:17.178 --> 01:44:18.298
Also mein Lieblingsmodul

01:44:18.298 --> 01:44:20.158
in Python ist ja

01:44:20.158 --> 01:44:22.378
Buildings.dict. Das ist mein Pick der Woche.

01:44:22.698 --> 01:44:22.918
Okay.

01:44:26.238 --> 01:44:28.258
Ja, ich mache dann einfach von einem Pedantic.dict.

01:44:28.978 --> 01:44:29.878
Ja, okay, perfekt.

01:44:30.178 --> 01:44:31.438
Und Jochen macht Name-Tubel.

01:44:31.938 --> 01:44:32.778
Ja, Adress, ja.

01:44:33.357 --> 01:44:34.538
From Jochen Imports.

01:44:36.178 --> 01:44:37.238
Die eigene Implantierung.

01:44:37.378 --> 01:44:39.038
Aber genau, kann man sich auf jeden Fall auch mal angucken.

01:44:39.218 --> 01:44:40.118
Das lohnt sich.

01:44:40.598 --> 01:44:42.357
Da haben wir doch was gemacht.

01:44:42.357 --> 01:44:43.698
ging schnell

01:44:43.698 --> 01:44:46.138
ja dann bleibt uns gebogen

01:44:46.138 --> 01:44:47.838
hört uns immer wo ihr uns hören wollt und

01:44:47.838 --> 01:44:50.158
eine schöne Zeit und bis zum

01:44:50.158 --> 01:44:50.498
nächsten Mal

01:44:50.498 --> 01:44:52.857
Tschüss
