Transcript: Was, wenn alles ein dict wäre?

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Dominik

Ja, hallo, liebe Hörerinnen und Hörer, willkommen beim Python-Podcast, Episode 36.

Dominik

Heute wollen wir mit euch ein bisschen über die technischen Implementierungsdetails von Dictionaries reden.

Dominik

Jochen ist natürlich wieder da. Hi, Jochen.

Dominik

Hallihallo, Dominik.

Dominik

Dominik, genau. Und heute ist auch wieder Johannes dabei. Hi, Johannes.

Dominik

Hallo zusammen.

Dominik

Ja, moin.

Dominik

Ja, wir fangen wie immer ein bisschen News aus der Szene an und was uns sonst noch so einfällt.

Dominik

Und dann gehen wir so ein bisschen in das Thema rein.

Dominik

Ja.

Dominik

Also du wolltest unbedingt noch über den Copilot reden,

Dominik

habe ich gehört.

Dominik

Ich wollte das.

Dominik

Ja, ich auch.

Johannes

Der Jochen ist derjenige, der immer darüber sprechen möchte.

Johannes

Ja, wir haben schon zweimal darüber gesprochen.

Johannes

Aber jetzt hat auch Jochen ihn ausprobiert.

Johannes

Jetzt hat auch PyCharm jetzt auch Copilot.

Johannes

Deswegen, genau.

Jochen

Genau, ich habe irgendwann die erlösende Mail von GitHub

Jochen

bekommen, sodass ich jetzt im Beta-Programm auch mit drin bin.

Jochen

Und genau, da muss ich das natürlich direkt mal ausprobieren.

Jochen

Und ich hätte da eigentlich gar keine so hohen Erwartungen,

Jochen

obwohl du immer schon davon so vorgeschwärmt hast.

Jochen

Ja, du hast immer gesagt, ach, was für ein Quatsch,

Jochen

das ist ja völlig egal.

Jochen

Das kann ja nicht, also wenn man jetzt irgendwie so

Jochen

durchschnittlichen Code davon irgendwie in den Leuten

Jochen

kriegt, das kann ja nichts

Jochen

taugen. Aber

Jochen

ich muss sagen, ich bin doch

Jochen

sehr überrascht, dass das manchmal wirklich, wirklich

Jochen

hilfreich ist.

Jochen

Sogar Jochen findet das hilfreich.

Dominik

Ja, ich finde es auch sehr cool. Also ich finde vor allem

Dominik

dieses Autocompletion cool. Er lernt irgendwie aus seiner eigenen

Dominik

Codepace und weiß so ein bisschen, was du als nächstes vorhaben

Dominik

könntest oder macht manchmal so einen guten Vorschlag.

Dominik

Ist natürlich nicht immer, ist auch nicht immer

Dominik

richtig, aber manchmal ist erstaunlich richtig.

Jochen

Ja, und manchmal findet man halt

Jochen

Dinge dadurch erst,

Jochen

die man, also ich habe, ich mache

Jochen

jetzt manchmal auch so ein bisschen

Jochen

JavaScript beziehungsweise TypeScript

Jochen

und

Jochen

manchmal weiß ich einfach nicht, wie Sachen gehen.

Jochen

Also ich habe keine Ahnung, wie das geht und dann fange

Jochen

ich irgendwie mit einem variablen Namen an

Jochen

und dann kriege ich so einen ganzen Codeblock

Jochen

und der tut genau das, was ich eigentlich machen wollte.

Jochen

Ja genau, das ist halt richtig.

Dominik

Also du musst halt wirklich aufpassen, was für Namen du

Dominik

in den Dingen gibst. Wenn du dir gute Namen gibst, ist es ja viel besser,

Dominik

als wenn du schlechte Namen gibst.

Dominik

Muss man sowieso aufpassen und immer gute Namen

Dominik

Genau, aber wenn man das dann halt macht und dann auch einen guten Docstring schreibt oder einen Kommentar dazu, dann lernt er sogar noch aus diesen Docstrings, aus den Kommentaren was dazu.

Dominik

Oder halt, also was halt bei mir voll gut funktioniert, ich mache halt den Methodennamen beispielsweise oder den Klassnamen oder die Funktion und die Argumente und typen und dann weiß er ziemlich oft, was zu tun ist, wenn ich den Docstring noch mache.

Dominik

Dann schreibe ich im Docstring rein, was er tun soll und dann, der Vorschlag, der ist schon echt gut.

Dominik

Also auch, da gibt einer halt auch Implementierungsvorschläge, an die man vielleicht nicht gedacht hat oder sowas schon.

Jochen

Ja, also da, das ist durchaus sehr beeindruckend.

Dominik

Und ich weiß, warum Jochen den gut findet, weil er sich ja immer selber am eigenen Code-Repo orientiert und er orientiert sich an Jochens eigenem Code und dann denke ich auch natürlich immer, oh, was für ein toller Vorschlag.

Dominik

Ja, großartiger Stil.

Jochen

Also Kritik würde ich sagen, es ist auch besser geworden, wenn man diese Nightly-Version nimmt.

Jochen

Ich habe zuerst die Standard-Version genommen und man kann halt die aktuelle Bleeding-Edge-Geschichte nehmen. Die ist, finde ich, nochmal ein gutes Stückchen besser. Was manchmal nicht so gut funktioniert, also womit Copilot halt irgendwie unerwarteterweise, weil man denkt, das ist eigentlich eine einfache Geschichte, große Probleme hat, wo er deswegen große Probleme hat, ist Klammern.

Jochen

Also die Klammern richtig zu setzen.

Jochen

Also zum Beispiel zu machen.

Jochen

Das macht eigentlich fast nie die Klammern richtig zu.

Jochen

Oder halt irgendwie, dass das halt

Jochen

nur Sinn macht, wenn es runde Klammern sind.

Jochen

Manchmal macht er auch einfach eckige Klammern bei mir.

Jochen

So an Stellen, wo Funktionen aufgerufen werden.

Jochen

Und dann ist das natürlich, das funktioniert halt nicht.

Jochen

Kannst du das nicht erklären,

Jochen

dass das doch irgendwie diese neuronalen Netze,

Johannes

weil die halt nicht genügend Zustand für sowas haben, oder?

Jochen

Ja, man muss denen halt irgendwie

Jochen

die Syntax sozusagen irgendwie so einprügeln,

Jochen

dass sie das halt nicht, dass das nichts Unscharfes

Jochen

ist oder, aber das funktioniert

Jochen

vielleicht nicht so richtig. Also meistens funktioniert es ja auch.

Dominik

Test durch valide Sonntagslaufen oder sowas, das wird ja schon gehen.

Johannes

Ja, aber prinzipiell hat dieses Netz ja kein Verständnis von

Johannes

ich habe Endklammern geöffnet und muss

Johannes

jetzt Endklammern auch wieder schließen in der richtigen Reihenfolge.

Dominik

Ja gut, aber du kannst ja alle Vorschläge aussortieren, bei denen das

Dominik

nicht stimmt oder du kannst ja danach noch auditieren oder

Jochen

sowas. Ja, ja klar, also es ist jetzt auch kein großes

Jochen

Problem, nur das ist halt irgendwie so ein bisschen

Jochen

erstaunlich, wo man sich denkt so, naja, also das Schwierige,

Jochen

den schwierigen Teil, den kann es eigentlich überraschend

Jochen

gut, nämlich irgendwie rausfinden,

Jochen

was man da machen wollte und dann den Code schreiben,

Jochen

der zumindest so aussieht, als würde er das richtig tun.

Jochen

Und dann macht er Klammerfehler.

Jochen

Und dann kommen halt so Dinge, wo man sagt,

Jochen

eine IDE kann das ja schon, die Klammern richtig setzen.

Jochen

Und das geht dann nicht mehr.

Jochen

Aber ich meine, das sind Sachen,

Jochen

die wird man halt mit der Zeit in den Griff kriegen,

Jochen

denke ich mal.

Jochen

Und dann ist das schon echt beeindruckend.

Dominik

Was man auch mal machen muss, ist so User-Daten.

Dominik

Beispielsweise machst du irgendwie eine JSON auf

Dominik

und dann machst du einen Namen,

Dominik

eine E-Mail-Adresse oder sowas und ein Passwort

Dominik

und dann machst du Autocomplete.

Dominik

Da gibt es ja halt eine Liste von Usern

Dominik

irgendwie, die mit dem Nutzernamen

Dominik

Passwort und so, das war schön.

Dominik

Das war dann die Frage, sind die generiert?

Dominik

Generiert oder ja, oder sind die generiert oder echt?

Dominik

Man weiß es aber nicht so genau, von wo

Dominik

die sind. Das sind alle gelernt.

Dominik

Ja, es ist wohl auch, wenn man so Zahlenfolgen

Johannes

eingibt, dann gibt er einem interessante Instruktionen.

Johannes

Das ist ein Screenshot

Johannes

gesehen, wo dann russische Funktionsnamen

Johannes

dazukamen.

Jochen

Also, okay. Ja, ich bin ja mal gespannt,

Jochen

was dabei rauskommt, wenn man so was

Jochen

man anfängt irgendwie so 3.1,

Jochen

4, 1, 7.

Jochen

Ja.

Jochen

Ja.

Jochen

Ja, ja, vielleicht, vielleicht.

Jochen

Also, ja, das ist ja...

Johannes

Das ist noch keine AGI, das ist noch keine generelle

Johannes

Intelligenz, glaube ich.

Jochen

Da habe ich letztens, ach ja, ich komme vom Holzen aufs

Jochen

Stöckchen, aber vielleicht ist das ja auch nicht so uninteressant,

Jochen

wieder einen ganz netten

Jochen

Podcast-Episode gehört mit

Jochen

Lex Friedman,

Jochen

Steven Wolfram.

Jochen

von Wolfram Alper, interviewt hat, genau.

Jochen

Ja, der ist ja so ein Wunderkind und dann so ein bisschen

Jochen

hinter den Erwartungen. Eine sehr kontroverse Persönlichkeit.

Jochen

Ja, polarisierend.

Dominik

Warum? Jetzt musst du das genau aufklären, direkt.

Dominik

Ja, es gibt Leute, die lieben ihn total und der macht ja auch

Dominik

viele gute Sachen, aber es gibt Leute, die

Johannes

hassen ihn auch total, weil der halt auch

Johannes

seine Meinung für

Johannes

sehr wichtig hält. Achso, okay.

Dominik

Wir wollen ja die Gründe und Anekdoten auch hören.

Dominik

Es geht um seine Meinung, die er präsentiert.

Dominik

Ja, und er ist auch

Johannes

so ein, er hat so ein paar

Johannes

interessante Fixierungen. Der findet, dass die ganze Welt

Johannes

aus State Machines besteht und muss alles mit

Johannes

State Machines machen.

Johannes

Und Rule 34 ist das einzige,

Johannes

was...

Johannes

War das nicht die andere Nummer?

Johannes

War das nicht Rule...

Jochen

Rule 38 oder so?

Jochen

Das ist die...

Johannes

Ja, diese 30er-Regeln, also das ist so eine Klasse

Johannes

von...

Johannes

State Machines.

Johannes

Und die kannst du durchnummerieren und die haben

Johannes

eine natürliche Ordnung und dann

Johannes

findest du halt irgendwann eine, die eine universelle

Johannes

Turing-Maschine ist im Wesentlichen.

Johannes

Stephen Wolfram sagt halt, mehr oder weniger,

Johannes

der schreibt ganze Bücher darüber, was diese

Johannes

State Machine alles kann und dass die das Universum

Johannes

enkodiert. Und das ist

Johannes

natürlich,

Johannes

wenn du die gesamte Wissenschaft

Johannes

umstellen willst auf State Machines.

Dominik

Ich habe immer noch keine Ahnung, was Rule 38 ist, aber

Dominik

das Urban Digitry hat mir gesagt, Rule 38 ist

Dominik

a prison offense, in which someone is

Dominik

muster waiting in public.

Dominik

Ah, ja, okay.

Dominik

Also, wenn du mal viel Spaß hast mit so einem

Dominik

Private Mode an, hast, dann google doch mal

Jochen

Rule 34, das ist glaube ich

Jochen

die, if it exists,

Jochen

there's porn of it, glaube ich.

Jochen

Das ist auch irgendwie eine sehr wichtige

Jochen

Regel und tatsächlich stimmt sie halt einfach immer.

Jochen

Aber... Leider,

Jochen

leider erstaunlicherweise.

Dominik

There's a type of porn, there's a website for it.

Dominik

Ach so, okay. Das ist auch Rule 38.

Dominik

Rule 30

Jochen

sagen die. Okay, aber das sind

Jochen

beides nicht die Regeln, die ich jetzt gerade meinte.

Jochen

30 ist es.

Jochen

genau, nee, aber genau, um diese Dinger ging es

Jochen

natürlich bei der Episode auch und

Jochen

also ich finde das schon interessant, ja, ich meine

Jochen

das ist ja, also er hatte irgendwie, Leute hatten

Jochen

hohe Erwartungen an ihn, weil er war halt so ein Wunderkind

Jochen

und dann ist aber irgendwie

Jochen

dann doch nicht irgendwie so wirklich so

Jochen

Einstein

Jochen

einsteinmäßige Ausmaße haben seine

Jochen

Theorien da jetzt nicht angenommen, sondern er

Jochen

so ein bisschen hinter den Erwartungen zurückgeblieben

Jochen

und aber tatsächlich

Jochen

ist er ja genau eben der Meinung

Jochen

er hat ja ein Buch geschrieben, das hat auch schon so

Jochen

Titel, New Kind of Science.

Jochen

Das, ja,

Jochen

den kann man ja auch nur nehmen, wenn man denkt, da hat man jetzt mal

Jochen

echt was gefunden.

Jochen

Ja, hat ein gewisses Selbstbewusstsein.

Jochen

Aber er hat ja auch coole Sachen gemacht, also so ist es

Jochen

nicht. Also es ist nicht nur...

Jochen

Er ist halt auch super, ungeheuer produktiv.

Johannes

Er hat so ein Diagramm veröffentlicht

Johannes

von wann er E-Mails schreibt und der hat

Johannes

eigentlich immer 18-Stunden-Tage und

Johannes

manchmal hat er auch 24-Stunden-Tage.

Johannes

Er erschlägt

Johannes

es einfach durch Produktivität, diese

Johannes

ganzen Kritikpunkte.

Jochen

Ja, also er hat ja auch so eine Firma, die macht Mathematiker, auch eine super Software, also ja.

Jochen

Ja, oder eben Wolfram Alpha.

Jochen

Und Wolfram Alpha, genau, ja, und ja, auch die Firma so zu nennen, also naja gut, aber das ist, er macht ja wirklich cooles Zeug, also so kann man eigentlich auch nichts sagen und das fand ich so ganz interessant, weil es jetzt, weil er auch da, weil kam das Thema auch auf Pi, ich meine, das ist ja auch so eine Zahl, die einem ab und zu mal irgendwie über den Weg läuft.

Jochen

und er... Du meinst Tau halbe?

Jochen

Ja, genau.

Jochen

Ja, stimmt. Tau ist dann vielleicht etwas, was man

Jochen

häufiger noch braucht als Pi.

Jochen

Und genau,

Jochen

wie jeder weiß, ist das Ding halt

Jochen

transcendent rational

Jochen

und

Jochen

hat eine Menge super interessante Eigenschaften,

Jochen

aber so fundamentale Sachen,

Jochen

die man jetzt, wo man denkt, das müsste man doch eigentlich

Jochen

darüber wissen, also wie zum Beispiel sowas wie

Jochen

kommen denn alle

Jochen

Ziffern in der Dezimalbruchentwicklung von

Jochen

Pi mit der gleichen Wahrscheinlichkeit vor? Also ist

Jochen

Pi normal oder nicht?

Jochen

Das weiß man halt nicht. Und zwar so

Jochen

gar nicht. Und hat auch gar keine Ahnung, wie man das irgendwie

Jochen

hinkriegen könnte. Dabei ist die Regel, die jetzt

Jochen

Pi erzeugt, eben auch ziemlich einfach

Jochen

eigentlich. Und dann ist es

Jochen

doch irgendwie überraschend, dass dabei eine Ziffernfolge

Jochen

rausfällt, die einmal so total zufällig aussieht,

Jochen

wo man nicht drüber sagen kann,

Jochen

jetzt okay, nicht mal die

Jochen

Verteilung der Ziffern da drin sagen kann.

Jochen

Und die so aussieht, als wäre sie,

Jochen

als könnte man wirklich nicht, man kann es halt

Jochen

auf nichts anderes reduzieren. Man kann da drin,

Jochen

findet daran keine Muster oder

Jochen

da kommt einfach alles, was es überhaupt

Jochen

an Mustern irgendwie gibt, kommt wohl offenbar daran

Jochen

vor. Das ist halt

Jochen

die Frage ist halt, wie kommt

Jochen

aus so etwas, aus so einer einfachen

Jochen

Regel, wie man Pi bilden kann,

Jochen

warum fällt da plötzlich so ein ganzes Universum raus?

Jochen

Ja, das ist ja

Johannes

im Wesentlichen das, was der Wolfram auch sagt

Johannes

mit seiner Regel 30. Das ist ja eine ganz simple

Johannes

Regel. Das ist die 30. die du ausprobierst,

Johannes

wenn du sie nach seiner Ordnung machst und dann kommt so

Johannes

mordsmäßiges Chaos raus und alles, was du dir vorstellen

Johannes

kannst.

Johannes

Das ist so eine generelle Sache in der Mathematik.

Johannes

Irgendwann mache ich da auch mal noch einen längeren Diskurs drüber.

Johannes

Dass man mathematisch gesehen aus sehr einfachen Regeln,

Johannes

wo man denkt, die sind einfach genug, um sie im Kopf auszuführen,

Johannes

Dinge produzieren kann, die völlig unabsehbar sind.

Johannes

Und völlig überraschend auch,

Johannes

weil sie eben nicht mehr sich an die Regeln halten,

Johannes

sondern weil sie dann irgendwelche chaotischen Sachen produzieren.

Johannes

Und das ist was sehr Erschreckendes und es ist aber auch gleichzeitig was sehr Schönes in der Mathematik, weil man da eben Dinge finden kann, die einen völlig überraschen, auch aus den einfachsten Bausteinen raus.

Dominik

Also um das nochmal so zusammenzufassen, du hast gerade dich darüber beschwert, dass die Wahrscheinlichkeitsverteilung des Auftretens von einer Nachkommastelle von Pi in der Gesamtsumme aller Nachkommastellen von Pi, die bekannt sind, nicht bekannt sind.

Dominik

Nicht bekannt sind, überhaupt nicht bekannt sind, alle. Also die kannst du ja nicht kennen.

Jochen

Aber man weiß halt nicht.

Johannes

Es könnte ja sein, dass irgendwann keine Neunen mehr vorkommen.

Johannes

Einfach gar keine mehr.

Johannes

Ist das normalerweise so?

Johannes

Nee, ist eben nicht normalerweise so.

Johannes

Aber es könnte sein.

Johannes

Wir können es nicht ausschließen.

Johannes

Das ist die Sache, was der Jochen sagt.

Johannes

Keine Ahnung.

Johannes

Und das ist überraschend,

Jochen

dass man da so gar keine Ahnung hat.

Jochen

Weil man denkt so, naja, das müsste man doch jetzt irgendwie,

Jochen

wenn man die Regel wie Pi entwickelt wird,

Jochen

hinschreibt und eine Funktion wie Pi ausrechnet.

Jochen

Das ist wirklich so ein paar Zeilen.

Jochen

Also muss man diese Zeilen nur ganz, ganz lange und genau angucken und dann muss einem doch klar sein, okay, da irgendwie ne neun, die kommen genauso häufig vor wie alle anderen auch.

Johannes

Oder zumindest es kommt immer mal wieder ne neun vor, das ist ja schon ne Aussage, die sehr schwer zu treffen ist.

Johannes

Ja, aber das ist doch im Endeffekt, reduziert sich das doch runter auf das Halting-Problem, oder? Also wenn du das lösen kannst, dann kannst du auch das Halting-Problem lösen.

Dominik

Was ist das Halting-Problem und was ist das Tau-Halbe?

Johannes

Tau halbe ist Pi. Das gab es vor einer Weile mal, das Tau-Manifest, wo jemand behauptet hat, Pi ist eigentlich die falsche transzendente Zahl. Die richtige transzendente Zahl ist eigentlich Tau und das ist zweimal Pi, weil dann ganz viele so quadratische Formen eben einen Faktor 2 verlieren, der diese Formen einheitlicher macht.

Johannes

Es gibt auch ein Gegenmanifest gegen dieses Tau-Manifest, das quasi das Gegenteil behauptet und sagt, das ist alles Quatsch, weil es gibt genauso viele Dinge, die mit Pi schöner aussehen als mit Tau. Deshalb ist es so ein Witz unter Mathematikern, wo man Leute leicht auf die Palme bringen kann.

Dominik

Dann aber einfach nochmal kurz die ganze Unbelegung. Was ist denn Pi?

Johannes

Pi ist das Verhältnis zwischen dem Radius eines Kreises und der Fläche des Kreises.

Johannes

Und das heißt, wenn ich einen Kreis mit einem Radius 1 habe, dann hat er die Fläche Pi.

Johannes

Und bei den meisten geometrischen Figuren ist es so, dass die Fläche sich relativ leicht berechnet.

Johannes

Also wenn ich ein Quadrat habe und das hat Seitenlänge 1, dann hat es die Fläche 1.

Johannes

Und wenn ich ein Dreieck habe, dann hat es die Fläche 1,5 mal 1.

Johannes

Dann gibt es irgendwelche ganz leichten Formeln.

Johannes

Beim Kreis ist es leider anders.

Johannes

Da kommt eben die Zahl Pi raus.

Johannes

Und die Zahl Pi ist eine transzendente Zahl.

Johannes

Das heißt, die ist eine nicht-rationale Zahl.

Johannes

Es gibt keinen Bruch, der Pi korrekt darstellen kann.

Johannes

Es ist auch eine transzendente Zahl.

Johannes

Das heißt, die ist nicht algebraisch.

Johannes

Das heißt, es gibt auch keinen Polynom, was Pi als Lösung hat.

Johannes

Und das macht es zu einer ganz besonderen Zahl, weil die Zahlen, die man normalerweise so kennt, Wurzel 2 und Wurzel 3 und Wurzel 5 und Wurzel 7 und 2 mal Wurzel 5 halbe und so weiter, das sind alles algebraische Zahlen. Das heißt, die sind Lösung von irgendeinem Polynom und die haben dann eben diese Eigenschaft, dass ich die in dieses Polynom einsetzen kann und dann kommt 0 raus.

Johannes

Das geht mit Pi nicht.

Johannes

Es gibt für Pi kein Polynom, was Pi als Lösung hat.

Johannes

Und deshalb ist es eine ganz besondere Zahl.

Johannes

Nee, es gibt keins.

Johannes

Gibt es nicht? Also es ist bewiesen, dass es nicht gibt?

Johannes

Ja, weil es transzendent ist.

Johannes

Und tatsächlich der Beweis, dass Pi transzendent ist,

Johannes

ist eine sehr schwierige Sache.

Johannes

Ist auch noch gar nicht ungeheuer lange her.

Johannes

Aber das Ergebnis ist eben sehr wichtig,

Johannes

weil das eine Klasse von Zahlen ist,

Johannes

von denen es wesentlich mehr gibt als von anderen Zahlen,

Johannes

die für uns aber aus unserem menschlichen

Johannes

Verständnis her sehr schwer erreichbar sind,

Johannes

weil wir eben Brüche gewohnt sind und

Johannes

Wurzeln von irgendwas, also

Johannes

algebraische Zahlen,

Johannes

das sind aber tatsächlich so auf eine

Johannes

gewisse Art und Weise die wenigsten

Johannes

reellen Zahlen.

Johannes

Es ist eben eins von diesen

Johannes

bekannten Beispielen für eine Zahl, die

Johannes

sich anders verhält, als man denkt.

Johannes

Und deshalb ist sie in der Mathematik sehr wichtig,

Johannes

weil sie eben eine

Johannes

transzendente Zahl ist.

Johannes

Es gibt noch ähnliche Zahlen, es gibt noch E.

Johannes

Die Eulersche Zahl?

Johannes

Die Eulersche Zahl, genau.

Johannes

Und die hat nicht ganz so eine einfache Erklärung.

Johannes

Sehr gut, Dominik.

Johannes

Die hat nicht ganz so einfache Eigenschaften,

Johannes

die ist nicht ganz so einfach zu erklären.

Johannes

Aber ist auch transzendent.

Johannes

Man weiß auch nicht, ob es normal ist.

Johannes

Man weiß auch da die Verteilung der Sachen alle nicht.

Johannes

Das heißt, diese Zahlen, die sind sehr, sehr schwer in den Griff zu kriegen,

Johannes

obwohl es eigentlich sehr viele davon gibt.

Johannes

und ja

Johannes

das ist halt leider so

Jochen

ja und genau

Jochen

also ja in gewisser Weise haben die jetzt auch was

Jochen

mit eben diesen ganzen

Jochen

theoretischen Informatikgeschichten zu tun

Jochen

weil sie sozusagen in gewisser Weise

Jochen

berechnungstechnisch

Jochen

irreduzierbar sind sozusagen also man kann halt

Jochen

nicht

Jochen

keine geschlossene Form

Jochen

man muss sie tatsächlich ausrechnen

Jochen

genau sonst kriegt man sie

Jochen

halt nicht in den Griff. Und das Problem ist, das ist halt

Jochen

teuer, die auszurechnen, da muss man halt

Johannes

Ja, und das ist ja auch so ein bisschen ein Sport,

Johannes

dass die meiste

Johannes

Anzahl Stellen von Pi ausgerechnet ist.

Jochen

Ja, gab es letztens irgendwie wieder eine Nachricht, dass da

Jochen

60 Millionen Stellen oder weiß ich nicht

Jochen

oder noch mehr, ich weiß gar nicht genau, wie viele.

Johannes

Genau, also da kommt man dann halt wirklich sehr schnell in solche

Johannes

Bereiche rein, wo es dann gar nicht mehr so sehr

Johannes

um Prozessorleistung geht und gar nicht so sehr um

Johannes

Smarthand geht, sondern da kriegst du dann so richtig die Big Data

Johannes

Probleme. Wie schaffst du das auf einer Zahl

Johannes

zu operieren, die 60 Milliarden Stellen hat?

Dominik

Ich habe mich mal kennengelernt, der hat sich als Hobby

Dominik

Aufgabe gemacht, Nachkommastellen von Pi

Dominik

auswendig zu lehren, hat, glaube ich, die ersten 250

Dominik

aufsagen können.

Dominik

Okay, das ist schon mal nicht so schlecht. Ja, wir haben doch alle so einen Freund,

Dominik

oder, der sowas kennt.

Dominik

Ja,

Jochen

es gibt auch irgendwie die Gesellschaft

Jochen

der Freunde von Pi, glaube ich, und da

Jochen

muss man irgendwie die ersten 100 Stellen auswendig können

Jochen

oder so, damit man aufgenommen werden kann.

Jochen

3,1, 4,2,

Jochen

wie geht das weiter?

Jochen

Ja,

Johannes

3,1, das ist schon ungefähr richtig.

Jochen

Wie du das sagst, gibt es auch so interessante Fälle, wo dann in irgendeinem CAD-Programm oder so, das ist eine der bösesten logischen Bomben, von denen ich bisher so gehört habe, dass jemand da den Wert von Pi irgendwie subtil verändert hat, so eher sechste, siebte Nachkommastelle oder sowas. Und dann waren halt alle Baupläne irgendwie der letzten zehn Jahre alle falsch.

Jochen

Sehr schön, sehr schön.

Dominik

Kann man 3,142 sagen oder ist das auch immer falsch?

Johannes

3,1415 ist so die Standardweise,

Johannes

aber es ist eigentlich falsch,

Johannes

weil es geht ja mit 9 weiter.

Johannes

Wenn man Pi, ich glaube, auf 15 Stellen genau hat,

Johannes

dann reicht das schon für alle physikalischen Sachen aus,

Johannes

weil das dann irgendwie schon im Nanometer-Bereich ist

Johannes

und so genau kannst du halt nicht mehr.

Dominik

Und 3,142 ist zu grob noch für sowas?

Johannes

Ja, da hast du halt, wenn du einen Kreis machst,

Johannes

der 10 Meter im Durchmesser hat,

Johannes

hast du halt eine Abweichung von 1%.

Johannes

Also das ist dann schon eine ganze Menge.

Johannes

Jede Programmiersprache hat eine konstante eingebaut,

Johannes

die Pi heißt, Python übrigens auch, math.py.

Johannes

Und die hat mehr Stellen,

Johannes

als man je in seinem Leben brauchen wird.

Johannes

Deshalb völlig ausreichend.

Dominik

Du hast gerade einen Bogen zu Python gesagt,

Dominik

ich bin begeistert.

Dominik

Ja, wunderbar, oder?

Jochen

Ja, sollten wir vielleicht irgendwie mal zurückkommen.

Jochen

Das ist mir wieder so völlig unvorhergesehen,

Jochen

aber ich finde das eigentlich ganz interessant.

Jochen

Das sollte doch heute eine Basics-Episode sein, oder?

Jochen

Ja.

Jochen

Da bist du die Leute halt durch.

Jochen

Wenn man an die Möhre ran will,

Jochen

muss man auch ab und zu mal, keine Ahnung.

Jochen

Man muss ja erst ausgraben, die Möhre.

Jochen

Ja, rotten.

Jochen

Gibt es noch

Jochen

was an News?

Jochen

Ich weiß nicht genau, ist irgendwas Interessantes passiert?

Jochen

Django ist

Jochen

jetzt gerade die

Jochen

Prerelease-Kandidat.

Jochen

4.0 ist der Prerelease.

Jochen

Das hatten wir gewünscht.

Jochen

Letztes Mal hatten wir Alpha.

Jochen

Ansonsten weiß ich nicht, gibt es eigentlich nichts.

Jochen

Python 3.10 ist immer noch aktuell und immer noch

Dominik

cool. Ja, meine letzte Folge hieß Python 3.10,

Dominik

Johanna. Ja, gut.

Johannes

Dann ist es trotzdem, ich wiederhole mich,

Johannes

es ist immer noch aktuell und immer noch cool.

Johannes

Ja.

Johannes

Ja.

Jochen

Es gab ganz lette Artikel.

Jochen

Einmal so über Python

Jochen

im Bankenumfeld gab es einen, der

Jochen

Oh, Bank-Python, großartig.

Jochen

Wie, was?

Johannes

Es gibt wohl eine Variante von Python,

Johannes

die bei großen amerikanischen Banken eingesetzt wird

Johannes

und die hat gewisse spannende Eigenschaften,

Johannes

sagen wir mal so.

Johannes

Wie heißt die?

Johannes

Die wird beschrieben als ein Fork des kompletten Bank-Python.

Johannes

Bank-Python, jetzt habe ich es auch nicht verstanden.

Johannes

Bank-Python.

Johannes

Ja, okay.

Johannes

Großartig.

Johannes

Ich habe diesen Artikel gelesen und ich fand den super.

Johannes

Ja, ich auch.

Johannes

Und da sind auch so ein paar Ideen drin,

Johannes

wo ich mir denke, ja,

Johannes

da könnte man versuchen, sich eine Scheibe abzuschneiden.

Dominik

An Oral History of Bank Python.

Dominik

Genau.

Dominik

K.L. Peterson.

Dominik

Und es sind

Johannes

auch ganz viele Sachen drin, wo man sich denkt, naja, gut,

Johannes

okay, gut, die sind halt in dem Jahr, in dem sie

Johannes

den Fork gemacht haben, stehen geblieben und das war

Johannes

vermutlich 1994 und

Johannes

das ist jetzt halt so.

Johannes

Aber es gibt

Johannes

auch ein paar Sachen, die eigentlich sehr cool sind.

Johannes

Also dieser globale State und dieses globale

Johannes

Deployment und der Code ist

Johannes

in der Datenbank und du kannst alles anfassen

Johannes

und Barbara

Johannes

sind schon viele Dinge, die man sich

Johannes

mal überlegen könnte.

Johannes

Ja, Jochen, den hast du vermutlich

Johannes

in meinen Weaknotes gefunden, oder? Ja, genau.

Johannes

Ein bisschen Werbung machen für eine eigene Sache.

Johannes

Ja, richtig, genau.

Johannes

Ja, ich

Jochen

hänge mit meinen Weaknotes wieder total hinterher.

Jochen

Ich muss da unbedingt was machen, aber ich habe irgendwie keine Zeit.

Jochen

Das ist schrecklich.

Jochen

Das muss Teil des Prozesses werden.

Johannes

Das muss eine Gewohnheit werden.

Johannes

Hast du hier nichts zu tun, Johannes?

Johannes

Ich habe genügend zu tun,

Johannes

aber ich habe immer noch

Johannes

genügend Freizeit, dass ich Reddit

Johannes

lesen kann. Und wenn ich statt Reddit Weaknotes

Johannes

schreibe, dann ist das doch ein Gewinn für uns alle.

Johannes

Ja, das stimmt.

Dominik

Ja, so viel Freizeit habe ich leider nicht.

Dominik

Warte mal,

Johannes

haben wir nicht erst Montagabend

Johannes

von 20 bis 24 Uhr Computerspiele

Johannes

gespielt? Ist das Freizeit?

Johannes

Nein, das ist

Johannes

Socializing. Und das war erst um 20

Johannes

oder 36 haben wir angefangen.

Johannes

Oh, ja gut, okay, dann.

Dominik

Ja, und dass wir lange gespielt haben,

Dominik

hat mich natürlich nächsten Morgen

Dominik

noch was gekostet, das ist ja auch klar.

Dominik

Wir haben übrigens gespielt

Dominik

Max, Mechanized Assault

Dominik

and Exploration.

Dominik

Das ist ein Spiel, das kam das

Dominik

erste Mal, ich will jetzt nicht lügen, aber 1998 raus.

Dominik

Und so sieht's

Dominik

auch aus.

Dominik

Es ist trotzdem super, es gibt eine

Dominik

Max R, das ist eine

Dominik

Charakter-Version, wenn man die Original

Dominik

Anführungszeichen, Original-Videos

Dominik

und Sprites und sowas noch hat.

Dominik

Sieht gar nicht so schlecht aus, finde ich.

Dominik

Naja.

Johannes

Das Interface, also das ist oft so.

Johannes

Diese alten Sachen haben oft

Johannes

gute Ideen, aber schlechte Interfaces.

Dominik

Und ein passiertes RTS mit unheimlicher Komplexität.

Dominik

Das ist aus der 96 schon, ehrlich.

Dominik

So alt. Fast so alt wie ich.

Dominik

Ja, wir haben es geliebt.

Dominik

Ja, und wir spielen das auch übrigens noch weiter,

Dominik

die nächste Johannes.

Dominik

Ich dachte, wir spielen noch andere alte Spiele.

Dominik

Ja, das werden wir auch mal schaffen, vielleicht nächstes Jahr.

Dominik

Na gut.

Dominik

Wie war das gleich noch mit Python?

Jochen

Ja, genau. Dann machen wir jetzt

Jochen

Python-Dictionaries und so, ne?

Jochen

Ja.

Johannes

Ihr wolltet heute über Dictionaries sprechen.

Johannes

Ja. Richtig. Verstanden.

Dominik

Was ist denn ein Python-Dictionary? Ein Wörterbuch?

Dominik

Ein Mapping von

Dominik

Dingen auf andere Dinge? Dominik, wie verstehst du

Johannes

denn ein Python-Dictionary? Also ich meine, der Jochen und ich,

Johannes

wir können uns gleich noch über die Interna

Johannes

unterhalten und da gibt es viele spannende Dinge, die man da

Johannes

besprechen kann. Aber Dominik, wie siehst

Johannes

du denn ein Python-Dictionary? Was ist denn für dich ein Python-Dictionary?

Johannes

Was ist denn das, was ein Python-Dictionary ausmacht?

Dominik

verweifelte, geklammertes, definiertes

Dominik

Objekt in Python, also dass es kein Z ist, sondern

Dominik

dass es eine Zuordnung immer macht von einem

Dominik

Key auf einen Wert und wo

Dominik

halt der Lookup, also das, wenn man nachgucken kann,

Dominik

sehr, sehr schnell geht, weil man schön drauf zugreifen kann

Dominik

und dann gibt es direkt einen Wert zurück,

Dominik

den es rausschmeißt. Das ist so, dass wie im Python-Dict

Dominik

man ihn einfach, glaube ich, schnell benutzt.

Dominik

Okay, Zuordnung

Johannes

von einem Key zu einem Wert. Das heißt,

Johannes

ich könnte mir jetzt zum Beispiel zum

Johannes

Key Dominic deine Telefonnummer speichern.

Johannes

Ja, und dann könntest du das

Dominik

Phone Numbers nennen oder sowas und dann

Dominik

machst du das gleich mit Jochen noch und ja. Und könnte ich mir aber nicht

Dominik

auch deine Adresse dazu merken?

Dominik

Ja, aber zu was?

Dominik

Also ist ja die Frage, wie du das strukturieren

Dominik

möchtest. Also da kann man ja

Dominik

beliebige Objekte als Value hinterlegen.

Dominik

Nee, das stimmt nicht. Achso, als Value schon,

Dominik

aber Key als Key nicht. Nein, aber genau,

Dominik

als Value hinterlegen, das heißt, da kannst du natürlich dann... Aber immer nur

Dominik

einen, oder?

Dominik

Value, du kannst ja einen Tupel reinpacken.

Johannes

Okay, ich kann einen Tupel reinpacken, aber ich könnte mir jetzt nicht

Johannes

zweimal zu dir zwei verschiedene

Johannes

Sachen merken. Also das müsste ich dann selber machen.

Dominik

Nee, tatsächlich. Also ein Key muss

Dominik

das ist unique in einem Gespräch.

Dominik

Weil das ist ja

Johannes

in einem Wörterbuch nicht so. Und in einem

Johannes

Telefonbuch ist das auch nicht so.

Johannes

Das ist

Johannes

so eine Sache, die immer, ich mache gelegentlich

Johannes

Python-Schulungen, übrigens im Dezember wieder.

Dominik

Naja, aber wahrscheinlich ist dann so, dass dann, wenn du das Lookup machst

Dominik

und dann Dominik nachguckst und dann gibt es verschiedene Dominiks,

Dominik

dann hast du erst eine Liste von Dominiks, die du zurückkriegst

Dominik

und in dieser Liste stehen dann die einzelnen.

Dominik

Ja, aber ich kriege ja keine Liste.

Johannes

Wenn Dominik nachguckt, dann kriege ich nur einen Wert zurück.

Johannes

Der kann dann eine Liste sein.

Dominik

Genau, aber wenn es eine Liste ist, ja, aber dann, also der Unterschied zum Telefonbuch ist ja der Marginal, du musst halt einfach nur gucken, es ist ein oder mehrere Werte und dann jeweils dann wieder weiterpacken, aber.

Johannes

Ja, also ich finde, es ist für das Verständnis her schon ein sehr wichtiger Unterschied. In Dictionary kann jeder Eintrag nur einmal vorkommen, jeder Key kann nur einmal vorkommen.

Dominik

Okay, also ich habe tatsächlich irgendwann nochmal.

Johannes

In meinem Telefonbuch gibt es sehr viele verschiedene Müllers.

Dominik

Ja gut, aber wenn du Müller, dann die Liste von allen Müllers bekommst, dann ist ja der Zugriff auf einen einzelnen Müller genau, dann müsste es eigentlich nur eine Ebene tiefer sein, egal.

Dominik

was ich da so tiefer drin verstanden habe, ist, dass du irgendwie halt

Dominik

in den Speicher gemeldet wirst und das deswegen so schnell ist,

Dominik

weil er dann einfach dann die Speicheradresse

Dominik

nachschauen kann. Ja, das ist ja

Dominik

die Magie des Hashtables.

Dominik

Das Hashtable, das müssen wir auch gleich nochmal erklären, was ein Hashtable ist.

Dominik

Ja.

Johannes

Was können denn Keys sein? Weißt du das, Dominik?

Johannes

Weißt du das auswendig? Das ist total spannend.

Johannes

Wenn ich den Jochen frage,

Johannes

da weiß ich, dass der das weiß.

Dominik

Ja, also ich weiß, dass Strings es sein können,

Dominik

ich weiß, dass es Duples sein können, ich weiß, dass es

Dominik

Integers sein können.

Dominik

Noch was?

Dominik

Strings auch?

Dominik

Ja, genau, Strings, habe ich ja gesagt.

Dominik

Kann es auch ein Dictionary sein?

Dominik

Nee.

Dominik

Doch, sind die hashable?

Dominik

Und eine Liste?

Dominik

Sind die hashable?

Dominik

Das war schon eine sehr, sehr gute Frage.

Dominik

Oh, die hashable.

Dominik

Das frage ich dich, Dominik.

Dominik

Das weiß ich nicht.

Johannes

Die Regel ist tatsächlich ganz interessant.

Johannes

Ein Key von einem Dictionary muss etwas sein,

Johannes

was sich nicht verändern kann.

Johannes

Hashable sind diese Typen alle,

Johannes

aber der Hash kann sich verändern,

Johannes

wenn sich das Objekt verändert.

Johannes

Und deshalb gibt es für Liste gibt es Tupel.

Johannes

Ich kann eine Liste nicht als Key verwenden,

Johannes

weil die sich verändern kann.

Johannes

Ich kann aber ein Tupel verwenden.

Johannes

Und ein Tupel ist ja im Wesentlichen nichts anderes

Johannes

als eine Liste, die sich nicht verändern kann.

Johannes

Für Dictionaries und für Sets

Johannes

gibt es einen äquivalenten Datentyp,

Johannes

der heißt

Johannes

FrozenDict und FrozenSet

Johannes

und das sind im Wesentlichen

Johannes

Dictionaries und Sets, die sich nicht

Johannes

verändern können. Das heißt,

Johannes

wenn ich ein Set als

Johannes

Key in einem Dictionary haben möchte, muss ich ein FrozenSet

Johannes

draus machen.

Johannes

Und das ist auch so ein bisschen

Johannes

der einzige Sinn für diese beiden Datentypen,

Johannes

dass du eben ein unveränderliches Dictionary

Johannes

oder ein unveränderliches Set haben kannst,

Johannes

um sie als Key in einem Dictionary zu verwenden.

Dominik

Und warum das machen wir, ist, weil man Lookup haben will

Dominik

nach dem Motto, wenn das da drin ist, dann gib mir dies.

Jochen

Ja, oder halt auch, wenn man sie wieder in ein Set packen möchte,

Jochen

weil man möchte, dass da Schnittmengen von Sachen bilden können

Jochen

oder feststellen können, ob man das schon mal gesehen hat oder so.

Jochen

Ja, oder die Reihenfolge spielt keine Rolle.

Jochen

Das ist ja, das ist so ein bisschen, als Mathematiker,

Jochen

das Set ist wie eine Liste ohne Reihenfolge.

Dominik

Oh, die interessante Reihenfolge müssen wir uns auch merken,

Dominik

weil Order tickt und sowas, weil das ja früher nicht so ging.

Dominik

das, glaube ich, default ist. Ja, muss man inzwischen nicht mehr.

Dominik

Früher musste man sich OrderDict immer merken,

Johannes

aber inzwischen sind alle Dicts OrderDicts, deshalb

Johannes

den Typ OrderDict gibt's noch,

Johannes

aber der macht irgendwie gar nichts mehr. Ja, doch, doch, doch.

Johannes

Der hat noch einen Reversed, aber das ist alles.

Jochen

Ja, doch, der hat die Verhalten sich unterschiedlich.

Jochen

Also, tatsächlich

Jochen

macht das durchaus Sinn. Also, man muss einfach mal,

Jochen

das ist vielleicht so ein bisschen, vielleicht sollte man das nicht müssen, aber

Jochen

je nachdem, wie man

Jochen

Dict verhält, äh, wie man,

Jochen

wie sich das Dict verhalten soll,

Jochen

dass man verwendet, also wenn man zum Beispiel viele

Jochen

Insatz hat von Keys,

Jochen

dann ist es besser, Order dick zu nehmen

Jochen

statt dem Default-Ding.

Jochen

Also es gibt da tatsächlich subtile

Jochen

Unterschiede. Warum, Jochen? Wie wächst das denn? Wie wächst denn ein Dictionary?

Jochen

Ja, genau.

Jochen

Ich habe es vorhin nachgeguckt.

Jochen

Soll ich es euch verraten?

Jochen

Ja, verrat mal.

Jochen

Ein Dictionary fängt an mit null Buckets.

Jochen

Wenn du ein leeres Dictionary hast, das ist tatsächlich

Johannes

speziell. Das hat null Buckets, verbraucht

Johannes

64 Byte.

Johannes

Das ist übrigens unterschiedlich zwischen 32 und 64

Johannes

Bit. Maschinen, aber

Johannes

Ich glaube, wir sind alle inzwischen auf 64-Bit angelangt.

Johannes

Sobald ich eins einfüge, hat es acht Buckets.

Johannes

Buckets sind Speicherplätze, erklären wir gleich noch,

Johannes

weil es eben zu dieser Hashmap gehört.

Johannes

Und dann verdoppelt es sich jedes Mal, wenn es zwei Drittel voll ist.

Dominik

Der Speicherbereich wird vorreserviert für alles, was wir reinhaben.

Johannes

Genau, diese Datenstruktur, die heißt Hashmap

Johannes

und die braucht leeren Platz, die kann nicht 100% voll sein.

Johannes

Und deshalb machen die halt immer

Johannes

eine Verdopplung. Verdopplung ist so eine

Johannes

Wachstumsstrategie, die gut funktioniert. Auch bei

Johannes

Resizable-Listen,

Johannes

die verdoppeln sich

Johannes

auch. Das ist einfach so eine Wachstumsstrategie,

Johannes

die so eine gute Balance ist.

Johannes

Am besten wäre es, glaube ich, wenn man

Johannes

Wurzel 3 hätte als Wachstumsfaktor. Das ist

Johannes

2,3 oder irgendwas. Aber dann

Johannes

hast du die ganze Zeit krumme Zahlen und das ist auch nicht gut.

Johannes

Ja, stimmt. Das ist bei

Jochen

dem Array-Modul

Jochen

bei dem eingebauten.

Jochen

das habe ich mir mal näher angeguckt

Jochen

aus Gründen und

Jochen

da ist das auch so, weil das

Jochen

ist ja auch interessant, das ist ja

Jochen

quasi sozusagen wie eine Liste, bloß halt

Jochen

statisch getübt.

Jochen

Und man verbraucht tatsächlich

Jochen

nur den Platz, also für den Integer braucht man halt nur

Jochen

je nachdem, 32 oder 64 Bit.

Jochen

Und da ist es auch so,

Jochen

da kann man Append sagen hinten

Jochen

und wenn man da was hinzufügt und

Jochen

der Bereich der Memory View innen

Jochen

drin ist erschöpft,

Jochen

dann verdoppelt sich das halt auch immer.

Johannes

Ja, ist eine klassische Strategie. Okay, das bedeutet aber halt auch, man darf sich nicht darüber im Unklaren sein, so ein Dickjournal verbraucht relativ viel Speicherplatz. Wenn ich einen Eintrag in ein Dickjournal reintue, dann hat es direkt 240 Byte Hauptspeicher verbraucht. Das ist nicht ganz ohne. Wenn ich sechs Einträge reintue, hat es direkt 480 Byte verbraucht. Also es verbraucht relativ viel Speicherplatz.

Johannes

Es geht hier nicht um Effizienz, sondern es geht um Schnelligkeit. Und diese Schnelligkeit, die hat der Dominik schon angesprochen, das ist sehr schnell. Das heißt, es ist O von 1. Jeder Zugriff dauert immer gleich lang, amortisiert über die Verdopplungen.

Johannes

Weil wenn ich nämlich ein Dictionary habe, was sehr viele Einträge hat und das verdoppelt sich dann, dann muss dieses Dictionary angepasst werden und eventuell verschoben werden. Dann kann es schon sein, dass es eine Weile dauert, aber amortisiert ist es offeneins jeder Zugriff. Das heißt, jeder Zugriff dauert im Schnitt gleich schnell.

Dominik

Also amortisiert bedeutet für Dictionary ist der gleichen Länge.

Dominik

Nee, das bedeutet im Schnitt.

Dominik

Im Schnitt amortisiert.

Johannes

Im Durchschnitt bedeutet das, jeder Zugriff braucht ungefähr gleich lang und das ist eine konstante Zahl.

Johannes

Es gibt einzelne, die dauern ein bisschen länger.

Dominik

Ich habe diesen Worttransfer von amortisiert auf dem Schnitt hinbekommen.

Dominik

Wenn du eine große Anzahl Zugriffe machst,

Johannes

dann ist die Dauer so, als ob du eine Instante gewählt hättest.

Dominik

Genau, weil das Umbauen quasi Grenzwert Null hat.

Johannes

Das Umbauen passiert selten genug.

Johannes

Genau, dass es Grenzwert Null hat.

Johannes

Deswegen wird amortisiert.

Dominik

Okay, also O von 1. Also O von 1 bedeutet, es ist kein Problem.

Johannes

Genau, O von 1. Wir schreiben O von 1. Also wenn ich ein Element einfüge, dann dauert es O von 1. Und wenn ich ein Element rauslese, dauert es auch O von 1. Und beim Lesen ist es immer O von 1. Also das ist nicht nur amortisiertes O von 1, sondern das ist O von 1.

Dominik

Also das heißt tatsächlich, um nochmal allen Hörern das so ein bisschen näher zu bringen, dieser Zeitnotation Big O noch nicht so viel anfangen kann. O von 1 bedeutet, es dauert quasi keine Zeit, das zu tun.

Dominik

Doch, es dauert immer gleich lang.

Jochen

Es ändert sich nicht mit der Menge, also normalerweise, wenn du jetzt sagen, O von 1 im Vergleich zu O von N, ist jetzt, bedeutet das sozusagen, wenn deine Eingabedatenmenge halt nicht N ist, dann, wenn du eine Hash-Map hast, dann ist es halt immer noch O von, ist immer noch konstant, aber bei was anderem, bei einer Liste ist es halt O von N, wenn du darauf zugreifen willst, weil du musst ja alle Dinger angucken, ob es das jetzt ist, was du haben wolltest oder nicht.

Dominik

Aber OVN1 bedeutet halt, ich kann halt nichts machen. Also das ist halt so und das ändert halt, genau, das heißt also auch egal ob kleine oder große Datenmengen, völlig wurscht, was da passiert und das heißt, der Schritt ist quasi in meiner Berechnung, ob ich da irgendwas Algorithmus verbessern kann, zu vernachlässigen, weil das keine Rolle spielt, ob das, das muss halt einfach so.

Dominik

Ja, genau.

Dominik

Und das ist was ganz Witziges.

Johannes

Ich hatte mal in der Python-Schulung einen Teilnehmer,

Johannes

der da auch gut mitgemacht hat.

Johannes

Und der war empört darüber.

Johannes

Das ist unmöglich, das kann gar nicht gehen.

Johannes

Das kann gar nicht sein.

Johannes

Und dann haben wir tatsächlich einen kleinen Benchmark geschrieben

Johannes

und haben das einfach mal ausprobiert.

Johannes

Und das ist eine sehr schöne Übung.

Johannes

Das ist eine sehr schöne Sache, einfach mal auszuprobieren,

Johannes

wie sich diese Laufzeiten verhalten.

Johannes

Wie lange es dauert, 1.000 Einträge einzufügen

Johannes

und 10.000 Einträge einzufügen und 100.000

Johannes

Einträge einzufügen und die dann auch wieder rauszulesen

Johannes

im Vergleich zu

Johannes

einer Liste.

Dominik

Also du hast einfach quasi die Keys

Dominik

mit Brackets

Dominik

dann gesetzt in einer Schleife oder was?

Dominik

Genau, und habe einfach die

Johannes

Zahlen von 1.000 bis 10.000 als Key

Johannes

und als Value, das spielt ja keine Rolle, wenn wir nur die

Johannes

Größe wissen wollen, das ist dann ein sehr

Johannes

unnützes Dictionary, weil das halt einfach

Johannes

immer sagt, zum Key 1 gehört der Wert

Johannes

1 und

Johannes

zum Key 10 gehört der Wert 10

Johannes

Aber wenn es nur ums Benchmarken geht,

Johannes

dann ist das eine einfache Sache.

Johannes

Und bei einer Liste genauso.

Johannes

Einfach mal eine Liste aus zwei Tupeln zusammengebaut.

Johannes

Und dann in dieser Liste einen bestimmten Eintrag suchen.

Johannes

Ist halt O von N,

Johannes

weil durch diese Liste von vorne bis hinten durchgegangen werden muss.

Johannes

Und wenn ich jetzt den Eintrag 100 suche,

Johannes

dann muss ich halt das erste Element angucken und fragen,

Johannes

ist das 1? Nein.

Johannes

Und das zweite Element, ist das 1? Nein.

Johannes

Und das muss ich dann 99 Mal machen.

Johannes

beim 100. sage ich, ist das Element 100?

Johannes

Und dann sage ich ja und dann bin ich fertig.

Johannes

Bei einem Dictionary,

Johannes

Hashmap, wir sprechen gleich, wie das funktioniert.

Johannes

Im Moment Magie.

Johannes

Dann passieren

Johannes

halt 10 Rechenschritte und dann

Johannes

steht da, okay, du hast jetzt so 100,

Johannes

hast du dir 100 gemerkt. Und das

Johannes

spielt keine Rolle, ob das Dictionary einen

Johannes

Eintrag hat, nämlich nur diese 100, oder

Johannes

ob es eine Million Einträge hat, das ist immer

Johannes

gleich schnell. Genau, aber was jetzt da

Johannes

interessant ist, das hat zwei Dinge. Also erstens,

Dominik

wie man dann, das ist eigentlich falter Datentyp,

Dominik

bei wem man dann in der Liste das vielleicht schneller

Dominik

suchen könnte, weil also theoretisch könntest du ja

Dominik

in der Liste quasi auch daraus eine Hashtable

Dominik

bauen, irgendwie aus allen Einträgen dieser Liste und einfach

Dominik

dann nachgucken, wenn die Hashtable sind,

Dominik

diese Datentypen oder sowas, ja, genau.

Dominik

Und dann halt überlegen sich irgendwie den Algorithmus, wie man

Dominik

relativ schnell die Dinge in dieser Liste findet,

Dominik

ohne dass man halt über die ganze Liste

Dominik

iterieren muss. Ja, aber da brauchst du eine andere

Jochen

Datenstruktur, wenn du nur die Liste hast, dann musst du halt...

Jochen

Genau, aber ja, genau. Die Liste an sich garantiert dir das

Jochen

nicht, die garantiert dir nur, das sind Elemente in einer

Jochen

Abfolge. Die nächste Frage wäre jetzt, wie halt

Dominik

in der Stickt, was ja auch im Prinzip

Dominik

eine Liste von Keys ist, jetzt erstmal so

Dominik

in der Syntag, wie das dann in den Speicher

Dominik

so reinkommt, dass man diesen Lookup machen

Dominik

kann, dass man halt quasi

Dominik

aus dem Wert des Keys

Dominik

eine Speicheradresse bekommt, quasi.

Dominik

Indem man da halt reinschreitet.

Dominik

Ich möchte noch dazu sagen, du hast jetzt gesagt,

Dominik

das ist eine Liste von Keys,

Johannes

das ist so, dem stimme ich so nicht

Johannes

ganz zu. Es gibt nämlich da drei

Johannes

Ansichten drauf. Es gibt die Keys,

Johannes

das ist ein Set,

Johannes

das ist eine Menge, die hat auch keine

Johannes

Reihenfolge.

Johannes

Ja, schon, aber früher nicht.

Johannes

Also hat eine Reihenfolge?

Johannes

Ja, aber es ist ein Set, weil im Sinne von die Reihenfolge ist nicht …

Johannes

Die Reihenfolge, die reingeschrieben worden sind?

Johannes

Ja, das ist die Reihenfolge, die jetzt halt irgendwann dazukommen sind.

Johannes

Aber wenn wir ein Dict von Python 3.4 nehmen, dann hat das keine Reihenfolge.

Dominik

Also in Python 3.5 kam ein Order Dict.

Jochen

Nee, also ein Audit-Stick gab es schon immer, aber dass das sortiert ist, das kam in 3.6 dazu, wurde aber noch nicht garantiert und ab 3.7 ist es halt auch garantiert, dass es so bleibt.

Johannes

Also in 3.6 war es ein Implementierungsdetail und in 3.7 gehört es zur Spezifikation.

Johannes

Aber wenn man sich so ein ursprüngliches Dikt mal anschaut,

Johannes

dann sind die Keys eigentlich ein Set.

Johannes

Die haben keine Reihenfolge in dem Sinne

Johannes

und die können auch keine Duplikate enthalten.

Johannes

Und das ist genau das, was eine Menge ausmacht, ja, ein Set.

Johannes

Also quasi ein Set of Sorted Set.

Johannes

Ja, wobei die Sortierung die Reihenfolge des Einfügens ist.

Johannes

Dann gibt es die Values.

Johannes

Das ist auch ein View auf diese Daten,

Johannes

die in dem Diktionary drin sind.

Johannes

Das sind halt die Werte, die da gespeichert sind.

Johannes

Das ist im Wesentlichen eine Liste.

Johannes

Die Liste der Werte.

Johannes

Und dann gibt es noch die Items.

Johannes

Das ist eine Menge aus Tupeln,

Johannes

die jeweils Key und Value enthalten.

Johannes

Und für mich sind die Items so ein bisschen das,

Johannes

was das Dictionary ausmacht.

Johannes

Das ist das, was da drin ist.

Dominik

Also damit kann man ja quasi auch

Dominik

über so ein Dictionary iterieren oder sowas.

Dominik

Man kann das als Methode dot notated aufrufen

Dominik

und dann kannst du quasi

Dominik

for key value in dot items, bla.

Johannes

Genau, for key value in dict items.

Johannes

Das ist so ein Muster, das sieht man ganz häufig,

Johannes

weil man da einfach durch das gesamte Dictionary durchgeht.

Johannes

Man könnte auch sagen for key in Dictionary

Johannes

und dann sich jeweils den Value holen,

Johannes

weil es ist ja O von 1.

Johannes

Das kostet ja so gesehen algorithmisch nichts.

Jochen

Naja, sag mal so, wenn du eine Vorschleife machst über alle,

Jochen

dann ist das halt schon O von N sozusagen.

Jochen

Ja, genau.

Jochen

Nur im Einzelfall halt nicht.

Dominik

Aber die Value noch mal rauszuholen, wenn du die schon hast.

Johannes

Genau, also die O-Notation von for key value in dict items

Johannes

irgendwas tun und for key in dictionary

Johannes

und dann den Value als dict von key holen, ist identisch.

Johannes

Aber die Laufzeiteigenschaften sind natürlich

Johannes

für den zweiten Fall schlechter,

Johannes

weil ich dann jedes Mal noch mal in das Dictionary rein muss.

Johannes

Natürlich nur für einen konstanten Faktor.

Jochen

Ja, aber der summiert sich halt auch auf.

Jochen

aber konstante Faktoren, ja, konstante Faktoren

Jochen

sind halt, also wenn

Jochen

etwas nur zehnmal langsamer ist,

Jochen

das ist auch ein konstanter Faktor, das

Jochen

macht schon

Jochen

einen Unterschied. Ist schon ein Unterschied, ja.

Jochen

Ja.

Jochen

Genau.

Jochen

Wie kann man denn Dicks bauen, wisst ihr das?

Johannes

Ich habe vorhin einen ganz coolen Trick gelernt.

Johannes

Es gibt ja mehrere Wege,

Johannes

Dictionaries zu bauen.

Johannes

Ja, was meinte du?

Dominik

Syntaxmäßig, jetzt geschreibt in der Kamera, oder

Dominik

wie ich ein Dictionary erzeuge?

Dominik

Also du kannst es natürlich einmal machen als Dictionary Comprehension,

Dominik

indem du sagst, geschweige ich in der Klammer,

Dominik

Key, Value,

Dominik

oder du machst halt einfach

Dominik

die Definition einfach in den eckigen Klammern,

Dominik

schreibst dann den Key und die Value hinterher, oder du

Dominik

schreibst eine Liste von

Dominik

Keys und Values mit Gleichzeichen

Dominik

dahinter und machst dann ein Dict raus,

Dominik

also Dict of. Ja genau, das ist

Dominik

der normale, also das ist der

Dominik

Konstruktoransatz. Ja.

Dominik

Du kannst die Keys auch in der Schleife

Dominik

einfach hinzufügen.

Dominik

Du kannst auch irgendwie, keine Ahnung,

Dominik

Tupel-Unpacking oder sowas, die ganzen

Dominik

direkt da rein geben, mit so

Dominik

Sternchen, Sternchen halt, Quarks und Tacks.

Dominik

Beziehungsweise, wenn du eine Sequenz

Dominik

von Tupeln reingibst, von zwei Tupeln, dann nimmt der

Jochen

die automatisch. Eine Methode, die ich gerne verwende,

Jochen

ist dict.fromKeys.

Jochen

Das ist auch

Jochen

sehr nett. Was macht das?

Jochen

Naja, du gibst

Jochen

halt eine Liste von

Jochen

Keys und dann halt

Jochen

vielleicht einen Default-Wert oder so und dann

Jochen

erzeugt er das Ding dann raus mit diesem

Jochen

Factory-Methoden-Aufruf

Jochen

von dem Dict.

Jochen

Default-Dict gibt es noch irgendwie?

Jochen

Das ist eine andere Sache.

Jochen

Müssen wir nachher noch drüber sprechen.

Jochen

Das ist nämlich auch eine spannende Sache.

Jochen

Ich möchte noch einmal kurz zu der Comprehension zurückkehren,

Johannes

weil die ist nämlich was sehr, sehr, sehr Cooles.

Johannes

Und die ist was, was auch für Leute,

Johannes

die das nicht kennen, super schwer zu verstehen

Johannes

ist.

Johannes

Diese

Johannes

Dictionary-Comprehension ist eine der

Johannes

coolsten Wege, die es gibt, so ein

Johannes

Dictionary zu bauen, weil es halt im Wesentlichen

Johannes

diese Schleife, die man dazu

Johannes

braucht, in das Dictionary reintut.

Johannes

Also in die Konstruktion.

Johannes

Und das

Johannes

ist was sehr, sehr Mächtiges.

Johannes

Die Syntax davon jetzt hier im Podcast zu besprechen,

Johannes

ist vielleicht schwierig.

Jochen

Muss man sich ansehen.

Johannes

Aber das ist auf jeden Fall was, was man ansehen kann.

Johannes

Ich habe vorhin noch einen sehr coolen Trick gelernt und das ist

Johannes

DictSip. Also wenn ich

Johannes

eine Liste von Keys habe und eine Liste von

Johannes

Values,

Johannes

dann kann ich die sippen und dann

Johannes

einen Dick Schnee draus machen.

Dominik

Das geht auch nur für gleich lange Listen, ne?

Dominik

SIP nimmt auch

Johannes

unterschiedlich lange Listen und schneidet dann halt den Rest ab.

Johannes

Aber das ist, glaube ich, nicht der Sinn der Sache.

Johannes

Der Sinn der Sache ist, du hast schon die Keys und du hast schon

Johannes

die Values, aber in zwei Händen und mit SIP

Johannes

kannst du sie in

Johannes

eine schöne Reihenfolge bringen, die das Dick Schnee...

Johannes

Einmal Reißverschluss, bitte.

Johannes

So, wie kann man denn

Johannes

da Sachen wieder rauskriegen? Dominik, weißt du,

Johannes

ich frage dich jetzt ab, ich finde das total gut.

Johannes

Wie komme ich an die Werte wieder dran?

Johannes

Ja, du kannst einfach

Johannes

Wenn ich jetzt ein Telefonbuch habe,

Johannes

wie kriege ich deine Telefonnummer raus?

Dominik

Du machst halt zum Beispiel entweder ein Get oder halt mit der

Dominik

Brackets-Syntax ziehst du die Key direkt raus.

Dominik

Was ist da der Unterschied?

Dominik

Bei Get kriegst du einen Default-Wert zurück und du kriegst

Dominik

einen Error, wenn du

Dominik

daraus einen versuchst, eine Key zu lesen, die es nicht gibt.

Dominik

Genau, wenn du es mit eckigen Klammern machst,

Johannes

kriegst du im besten Fall einen Key-Error.

Johannes

Der heißt tatsächlich Key-Error.

Johannes

Also wenn man das abfangen möchte,

Dominik

gibt es das heißt. Genau, also beim Get kannst du halt

Dominik

dann den Default dann dranhängen. Es gibt noch

Dominik

zwei andere coole. Ich wollte die Frage beantworten.

Dominik

Es gibt noch zwei andere coole Attribute, die heißen

Dominik

Pop und Pop Item.

Dominik

Ja.

Dominik

Und die sind quasi

Johannes

destruktiv, sie sind destruktiver Zugriff.

Johannes

Wenn ich sage, wie aus einer Liste

Johannes

wird der Key entfernt. Dominik?

Johannes

Ja. Dann heißt es

Johannes

entferne den Eintrag für Dominik,

Johannes

aber gib mir den Wert auch noch zurück.

Johannes

Wie bei einer Liste. Wie bei einer Liste,

Johannes

genau. Also, ja gut, halt mit diesem Key

Johannes

Zugriff. Bei POP muss ich immer den

Johannes

Key sagen, bei einer Liste müsste ich den Index

Johannes

sagen. Genau, also

Dominik

er gibt dir den ersten Wert, was natürlich beim

Dominik

DIC nicht geht, weil das nur einer ist. Genau, das heißt

Johannes

DIC.POP muss immer einen Key haben.

Johannes

Es gibt da keinen ersten

Johannes

oder letzten oder wie auch immer.

Johannes

Aber es gibt POP-Item.

Johannes

Und POP-Item

Johannes

das

Johannes

macht LIFO,

Johannes

Last In, First Out. Das heißt, es gibt dir

Johannes

tatsächlich den letzten Eintrag,

Johannes

der hinzugefügt wurde,

Johannes

zurück als Item mit Key und Value.

Jochen

Dann braucht man den Key nicht mehr. Das ist natürlich interessant.

Jochen

Als Key und Value. Das ist schon

Jochen

sehr cool. Das heißt,

Jochen

du kannst so eine While-Schleife machen

Johannes

und kannst dieses Dictionary sozusagen

Johannes

abarbeiten.

Johannes

Und hast dann so eine Art Dictionary-Key. Und das ist

Johannes

eine praktische Sache,

Johannes

die ich erst heute gelesen habe.

Jochen

Ja, sehr schön. Ne, habe ich auch so noch

Jochen

nicht verwendet, aber da fallen mir auch direkt viele

Jochen

Sachen zu ein, die man damit cool machen kann.

Jochen

Ja.

Jochen

Wo man so ein Dictionary zerlegen kann.

Jochen

Und ja, es gibt auch noch SetDefault. Ich weiß nicht, ob man das Leuten überhaupt erzählen sollte, dass es die Methode noch gibt.

Jochen

Nein, das darf man nicht sagen.

Jochen

Das darf man nicht sagen. Die ist eigentlich nicht gut.

Jochen

Also die liefert halt auch quasi das zurück, aber mit einem Default, den man dann noch angeben kann, wenn das nicht existiert.

Jochen

Ja, stimmt. Wo ich anfange, das zu erklären, fällt mir schon ein, dass es vielleicht keine gute Idee ist.

Johannes

Es ist, glaube ich, besser, da direkt ein Default-Tick zu verwenden.

Jochen

Genau, das ist auch die Empfehlung. Sollte man halt

Jochen

heutzutage eher Default-Dict nehmen. Oder Get.

Jochen

Ein Get und dann den Wert setzen.

Dominik

Wo ist da ein Unterschied zwischen Get und Wertsetzen

Dominik

und Default-Dict?

Dominik

Dafür müssen wir erst wissen, was ein Default-Dict ist.

Dominik

Dann erzähl mir, was ein Default-Dict ist.

Dominik

Ein Default-Dict ist ein Dictionary.

Johannes

Eine Unterklasse von Dictionary.

Dominik

Das keine Keys hat, aber wenn du einen Key abrufen

Dominik

willst, den es noch nicht gibt, dann gib dir den Default-Wert zurück.

Johannes

Genau. Du sagst eben,

Johannes

welchen Standardwert es haben soll und wenn du

Johannes

einen Key abrufst, den es noch nicht gibt, kriegst du den Standardwert.

Johannes

Und da gibt es

Johannes

drei große Varianten

Johannes

davon. Die erste ist die Lambda-Variante,

Johannes

wo du halt eine Funktion

Johannes

reingibst, die dann diesen Standardwert

Johannes

erzeugt.

Johannes

Und das ist sozusagen die allgemeine. Das ist

Johannes

Default-Dict. Du musst dem Default-Dict irgendeine

Johannes

sogenannte Factory geben, damit er diesen Wert

Johannes

erzeugen kann. Und da kannst du jede

Johannes

beliebige Funktion reintun. Meistens ist das halt irgendeine

Johannes

kleine Lernversion. Aber es gibt schon

Johannes

zwei Funktionen, die du da verwenden kannst, nämlich List

Johannes

und Int,

Johannes

die nützlich sind. Also wenn du

Johannes

Default-Dict, Klammer auf, List,

Johannes

Klammer zu machst, dann heißt

Johannes

es, das ist ein Dictionary und wenn du da einen Key

Johannes

abrufst, dann

Johannes

gibt er dir, wenn du noch nichts eingefügt hast

Johannes

für diesen Key, eine leere Liste zurück.

Johannes

Eine neue leere Liste.

Johannes

Und genauso

Johannes

für Int. Wenn du

Johannes

ein Default-Dict

Johannes

Int hast, dann kannst du

Johannes

jeden beliebigen Key abrufen und kriegst 0

Johannes

zurück.

Johannes

Ja.

Dominik

Du kannst einen Counter machen, dass der immer geht auf das.

Dominik

Ja, aber Counter gibt es auch.

Dominik

Da gibt es schon eine Klasse für, ja.

Johannes

Und die ist richtig cool, diese Counter-Klasse.

Johannes

Die müssen wir uns auch gleich noch besprechen.

Johannes

Okay, wofür würde ich Default-Dict verwenden?

Johannes

Das klassische Beispiel ist, wenn man sich so einen Counter baut.

Dominik

Aber nochmal, wenn du das gleiche nochmal aufrufst,

Dominik

dann gibt man natürlich den neuen Wert zurück, ne?

Dominik

Genau, also wenn du einen Wert in dieses Default-Dict reinspeicherst,

Dominik

dann ist es wie ein normales Dictionary, ja?

Johannes

Also wenn es diesen Key schon gibt,

Johannes

dann kriegst du das, was da gespeichert wurde.

Johannes

Das kann auch was anderes sein als ein Int oder eine Liste, ja?

Johannes

Das heißt, es ist nicht eine Typisierung,

Johannes

sondern das ist nur so dieser Fallback.

Johannes

Da ist nochmal noch eine

Dominik

Zwischenfrage, ein kleiner Express. Wenn ich jetzt da

Dominik

ein Get mache auf so eine Liste, ja, auf so ein Default-Dict

Dominik

von der Liste und ich habe dann

Dominik

eine leere Liste in der Hand und ich schreibe in die was

Dominik

rein, beim nächsten Mal auf

Dominik

denselben Key gibt der mir dann diese Liste,

Dominik

in der was drin ist?

Dominik

Nee.

Dominik

Warum nicht? Das wäre das, was Jochen

Dominik

vorher gesagt hat, das wäre SetDefault.

Dominik

Weil du beim Abrufen

Johannes

entweder den Wert kriegst,

Johannes

der in dem Dictionary drin ist,

Johannes

oder den, den die Factory erzeugt.

Johannes

Aber der wird nicht automatisch in dieses Dictionary abgelegt.

Dominik

Aber das ist doch bei Listen, haben wir doch das Problem,

Dominik

dass dann das Objekt der Liste dann es doch schon gibt

Dominik

und dass das Objekt dieser Liste, auf das dann ja ...

Johannes

Genau, aber die wird nicht in das Dictionary abgelegt.

Dominik

Du kriegst dann eine neue Liste, die du nur in der Hand hast.

Dominik

Und du musst die dann tatsächlich zugreifen.

Johannes

Wenn du das möchtest, dass du eine Liste abrufst

Johannes

und die dann bearbeiten kannst, dann musst du SetDefault machen.

Johannes

Und SetDefault heißt, ruf einen Key ab, wenn es den schon gibt,

Johannes

gib mir das, was da drin ist, ansonsten setze

Johannes

in dem Dictionary den Wert, den ich dir

Johannes

da als Default angebe und

Johannes

gib ihn mir zurück. Okay, ja, das

Johannes

dachte ich, dass wäre das, was Default-Dictionary machen würde, okay,

Dominik

das heißt, dafür muss ich Set-Default machen.

Dominik

Genau, dafür musst du das Set-Default machen.

Dominik

Ja, aber es ist, die Funktion

Jochen

ist Set-Default, also sie ist in mehrerer

Jochen

Hinsicht verwirrend, sie ist auch verwirrend benannt,

Jochen

wie man es auch gerade wieder sehen konnte

Jochen

und vielleicht sollte man das echt mehr, weil

Jochen

tatsächlich, wenn man so eine Default-Dict macht, ist es sauberer

Jochen

und ja, genau,

Jochen

was ich noch anmerken wollte zu den

Jochen

Factory-Funktionen, die man übergeben muss. Also es kann

Jochen

eine beliebige Funktion sein. Die einzige Bedingung ist,

Jochen

sie darf keine Argumente

Jochen

nehmen.

Jochen

Wenn man jetzt so mehrfach verschachtelte

Jochen

Geschichten baut, das geht.

Jochen

Aber das wird dann auch relativ schnell relativ

Jochen

unübersichtlich.

Jochen

Ich habe noch keine gute Lösung

Jochen

dafür, aber das ist, dann muss man halt

Jochen

da, das sieht dann komisch aus, aber ja.

Dominik

Das ist ein bisschen blöd, wenn es keine Argumente sein können.

Dominik

Also Factory-Story

Dominik

würde man ja gerne mal auf eine bestimmte Art und Weise

Dominik

initialisieren. Ja, das muss man ja

Dominik

irgendwie von einer, die Falltrack irgendwie alles

Dominik

schon erben und muss das dann irgendwie schon hinstecken.

Dominik

Ja, aber da gibt es etwas,

Jochen

also zumal, wenn man jetzt

Jochen

bei unterschiedlichen Keys unterschiedliche Sachen

Jochen

machen möchte, es kann ja manchmal sein,

Jochen

du sagst so, wenn ich diesen Key habe, okay,

Jochen

dann möchte ich ja gar keine Liste dazu machen, sondern was

Jochen

ganz anderes oder so.

Jochen

Und dann geht das mit dem Default-Tick ja alles

Jochen

so nicht mehr so richtig, eben deswegen, weil man kann

Jochen

halt nicht ein Argument angeben,

Jochen

was man dann, also das ist,

Jochen

das geht dann nicht mehr. Da gibt es aber auch etwas

Jochen

sehr cool ist, was ich auch erst in der Vorbereitung, ich habe ja

Jochen

einfach nochmal geguckt, was zu

Jochen

dieser Episode, habe ich mir nochmal so ein bisschen

Jochen

angeguckt, was habe ich denn an Literatur zu Dicts

Jochen

steht da irgendwas Interessantes drin und habe ich tatsächlich

Jochen

etwas gefunden, was ich noch nicht wusste, wo ich auch sagen

Jochen

würde, oh cool, dass ich das jetzt weiß und zwar

Jochen

gibt es Dunder Missing

Jochen

als sozusagen Spezial

Jochen

Methode, die man überschreiten kann,

Jochen

wo man dann den Key bekommt.

Jochen

Das ist quasi der Key Error. Du kannst den Key Error

Jochen

überschreiben. Ja.

Dominik

Mach dann Default Dict, mache ich dann eine neue Klasse, die von

Dominik

DefaultDictErben, du beschreibst dann dann Missing und guck

Dominik

dann mit einem MatchCaseStatement, was

Dominik

da drin ist. Genau, oder

Jochen

du kannst von DefaultDictErben,

Jochen

na klar, aber das musst du dann ja

Jochen

im Grunde nicht mehr, weil wenn du die Methode überschreibst,

Jochen

dann bestimmst du ja selber, was passiert.

Jochen

Und da kannst du alles. Das ging

Jochen

früher übrigens auch nicht.

Johannes

Konnte früher nicht von DictErben, deshalb gibt es noch eine Klasse, die

Johannes

UserDict heißt.

Johannes

Das heißt tatsächlich, ich mache tatsächlich so was

Dominik

ähnliches wie UserDict und ich mache eine neue Klasse auf die

Dominik

Erb einfach von Dict und da überschreibe ich dann nur die

Dominik

Misting-Methode und dann gucke ich halt, was das ist, statt dem

Dominik

Key-Error jetzt rauszugeben, dass er dann tatsächlich

Dominik

irgendwas Neues anstellt.

Jochen

Das würde auch tatsächlich funktionieren, aber

Jochen

es wird,

Jochen

diese Diskussion hatten wir in dem

Jochen

Python User Group Düsseldorf

Jochen

Channel auch vor kurzem,

Jochen

ob es denn okay ist, von Dict zu erben

Jochen

oder wenn man lieber von UserDict erben soll oder so

Jochen

und ich hatte das halt noch so im Hinterkopf,

Jochen

dass man von UserDict erben soll und nicht von Dict

Jochen

und tatsächlich

Jochen

habe ich jetzt auch nochmal nachgeguckt

Jochen

und nee, man soll von UserDict erben

Jochen

und nicht von Dict. Also man kann das ja

Jochen

zwar jetzt, aber... Was ist da der

Jochen

Unterschied? Also der entscheidende

Jochen

Unterschied, warum das unter Umständen

Jochen

einem Probleme machen kann, ist,

Jochen

dass

Jochen

bestimmte Methoden

Jochen

halt, also Missing ist jetzt, die

Jochen

funktioniert, die kann man überschreiben, aber bestimmte andere

Jochen

nicht. Und wenn du dann Dict auf bestimmte

Jochen

andere Arten, wenn du da Sachen mit

Jochen

machst, dann geht das

Jochen

an den Methoden, die du überschrieben hast, vorbei.

Jochen

Das heißt, wenn du von Dict

Jochen

von dem Build-in diktierst

Jochen

und dann überschreibst du halt

Jochen

irgendeine Methode und denkst, ja, müsste doch funktionieren,

Jochen

dann funktioniert es manchmal halt vielleicht nicht, weil

Jochen

zum Beispiel, also auch der Konstruktor

Jochen

davon ist halt so, der schreibt das halt

Jochen

irgendwie direkt, der geht nicht über die

Jochen

Set-Item, Get-Item-Geschichten,

Jochen

die es da halt normalerweise geht. Das heißt,

Jochen

dann verhält sich das Ding unter Umständen

Jochen

unerwartet und ja, Laufzeitverhalten

Jochen

ist auch so ein bisschen anders, also

Jochen

und, ja, das habe ich jetzt aber auch

Jochen

wieder vergessen, also es war auch irgendwie, ist eine

Jochen

wichtige Geschichte, warum das, wenn das

Jochen

im Data-Attribut ist und sozusagen die

Jochen

Zugriffe dahin nur delegiert werden,

Jochen

das macht auch irgendwie, ich glaube, es kann sogar sein, dass

Jochen

das der Grund ist, weshalb man Set-Item, Get-Item

Jochen

dann überhaupt quasi richtig überschreiben

Jochen

kann, weil wenn das halt

Jochen

delegiert wird. Ja, genau, genau.

Jochen

Ja, und daher

Jochen

sollte man, wenn man das selber,

Jochen

wenn man erben will und will Sachen überschreiben,

Jochen

dann lieber UserDict nehmen, statt

Jochen

einfach vom Build-In erben. Also

Jochen

UserDict ist quasi

Johannes

eine Klasse, die das gleiche Interface hat

Johannes

wie Dictionary. Ja.

Johannes

aber eben ein Attribut

Johannes

heißt, das heißt Data

Johannes

und das ist ein Dictionary und

Johannes

einfach alles durchreicht an dieses Data.

Johannes

Genau. Und das bedeutet, dass wenn

Johannes

ich von UserDict ableite, kann ich jede beliebige

Johannes

Methode überschreiben und die wird dann auch

Johannes

korrekt aufgerufen, auch Konstruktor und alles mögliche.

Johannes

Ja, genau.

Johannes

Ja.

Johannes

Ja, okay, wusste ich auch nicht. Ich wusste nicht,

Jochen

dass es da Unterschiede gibt. Ja, es ist immer wieder interessant, auch wenn

Jochen

ich dachte, also ich meine, das verwendet man ja jeden Tag

Jochen

und irgendwie schon ganz lange und so und

Jochen

dann ist es so, kann ja eigentlich nichts Neues mehr.

Jochen

Aber manchmal so, ja.

Johannes

Aber das ist was, was man doch relativ selten macht von Dictionary.

Johannes

Also generell von

Johannes

Build-ins, so Sachen,

Johannes

fühlt sich immer so ein bisschen komisch an.

Johannes

Ja, ist nicht so häufig.

Johannes

Die sind einfach gut genug.

Johannes

Beziehungsweise, wenn man

Johannes

eine neue Datastruktur sich schreibt,

Johannes

dann benutzt man normalerweise eben eine

Johannes

und leidet nicht direkt

Johannes

davon ab. So ist meine Erfahrung.

Dominik

Instanziert die dann irgendwie so mit so einem

Dominik

Injektor-Pattern oder sowas, dass man die halt dann benutzt.

Dominik

Genau, dieses Data, dass da halt

Dominik

sagst, okay, mein Baum ist

Dominik

eigentlich eine Liste, aber

Dominik

ich habe

Johannes

eine Liste, die das macht. Ich habe nicht das Interface

Johannes

von Liste geerbt, sondern ich habe halt eine

Johannes

in der Hand, die das macht.

Johannes

Das ist so meine Erfahrung. Ich weiß nicht, wie ihr das seht.

Jochen

Doch, doch. Nee, ich sehe das

Jochen

ganz genauso.

Jochen

Achso, genau, das ist auch noch der eine

Jochen

Grund dafür, warum

Jochen

das mit dem Delegieren eine gute Idee

Jochen

ist, weil halt ansonsten, wenn du direkt erbst,

Jochen

dann hat

Jochen

dein Objekt eine ganze Menge Methoden,

Jochen

die halt unsinnig

Jochen

sind unter Umständen. Also

Jochen

in einem Kontext, wo man sich dann fragt, wenn man so

Jochen

Dia macht auf dein Objekt.

Jochen

Und dann sieht man halt einen ganzen Haufen komisches

Jochen

Zeug, wo man sich dann so, hä, warum ist das denn alles da drin?

Jochen

Was man halt einfach so mitbekommt,

Jochen

wenn man das, wenn man da direkt erbt.

Jochen

Also, ja.

Jochen

Okay, ich frage mich alles.

Jochen

Das ist dieses Interesse.

Dominik

Wir müssen noch so ein paar Sachen, ich habe jetzt meine Notizenliste,

Dominik

die ist leider gerade leer gegangen, aber

Dominik

da ist so ein

Dominik

Ladegerät und da ist so ein,

Jochen

das kannst du dein Telefon anschließen.

Dominik

Oh, du hast USB-C? Wow.

Dominik

Als Apple-Haushalt USB-C.

Dominik

Ja, ja, brauchen wir das schon?

Dominik

Cool. Es gibt eine Methode

Johannes

in Dictionary, wo wir gerade über das

Johannes

Dictionary-Interface sprechen,

Johannes

die ist in 3.9 dazugekommen.

Johannes

In 3.9 hat sich das Dictionary-Interface

Johannes

verändert. Okay.

Johannes

Und zwar ist der Pipe-Operator

Johannes

dazugekommen. Ah, ja, richtig.

Johannes

Ja, klar, natürlich.

Johannes

Und das ist sowas, was,

Johannes

wenn man das braucht, dann ist das

Johannes

ungeheuer wichtig und wenn man es nicht

Johannes

braucht, dann ist es so, okay.

Johannes

Nie gedacht, dass jemand sowas brauchen könnte.

Johannes

Das ist Dictionary-Vereinigung.

Johannes

Ja, Unions zwischen von Dicts.

Johannes

Genau, da gibt es jetzt den Operator dafür.

Johannes

Früher musste man immer,

Johannes

jede von uns hat so eine Sammlung von Tricks,

Johannes

wie man Dictionaries vereinigt.

Johannes

Ja, das ist ganz einfach mit Stern, Stern

Johannes

und unter Dictionary und

Johannes

ja, und das

Johannes

gibt es jetzt als Operator und auch mit

Johannes

Pipe gleich, also man kann auch gleich rein

Johannes

vereinigen, wobei das einfach ein Update

Johannes

ist, meiner Meinung nach, oder?

Johannes

Oh, das würde ich jetzt ausprobieren,

Jochen

das weiß ich auch nicht, aber es stimmt, ich

Jochen

ich wusste, dass das passiert ist, ich habe es aber nie

Jochen

verwendet seitdem, daher ist es

Jochen

mir jetzt gar nicht mehr bewusst, dass es diese Erinnerung gab.

Jochen

Ein Update ist ja Union,

Jochen

ist es exklusiv, ist die Frage.

Jochen

Es ist immer exklusiv,

Jochen

weil du ja keine Keys verdoppelt hast.

Dominik

Ja, aber dann geht das nicht mehr im Update, weil bei Update werden ja nur die Keys

Dominik

geupdatet, die in dem Update enthalten sind.

Dominik

Nee, die .update,

Dominik

dictionary.update übernimmt

Johannes

alle Keys und Values aus dem

Johannes

Herangebiet. Genau, aber die, die es noch nicht drin waren.

Dominik

Genau, aber wenn welche vorher schon drin waren

Dominik

und die dann überschrieben werden.

Dominik

Dann werden die überschrieben.

Dominik

Genau, aber wenn die vorher schon drin wären,

Dominik

die nicht.

Dominik

Das ist bei Vereinigung aber genauso.

Dominik

Nein, aber wenn die vorher schon drin waren

Dominik

und nicht in dem neuen drin sind,

Dominik

dann sind die, wie sie vorher waren.

Dominik

Aber wenn du den Union Operator gleich machst,

Dominik

dann sind sie eben nicht mehr drin,

Dominik

weil sie halt nicht in dem Update sind.

Dominik

Das verstehe ich jetzt nicht.

Dominik

Okay, du hast zwei einigermaßen disziplinierte Names.

Dominik

Du hast zwei Mengen, du hast D1 und D2.

Dominik

Genau, du hast zwei einigermaßen disziplinierte Names.

Dominik

Und da sind irgendwie zwei Keys gleich.

Dominik

Wenn du jetzt mit dem Update machst,

Dominik

werden die zwei gleichen Keys

Dominik

in dem ersten Dictionary überschrieben.

Dominik

erstes Addict-Update

Dominik

wenn du aber die Union machst

Dominik

erstes Addict-Union, zweites

Dominik

nein, dann sind nur noch die zwei Keys drin

Dominik

nee, das kann ich

Dominik

nee, das wäre ja der Schnitt

Dominik

nicht die Vereinigung

Dominik

achso, stimmt

Dominik

das gibt es nur bei Set

Dominik

das gibt es nur bei Set

Dominik

bei Set gibt es das

Dominik

gibt es nicht auch

Dominik

die Intersect

Johannes

nee, für Addict-Union gibt es keine Intersect

Dominik

Okay, schade eigentlich, weil das wäre doch eigentlich sehr logisch, dass das mit dem, jetzt habe ich den Pipe Operator nicht richtig verstanden.

Johannes

Es wäre logisch, dass es diese ganzen mathematischen Operationen alle für Set und Dictionary haben.

Dominik

Genau, dass du halt quasi dann nicht nur sagst, du machst halt einfach irgendwie ein Und-Und oder wie auch immer man das machen will von dem anderen Dikt und dann hast du die Unions direkt, das wäre doch schön Syntax, oder?

Jochen

Ich probiere das gerade mal in der Rappel aus, ja.

Jochen

Ja, mach mal.

Jochen

Union ist oder und das

Johannes

ist einfach

Johannes

die Vereinigung. Also die Keys

Johannes

aus dem einen Dictionary und die Keys aus dem anderen Dictionary.

Johannes

Ja, okay. Mit den Werten aus den jeweils

Dominik

letzten. Mach mal und und, Peter.

Jochen

Nee, das geht, nee, und und geht schon mal gar nicht.

Jochen

Und und gibt es in Python sowieso nicht? Gibt es nicht.

Jochen

Und und geht nicht. Und da sagt er

Jochen

unsupported operant type.

Jochen

Bitwise geht auch nicht. Ja, okay.

Jochen

Also tatsächlich, es geht nur die Vereinigung, ja.

Jochen

Ja, okay, dann ist das gleich wie ein Update.

Jochen

Wohingegen bei set, wenn man das jetzt so macht,

Johannes

Bei Set gibt's Intersect. Es gibt

Johannes

Set.Intersect, es gibt

Johannes

Set.Union und es gibt Set.

Johannes

Es gibt noch eine dritte.

Jochen

Difference. Symmetric

Jochen

Difference oder sowas. Ja, genau.

Jochen

Ja, Symmetric Difference ist ja

Jochen

das eine minus das andere plus das andere minus das

Jochen

eine.

Dominik

Schade, dass der Intersect nicht hat. Warum hat der das denn nicht?

Dominik

Also bei Set geht, aber bei Dix nicht.

Dominik

Das müsste ja irgendwann mal reinkommen.

Jochen

Die Frage ist, wie sollen denn dann die Values aussehen?

Jochen

Bei der Intersection

Jochen

der Keys. Welche nimmst du denn dann?

Jochen

Hm, jetzt hast du mich.

Dominik

Eine Liste von beiden wahrscheinlich oder sowas.

Jochen

Ja, aber das wäre dann schon sehr unerwartet, oder?

Jochen

Ich meine, man könnte auch auf die Idee kommen,

Jochen

es müsste anders sein und dann wundert man sich halt,

Jochen

was passiert, was, also, ja.

Jochen

Ja, also eigentlich müsstest du den Schnitt über die Keys machen

Jochen

und dann entscheiden, aus welcher Quelle du die Value nimmst.

Dominik

Das ist halt quasi wie beim Update mit Exclude oder sowas.

Dominik

Kann man das machen mit Exclude?

Dominik

Nee.

Dominik

Ja, auch doof.

Dominik

Ja, also, was mir jetzt

Dominik

wieder anfällt, es ist irgendwie relativ ähnlich zu dem, was man

Dominik

irgendwie bei den neuen Sachen hat, wie mit Data Classes

Dominik

oder PyIdentic oder sowas, oder

Dominik

was gibt's denn noch, alles AdWords oder sowas?

Dominik

Also, was diese, ja,

Jochen

oh, es gibt auch noch, ja,

Jochen

Named Tuples zum Beispiel.

Jochen

Genau, das ist auch spannend.

Jochen

Warum denn Named Tuple?

Jochen

Ja, das ist ein total komischer

Jochen

Name dafür, ist auch, ich weiß

Dominik

auch nicht. Um dotnotated Zugriffe

Dominik

auf irgendwelche Objekte zu haben für die einzelnen.

Johannes

Okay, aber dann, also was ist denn der Unterschied zwischen dem Dictionary und einer Klasse? Weil bei einer Klasse habe ich auch Namen drin, Punkt irgendwas und da ist genau ein Wert dazu drin.

Dominik

Du hast einen Konstruktor und irgendwie noch.

Dominik

Ja gut, aber das ist ja, da musst du ja eigentlich.

Dominik

Der Konstruktor ist nur eine Konvention.

Jochen

Ja, du kannst auch deine Sachen anders konstruieren, genau. Also ich würde sagen, es gibt keinen großen Unterschied. Tatsächlich ist es eine sehr ähnliche Geschichte und ich glaube, ich meine, es ist ja auch so, dass.

Jochen

Alles Diktat.

Jochen

Genau, also in Python-Objekte, das sind halt Dicts sozusagen, was ihre Struktur angeht.

Johannes

Mit ein kleines bisschen Syntax dazu.

Johannes

Genau.

Johannes

Tatsächlich ist es sogar, also ich weiß nicht, ob das bekannt ist.

Johannes

Unter uns dreien sicherlich, aber unter den Hörern vielleicht nicht.

Johannes

Jede Instanz einer Klasse ist im Wesentlichen ein Dictionary.

Johannes

Also das hat ein Attribut, das heißt unterstrich, unterstrich, Dict, unterstrich, unterstrich.

Johannes

Und da stehen die Dinge drin, die

Johannes

die Values in dieser Instanz

Johannes

sind. Also eine Instanz ist immer

Johannes

ein Dictionary in Python.

Johannes

Das ist irgendwie

Johannes

komisch oder seltsam.

Johannes

Gerade wenn man von anderen Programmiersprachen

Johannes

kommt, weil in anderen Programmiersprachen ist es ja nicht so.

Johannes

Weiß ich nicht. Also ich würde

Jochen

gerade sagen, bei dem, was üblicherweise

Jochen

so als Skriptsprache

Jochen

qualifiziert wird.

Jochen

Da ist das auch, also bei

Jochen

JavaScript, da heißen die Dinger sogar Object.

Jochen

Vielleicht ist das das entscheidende Merkmal

Jochen

einer Skriptsprache.

Jochen

Also bei

Jochen

Perl war das auf jeden Fall auch so.

Jochen

Da waren auch, also ich meine, das hat ja

Jochen

keine offizielle... Bei dynamischen

Johannes

Klassen und dynamischen Instanzen geht es ja quasi

Johannes

nicht anders. Du musst ja quasi diese Zuordnung haben

Johannes

von Attributname zu irgendeinem

Johannes

Wert. Ja.

Johannes

Genau. Aber bei kompilierten Sprachen ist das ja anders.

Jochen

Ne, da ist es anders, genau. Bei kompilierten Sprachen

Johannes

musst du es nur während der Kompilierungszeit machen

Johannes

und dann kannst du sagen, okay, das Attribut

Johannes

mit dem Namen x ist halt Feld Nummer 2.

Jochen

Ja. Man kann das

Jochen

in Python auch machen, quasi. Man kann das

Jochen

halt festdengeln, ohne dass das halt dann

Jochen

noch so dynamisch...

Jochen

Ja, man kann halt die Attribute

Jochen

in einem Spezialattribut

Jochen

dann da Slots angeben und dann

Jochen

sind die halt da fix.

Jochen

Die kann man dann aber auch nicht mehr dynamisch zuweisen.

Jochen

Ist dann aber...

Jochen

Das ist aber auch nur Konvention, oder?

Jochen

Nee, nee, das ist dann tatsächlich schneller.

Jochen

Wenn ich so ein Slot-Ding mache, dann kann ich doch

Jochen

trotzdem zusätzlich...

Dominik

Achso, Moment.

Jochen

Kann ich dann trotzdem dynamisch zuweisen?

Jochen

Ich weiß es nicht, meine, das geht dann nicht mehr.

Jochen

Da muss ich ausprobieren.

Jochen

Doch, er macht seinen Editor an.

Johannes

Einer von uns beiden ist gleich falsch.

Johannes

Oder eben Name-Tupel.

Johannes

Name-Tupel ist genauso,

Johannes

nur halt schneller.

Johannes

Weil der eben diesen Aufruf

Johannes

nicht über ein Dictionary macht, sondern über eine lineare

Johannes

Liste, weil die Annahme ist, dass du

Johannes

nicht so viele davon hast.

Johannes

Oder vielleicht ist das so eine Hybrid-Sache.

Johannes

So ein bisschen ist das Dictionary ja der Kern

Johannes

von Python. Es gibt ja so eine

Jochen

Liste. Moment, ich habe es gerade ausprobiert.

Jochen

Nein, wenn man halt Slots

Jochen

definiert hat und dann was anderes dynamisch

Jochen

zuweisen möchte, kriegt man eine Exception Attribute Error.

Jochen

Also wenn man Slots macht,

Jochen

dann ist es kein richtiges Dictionary, sondern nur.

Jochen

Also es ist halt auch so ein Trick, damit kann man

Jochen

halt, wenn man viele Objekte hat oder so, damit kann man

Jochen

die Objekte selber schneller machen und sie brauchen viel weniger

Jochen

Speicher. Jetzt muss man noch

Jochen

erklären. Aber Nentupel macht das doch genauso,

Johannes

oder Jochen? Jetzt ist es auch schneller als

Johannes

eine allgemeine Klasse.

Jochen

Ja, ja, klar. Named Tuple macht das genauso und darüber funktioniert es. Ich glaube, dann intern kann es sogar sein, dass die interne Datenstruktur Tuple ist und sich dann sozusagen nur eine Zuordnung gemerkt wird von Index auf irgendeinen Namen.

Johannes

Aber das würde ja schon nichts bringen, dann hättest du ja den gleichen Aufruf wieder, sondern das muss eine andere Struktur sein, das ist keine Hashmap.

Jochen

Ja, ja, ja, nee, das ist irgendwas anderes, keine Ahnung, ja, was auch immer.

Johannes

man darf nicht vergessen, wenn ich eine kleine Menge

Johannes

an Keys

Johannes

habe, dann ist

Johannes

so eine Art Listenzuweisung, also ich merke mir

Johannes

einfach, die Keys in

Johannes

einer Liste und gehe die Liste linear durch,

Johannes

das kann schneller sein als so ein

Johannes

Hashmap-Zugriff. Ja. Für kleine

Johannes

Werte von n.

Johannes

Für kleine Werte von n ist o von n kleiner

Johannes

als o von 1. Kann sein. Ja, kann

Johannes

gut sein, ja. Und das ist, glaube ich,

Johannes

der Trick von Slots und der Trick von Name-Tupel,

Johannes

dass die halt sagen, okay, wir machen

Johannes

keine allgemeine Zuweisung, sondern wir sagen,

Johannes

aha, wir haben ja nur drei

Johannes

benannte Attribute, dann ist es besser, die in einer Liste

Johannes

zu haben.

Dominik

Okay, das Slots bitte noch einmal

Dominik

explizit erklären, weil das kommt gerade zum ersten Mal vor.

Dominik

Slots und Name-Tupel.

Dominik

Also Slots, wie gesagt,

Dominik

darüber weiß ich jetzt gar nicht,

Dominik

was du diktst, frage ich.

Dominik

Erklär es mal als Name-Tupel.

Dominik

Was ist denn ein Name-Tupel?

Dominik

Ich wollte gerade nach Slots fragen.

Dominik

Ja, das kommt gleich.

Jochen

Naja, da definierst du

Jochen

sozusagen ein Objekt, dadurch, dass du am Anfang

Jochen

du gibst halt so, glaube ich, wie das Aufruf

Jochen

Name-Truppel, dann sagt man irgendwie

Jochen

einen Namen dafür und dann sagt man die

Jochen

Attribute, die das haben kann

Jochen

irgendwie und dann. Und das

Johannes

verhält sich dann aber wie eine Klasse. Ja, genau.

Johannes

Und dann kann man mit Punkt drauf zugreifen.

Johannes

Aber nur mit diesen, die ich da angegeben habe.

Johannes

Also wenn ich ein Name-Truppel habe, das heißt

Johannes

FUBA.

Johannes

Keine Ahnung, das heißt FUBA und das hat die Attribute

Johannes

A, B und C.

Johannes

Dann kann ich ein FUBA.A

Johannes

machen und fuba.b und fuba.c und kriegt

Johannes

die entsprechenden, das verhält sich dann wie

Johannes

ein Dictionary, ja, für diese drei Keys.

Dominik

Aber Dict kann ich ja nicht mit Dot machen,

Dominik

muss ja mit den Key-Ketten. Genau, genau, also das ist

Johannes

wie eine Klasse, wie eine Instanz von einer Klasse.

Johannes

Also das ist so ein

Johannes

Ding, das mache ich häufig, ja, dass ich einfach eine Klasse

Johannes

mache, die heißt Data-Holder

Johannes

und die hat keine Attribute, weil dann kann ich

Johannes

nämlich mit Punkt irgendwas. Wenn wir jetzt gerade schon bei

Dominik

Named Tuples noch sind, da gibt es übrigens auch noch eine kleine Neuerung,

Dominik

weil früher gab es ja immer vom Collections Named Tuple,

Dominik

man musste Named Tuple off machen und jetzt gibt es aber auch

Dominik

Typing Named Tuple und Typing Named Tuple ist

Dominik

ein bisschen eleganter, weil dann kannst du einfach das wie eine Klasse

Dominik

schreiben und dann darunter

Jochen

die Attribute. Ich würde Name-Tupel gar nicht

Jochen

so prominent, weil

Jochen

auch das ist, glaube ich, nicht mehr

Jochen

so wirklich empfohlen und nicht mehr

Jochen

so richtig aktuell. Das gibt es halt noch.

Jochen

Aber eigentlich,

Jochen

was man... Dann erklär doch mal Slots.

Jochen

Wie auch immer. Wenn man Name-Tupel

Jochen

verstanden hat, dann ist Slots leicht zu erklären, weil

Johannes

Slots ist nämlich eine andere Syntax

Johannes

für die gleiche Funktionalität.

Johannes

Ja, du sagst,

Johannes

welche Attribute eine Klasse

Johannes

haben darf und dann hat es nur genau diese

Dominik

Attribute. Das heißt, okay, also in Slots ist eine

Dominik

Dann-Dann-Methode, die in einer Klasse drinstehen kann.

Jochen

Nicht eine Methode, nein, nein, das ist ein Attribut.

Dominik

Das ist ein Attribut, ah, okay, das ist ein Attribut.

Dominik

Dann gibt es eine Liste von Namen rein. Und das ist eine Liste

Dominik

ist und in der Liste stehen quasi

Dominik

die Strings drin von den

Dominik

Namen, die als Attribut

Dominik

einer Klasse, die als Methode oder Attribut

Dominik

erlaubt sind. In unserem Beispiel von eben wäre dann die

Johannes

Klasse, die Klasse hieße Fuba

Johannes

und die hätte ein Attribut, das hieße Dann-Dann-Slots

Johannes

und da steht drin A, B und C

Dominik

als Strings. Stehen da auch

Dominik

Methodennamen drin oder nur

Dominik

Attributnamen? Ne, nur die Attributnamen.

Dominik

Und wenn ich da Methodennamen reinschreibe,

Dominik

dann kann ich da eine Methode für definieren, die trotzdem funktioniert?

Dominik

Kannst du machen, klar.

Jochen

Wenn du willst. Da müsste man ja ausprobieren, was da passiert kann.

Jochen

Das kann komische Sachen passieren.

Johannes

Ne, das kannst du generell machen. Du kannst generell

Johannes

an jede Klasseninstanz eine Methode

Johannes

dran machen, die muss halt den Parameter

Johannes

self haben als erstes

Johannes

und dann funktioniert das wie eine Methode, weil

Johannes

Methoden an Klassen sind nichts anderes als

Johannes

Funktionen, die den Parameter

Dominik

selbst haben. Aber was ist denn, wenn das nicht in den Slots

Jochen

drinsteht? Ja, wenn es nicht in den

Johannes

Slots drinsteht, kannst du nicht drauf zugreifen. Genau,

Dominik

das heißt, die Methode kann ich nicht aufrufen, weil es nicht in den Slots

Dominik

drinsteht. Das heißt, auch die Slots sind für Methoden

Dominik

dann exklusiv. Du kannst die Methode in die

Johannes

Klassendefinition reinschreiben und

Johannes

die kommt dann zusätzlich zu den Slots dazu.

Jochen

Du kannst sie halt nicht dynamisch

Johannes

hinzufügen. Du kannst sie nicht dynamisch hinzufügen.

Dominik

Slots wird zusammengebaut aus dem, was in dem

Dominik

Attribut Slots drinsteht und in den Namen, die

Jochen

die Methode entdeckt. Da wäre ich mir nicht so sicher.

Jochen

Probier es mal aus, Jochen.

Jochen

Das ist meiner Meinung nach so.

Jochen

Jetzt müssen wir gerade ein bisschen tippen.

Jochen

Okay, ich habe es jetzt gerade gleich.

Jochen

Okay.

Jochen

Ich habe es gleich.

Jochen

Also foo.astf.

Jochen

Das funktioniert schon mal.

Jochen

Also genau so.

Jochen

Und jetzt sagen wir foo.slots.

Jochen

Ich glaube nicht, dass das zusammengebaut wird.

Jochen

Ich glaube, dass Slots bleibt so, wie es ist.

Jochen

Aber das funktioniert.

Jochen

Methoden gehen, ohne dass es in Slots drin steht.

Jochen

Und es ist nicht in Slots drin.

Jochen

Du kannst über Methoden hinzuschauen.

Jochen

Genau.

Johannes

Weil die Methoden an dem Typ dranhängen

Johannes

und nicht in der Instanz.

Johannes

Okay.

Johannes

Das heißt, an einer Instanz, die ein Slots-Attribut hat,

Johannes

kannst du nichts verändern.

Johannes

Du hast nur genau diese Keys, die da drin sind.

Johannes

In dem darüber liegenden Typ hast du Methoden drin.

Johannes

Und da kannst du auch, kannst du alles Mögliche drin haben.

Johannes

Das ist deine normale Klasse.

Dominik

Okay, es geht also nur für die Instanz, die Slots.

Dominik

Genau.

Johannes

Die Slots sind für Instanzen von dieser Klasse.

Johannes

Und wenn diese Klasse aber selbst noch Methoden hat oder Attribute,

Johannes

Du kannst auch in diese Klasse ein Antiboot reinschreiben.

Johannes

Du kannst da x gleich 10 reinschreiben.

Johannes

Und das kannst du auch auslesen.

Johannes

Und du kannst es auch an der Klasse verändern.

Johannes

Aber nicht in den Instanzen.

Johannes

Weil in den Instanzen darfst du nur auf Slots zugreifen.

Johannes

Und das bedeutet,

Johannes

dass eine Klasse mit Slots

Johannes

im Wesentlichen wie ein Name-Tupel ist.

Johannes

Nur besser. Mit besserer Syntax.

Johannes

Und mehr Methoden.

Johannes

Und das ist auch der Grund, warum Name-Tupel nicht mehr so richtig...

Dominik

Jawohl, aber ich finde, dass das neue Name-Tupel

Dominik

von Apple Typing ist doch gar nicht so schlecht.

Jochen

Ne, also es hat auch noch andere Nachteile.

Jochen

Also es gibt ja jetzt

Jochen

auch denn etwas, was man vielleicht

Jochen

eher nehmen, also vielleicht meinst du das auch,

Jochen

es gibt ja Dataclasses, die sind ja auch jetzt in der

Jochen

Sprache drin, direkt.

Jochen

Und die sind auch in eigentlichen, also es gab es auch

Jochen

ich weiß nicht, Artikel zu,

Jochen

ich meine, ich habe es jetzt nur mal so gelesen, ich habe es nicht wirklich

Jochen

selber überprüft, aber so wo Leute sagen, also bitte

Jochen

nehmt doch alle Dataclasses und nicht mehr nehmt Tuppel,

Jochen

weil Dataclasses, es ist schneller, es ist besser,

Jochen

es ist in jeder Hinsicht besser, es gibt keinen Grund mehr

Jochen

das zu nehmen, das alte Zeug ist nur noch drin.

Jochen

Man kann es lesen.

Jochen

Okay, ja.

Jochen

Es kann mehr und

Johannes

es ist schneller. Also ich meine, es gibt

Johannes

keine großen Nachteile.

Johannes

Und

Jochen

es gibt das natürlich, also

Jochen

das Vorbild für Dataclass

Jochen

ist halt dieses Adress-

Jochen

Modul, das sehr beliebt ist. Das kann halt dann noch

Jochen

viel mehr. Und es ist auch

Jochen

relativ schnell, wenn ich das so richtig verstehe. Das ist auch sehr nett,

Jochen

ja. Und

Jochen

also das ist das, was vielleicht

Jochen

damit angefangen hat. Dann Dataclass ist eingebaut

Jochen

und jetzt gibt es halt auch noch sowas wie Pydentic,

Jochen

Das ist ja auch so ähnlich. Das ist noch schneller.

Jochen

Der Münster bei Dataclass.

Jochen

Das ist nicht schneller als Etos.

Jochen

Ich weiß nicht. Ne, Pidentic, meine ich auch, ist eine eigene Geschichte.

Jochen

Ja, Pidentic ist eigen, aber es ist nicht schneller.

Jochen

Doch, doch. Ne, es ist nicht.

Dominik

Ne. Es ist ein Einstehen sogar langsamer

Dominik

als Etos zum Beispiel. Okay.

Johannes

Jochen dachte, es wäre schneller. Ich dachte, es wäre Dataclass.

Johannes

Ja, gut.

Johannes

Ich habe irgendwo so ein Video,

Johannes

das muss ich eigentlich mal in den Show-Notes verlinken,

Dominik

wo jemand das ganz gut auseinandernimmt, wo der so

Dominik

Timings dafür macht. Also, das muss sich mal irgendjemand

Jochen

mal ganz genau angucken und dann Bescheid sagen,

Jochen

wie das denn wirklich ist.

Johannes

Ja, also in dieser Episode hier in den Podcast

Johannes

kommen und uns das allen erklären, wie es ist.

Johannes

Genau, das wäre gut.

Johannes

Ja, absolut.

Johannes

Genau, aber es ist auf jeden Fall ein Ding,

Johannes

was halt, und

Jochen

diese ganzen Dinge, wenn man

Jochen

die sich alle anguckt, also Name-Tupel

Jochen

ist halt das, was man am wenigsten nehmen sollte von den ganzen

Jochen

Sachen.

Dominik

Ich finde ja die moderne Sonntag, das sieht eigentlich ganz hübsch aus.

Dominik

Es ist halt so schnell.

Dominik

Wenn du es halt aufschreiben willst,

Dominik

vom Typing-Import Name-Tupel, dann machst du einfach

Dominik

auf, keine Ahnung, Named Tuple,

Dominik

Define Named Tuple von irgendwas und dann schreibst du halt

Dominik

die Attribute untereinander wie in der Klasse,

Dominik

definierst die und ist klar, welchen Datentyp haben die denn und so,

Dominik

das sieht schon so aus als... Okay, vielleicht muss ich mir

Jochen

das auch nochmal angucken, weil dass ich das

Jochen

vom Typing importiere, kenne ich jetzt noch gar nicht.

Dominik

Ja, aber das ist auf jeden Fall, glaube ich, ich weiß auch gar nicht,

Dominik

ob sich eine Implementierung da was geändert hat, aber

Dominik

ich glaube, so werden wir das eigentlich haben, oder?

Dominik

Also das musst du jetzt mal kurz aufmachen, um dir das mal

Dominik

anzuschauen. Okay, dann muss ich

Dominik

da mal eingehen. Also ich würde tatsächlich

Johannes

eher Dataclasses verwenden für diesen Newscase,

Johannes

Aber ich habe ja immer seltsame Ansichten.

Johannes

Ja, das nächste Neues war anders.

Johannes

Ich habe mich dann abgefunden, dass ich nicht im Standard bin.

Johannes

Ach, so sieht das, nee, okay.

Johannes

Ach doch, so sieht das aus, ja, okay.

Jochen

Ja, Typing, Punkt, Named, Tuppel und dann sagt man hier irgendwie quasi.

Dominik

Ja, aber das ist sogar noch, Moment, das muss ich mal so sehen.

Dominik

Ja, da unten, also das nächste Beispiel ist sogar noch hübscher.

Dominik

Ihr wisst, dass die Zuhörer den Monitor nicht sehen können.

Dominik

Genau, das ist das Problem bei Podcasts.

Jochen

Und das Problem ist auch, ich kann das jetzt nicht vorlesen,

Jochen

Das kann ich schon, hilft nur nicht.

Dominik

Ja, genau, aber ich finde so die Sündheit,

Dominik

das sieht doch gar nicht so schlecht aus.

Dominik

Ja, okay, also gut.

Dominik

Das ist halt klasse.

Jochen

Muss ich das mal jemandem angucken und dann zu Bescheid sagen.

Jochen

Also es ist auch eine Möglichkeit, die man machen kann.

Jochen

Ja, ja, ja.

Jochen

Ja, ja, sehr nett.

Johannes

Okay, aber das ist ja nur syntaktischer Zucker, oder?

Johannes

Wenn ich das jetzt richtig verstehe.

Johannes

Ja, syntaktisch Zucker.

Johannes

Ja.

Johannes

Sehr gut.

Johannes

Also dann ist es quasi ein Name-Tool.

Johannes

Okay, schön, das ist auch okay.

Johannes

Es gibt noch zwei Dinge, die ich

Johannes

vorhin gelernt habe. Das erste ist Counter.

Johannes

Wir haben es schon kurz angesprochen.

Johannes

Counter ist auch eine Dictionary-Subklasse

Johannes

und die

Johannes

macht im Wesentlichen das, was sie sagt.

Johannes

Ich gebe eine Sequenz rein

Johannes

und die zählt, wie oft jedes Element drin vorkommt.

Johannes

Das heißt, wenn ich einen String

Johannes

reingebe, dann habe ich hinterher ein Dictionary und in dem

Johannes

Dictionary steht drin,

Johannes

wie oft jeder Buchstabe in diesem String

Johannes

vorkommt.

Johannes

Und das ist großartig, weil das

Johannes

baut man sich so oft selbst

Johannes

und das baut man sich so oft

Johannes

von Hand und macht

Johannes

ein Default-Dict oder macht ein Get und

Johannes

inkrementiert die Zahl dann und so weiter.

Johannes

Einfach ein Counter und die Sequenz

Johannes

reintun und fertig. Und man kriegt ein Dictionary

Johannes

raus mit der Anzahl.

Johannes

Super, ist großartig. Und das hat auch diese ganzen

Johannes

Funktionen, die man dazu braucht. Also wenn man das

Johannes

dann updaten möchte oder wenn man das

Johannes

wenn man

Johannes

einen Generator hat oder wenn man

Johannes

irgendwas anderes in der Hand hat und das nicht

Johannes

genau vorher weiß oder wenn man zwischendurch noch was machen möchte,

Johannes

Das ist großartig.

Johannes

Ein Counter zusammen mit einer Comprehension, super.

Johannes

Ja, ja.

Johannes

Das deckt so viele von diesen Fällen ab,

Johannes

für die man sonst Default-Dict verwendet.

Johannes

Ja.

Johannes

Ich habe noch was anderes Schönes gefunden

Johannes

und zwar heißt es Chain-Map.

Johannes

Das ist auch im Collections-Modul drin.

Johannes

Was ist denn eine Chain-Map?

Johannes

Eine Chain-Map, das ist so ein ...

Johannes

Mich hat das so ein bisschen an JavaScript-Objects erinnert.

Johannes

Wenn du nach einem Key suchst,

Johannes

dann suchst du quasi durch die ganze Reihe durch.

Johannes

Das heißt, Chainmap nimmt eine Menge von Dictionaries

Johannes

und wenn du nach einem Key fragst,

Johannes

dann guckt er im ersten Dictionary, ist der da drin?

Johannes

Wenn er da drin ist, kriegst du den Wert.

Johannes

Wenn er nicht drin ist, guckt er im zweiten nach.

Johannes

Wenn er da drin ist, kriegst du den Wert.

Johannes

Wenn er nicht drin ist, guckt er im dritten nach und so weiter,

Johannes

bis er alle seine darunter liegenden Dictionaries durchgeschaut hat.

Johannes

Wenn er es nirgendwo findet, kriegst du immer noch einen Key Error.

Johannes

Wenn du aber einen Wert reinschreibst in diese Chain-Map,

Johannes

dann schreibt er das immer in das oberste Dictionary rein.

Johannes

Das heißt, du veränderst nur das erste Dictionary aus deiner Kette,

Johannes

hast aber lesenden Zugriff auf die darunterliegenden.

Johannes

Und das ist so ein bisschen so, wie Objekte in JavaScript funktionieren,

Johannes

wie Object in JavaScript funktioniert.

Johannes

Wenn du liest, liest du immer aus dem Ersten, was verfügbar ist,

Johannes

aber wenn du schreibst, schreibst du immer ins Oberste rein.

Johannes

Ja, ja, ja.

Jochen

Ja, ich überlege gerade auch, also ich meine,

Jochen

das ist auch sowas, ja, ich weiß es nicht genau,

Jochen

aber es ist halt eine, ich mache jetzt auch

Jochen

so ein bisschen JavaScript gerade und

Jochen

was ich da, was dann

Jochen

doch ein bisschen einfacher hinzuschreiben ist als

Jochen

in Python ist halt dieses

Jochen

Dreipunkt

Jochen

Spread Operator Syntax, wo man dann halt

Jochen

sich neue Sachen generiert, indem man halt ein altes Ding nimmt

Jochen

und dann sagt man Punkt, Punkt, Punkt, altes Ding

Jochen

und dann schreibt man noch ein neues Ding

Jochen

dazu oder so und mit Chain Map hat man

Jochen

ja da quasi was ganz

Jochen

ähnliches. Genau, das ist eben

Jochen

wie gesagt diese Prototyp-Sache.

Jochen

JavaScript ist die halt der Kern

Jochen

von JavaScript.

Jochen

Jedes

Johannes

Object oder jedes Dictionary in JavaScript

Johannes

hat einen Prototypen, auf den

Johannes

du zurückfallen kannst.

Johannes

Und das kannst du hier mit Chainmap nachbauen.

Johannes

Ja,

Johannes

nett. Fand ich sehr schön,

Johannes

dass es gibt. Habe ich noch nie gebraucht.

Johannes

Wüsste jetzt auch nicht, an welcher Stelle

Johannes

ich das einsetzen würde, aber

Johannes

gibt es

Johannes

auf jeden Fall und ich glaube, wenn man

Johannes

das braucht, ist das eine sehr, sehr nützliche Sache.

Johannes

Ja.

Johannes

Weil man so Hierarchien

Johannes

damit bauen kann.

Johannes

Ja.

Dominik

Vielleicht nochmal einmal ganz kurz, weil ich

Dominik

gerade nachgeguckt hatte zu diesem

Dominik

WhichPythonDataClassIsBest, habe ich

Dominik

ein Artikel, also ein Video gefunden von

Dominik

einem Kanal, der mCoding heißt

Dominik

und da vergleicht jemand tatsächlich

Dominik

Dataclasses, NameTupil,

Dominik

TupilEthers und Pydentic

Dominik

nach Geschwindigkeit und Memory

Dominik

und so. Und da schneidet Pidentic

Dominik

vor allem beim Erstellen von den Objekten relativ

Dominik

schlecht ab. Okay, gut, ja.

Dominik

Das irgendwie

Dominik

15 Mal so lange dauert oder so.

Dominik

Aber sonst vielleicht schnell.

Dominik

Ja, gut.

Johannes

Im Laufe seines Programmiererlebens

Johannes

hat man sich davon weg entfernt, auf Geschwindigkeit

Johannes

zu achten. Notiz hätte er wieder

Dominik

angemacht. Ja, genau, Geschwindigkeit, ja.

Dominik

Da ist die Frage, braucht man das überhaupt, will man das?

Dominik

Genau. Egal, haben wir nicht genug Hauptspeicher

Dominik

und sind solche, also das war

Dominik

nie genügend Geschwindigkeit und nie genügend.

Dominik

Ja, wir hatten letztens

Dominik

jemand,

Jochen

den kennt ihr

Jochen

bestimmt auch, der

Jochen

Pavel Mayer aus

Jochen

Chaos Radio

Jochen

oder

Johannes

aus dem Chaosumfeld, ne, die kenne ich ja nicht.

Jochen

Ah, okay, der, naja, gut.

Jochen

Der hatte das mal

Jochen

irgendwie so beschrieben, dass ein Computer

Jochen

eigentlich für ihn nur eine relevante Eigenschaft,

Jochen

also eine

Jochen

ein Attribut hat, das

Jochen

wichtig ist. Oder es gibt

Jochen

drei ganz wichtige. Und zwar, das ist halt

Jochen

erstens Performance. Das zweite ist halt

Jochen

Performance. Und das dritte ist, was auch

Jochen

noch sehr wichtig ist, Performance.

Jochen

Sind ja nur drei Dinge.

Jochen

Ja, da ist auch

Jochen

schon was dran. Aber tatsächlich

Jochen

sowas wie Lesbarkeit ist auch nicht

Dominik

so schlecht. Ist das der Prof. Mayer, der dieses

Dominik

mega langsame Covid-Dashboard geschrieben hat?

Dominik

Ja, genau.

Dominik

Just saying.

Dominik

Es gibt so Leute, also ich meine

Dominik

es gibt auch Felder

Dominik

in denen das wichtig ist, ja

Dominik

die Geschwindigkeit und Geschwindigkeit ist immer irgendwie

Dominik

so ein Faktor, der wichtig

Dominik

ist, aber man kann

Johannes

da so tief reingehen, wie man

Johannes

möchte und es gibt immer noch jemanden, der das schneller macht

Johannes

Ich sehe mir

Johannes

sehr gerne die Videos von Casey Muratori an

Johannes

und der kommt halt aus der Spieleentwicklung

Johannes

und der sagt

Johannes

man kann in C alles machen, also solltest

Johannes

du in C auch alles machen, aber wenn es schnell

Johannes

sein muss, dann musst du halt schon auf die Intrinsics

Johannes

gehen und den Prozessor kennen, den

Johannes

du da gerade benutzt und dann

Johannes

den Befehlssatz

Johannes

kennen, weil dann kannst du nämlich alles

Johannes

256 Mal so schnell machen wie vorher

Johannes

und

Johannes

ja, das ist

Johannes

prinzipiell korrekt, aber

Dominik

Vielleicht ist Assembly-Coden

Dominik

auch zu langsam, also wenn man es gut kann, ich weiß nicht.

Dominik

Noch ganz kurz.

Dominik

Ich kann das sicherlich gut genug, aber

Jochen

noch kurz zu

Jochen

genau, da gibt es auch gerade auf Netflix

Jochen

so eine Miniserie oder so

Jochen

The Billion Dollar Code, die ist quasi

Jochen

mehr so, die orientiert sich

Jochen

an der, an dem oder deren

Jochen

Biografien da in, ja.

Dominik

Und die scheint wohl ganz gut.

Dominik

Wir machen schon wieder Werbung,

Dominik

Jochen, das ist aber eine werbungsvolle Folge.

Jochen

Ja, diesmal ist ja noch gar nicht so,

Jochen

also, ja, gut, wir machen Werbung,

Jochen

Werbung machen wir immer, aber wir werden

Jochen

nicht dafür bezahlt, dass

Jochen

Netflix, falls ihr zuhört,

Johannes

der Jochen wäre durchaus offen dafür, bezahlt

Johannes

zu werden. Du weißt, Johannes Verkunde

Dominik

ist ja nicht mit anderen Werbepartnern direkt parallel.

Dominik

Also Netflix-Werbung würde ich

Dominik

vielleicht auch nicht.

Dominik

Wir hatten ja letztes Mal, also wenn wir jetzt schon das Thema Werbung haben,

Dominik

wo der jetzt gerade Werbung für so eine Werbung macht.

Jochen

Ich mach mal eine Chapter Mark hier.

Dominik

Ja, wir haben ja überlegt, ob wir Werbung

Dominik

mal schalten sollen und ein bisschen uns drüber lustig gemacht und

Dominik

wir haben ein bisschen Feedback bekommen. Du wolltest sagen, ja, mach doch

Dominik

einfach. Ja, dann haben wir jetzt auch gedacht,

Dominik

ja, okay. Na gut, dann machen wir halt.

Dominik

So ein bisschen kostendeckend

Dominik

arbeiten oder so. Gibt es Leute, die euch

Dominik

bezahlen, das ist ja verrückt.

Dominik

Noch nicht.

Dominik

Berührt und schockiert.

Dominik

Du wirst nicht bezahlt, Johannes.

Dominik

Achso, ja gut dann.

Dominik

Dann ist mir egal.

Jochen

Nicht so direkt, aber ich meine, das wäre natürlich so eine Sache,

Jochen

die man machen könnte. Man könnte halt also einmal

Jochen

Hostingkosten und so die anfallen, ein bisschen damit

Jochen

vielleicht bezahlen.

Jochen

Aber was man auch machen könnte, wir könnten

Jochen

dem Johannes ordentliches

Jochen

Audioequipment schicken zum Beispiel.

Jochen

Ja, da müssen wir nochmal drüber nachdenken.

Johannes

Dann ist das jetzt hier mit der Spendenaufruf,

Johannes

wenn die Zuhörer gerne möchten, dass

Johannes

ihr mich besser hören könnt, dann

Johannes

finden sie jetzt eine folgende Bitcoin-Adresse.

Johannes

Wir schalten ab jetzt einfach Werbung.

Johannes

Ja.

Johannes

Aber wenn ihr dann Werbung

Johannes

schalten würdet und dann auch

Johannes

Geld einnehmen würdet, dann könntet ihr

Johannes

euch ja auch richtige Gäste leisten und

Johannes

dann würde ich ja einfach gar

Johannes

nicht mehr, ich wäre dann einfach gar nicht mehr hier,

Johannes

sondern ihr würdet euch richtige, kompetente Gäste

Jochen

brauchen. Vielleicht könnte man sich dann auch

Jochen

andere Hosts leisten, die das so

Jochen

etwas professioneller machen und sowieso

Jochen

eine andere Webseite, die auch nicht so kacke aussieht

Jochen

und dann könnten wir endlich, was könnten wir

Jochen

denn dann eigentlich machen? Ich wollte mir ein Schloss kaufen.

Jochen

Dann könnten wir uns an den Strand setzen und mal

Johannes

eure Hobbys verfolgen, vielleicht, keine Ahnung,

Johannes

vielleicht machen wir einen Podcast auf.

Johannes

Ja.

Johannes

Naja.

Dominik

Ich hab schon gesagt, ich warte immer noch auf mein Schloss.

Dominik

Ja.

Dominik

Auch, möchtest du auch?

Johannes

noch einen Spendenaufruf starten. Also mein Spendenaufruf

Johannes

war für ein gescheites Mikrofon, Dominik's

Johannes

Spendenaufruf ist für ein Schloss.

Dominik

Ja, für mein, nicht für ein Schloss, für mein

Dominik

Schloss. Ja, ja, für sein Schloss. Ja, okay.

Dominik

In dieser ganzen,

Johannes

in diesen ganzen anderthalb Stunden, wo wir jetzt schon

Johannes

zusammensitzen, haben wir

Johannes

jetzt tatsächlich noch gar nicht drüber gesprochen, was

Johannes

eine Hashmap überhaupt ist. Du hast die Stunde vorher vergessen,

Dominik

wenn wir gebraucht haben, unser Audioequipment vorzubereiten,

Dominik

obwohl wir alle voll drauf sind. Ja, das ist halt am einen schlechten Mikrofon,

Dominik

aber

Dominik

trotzdem sind wir noch nicht so weit gekommen, zu

Johannes

erklären, was überhaupt eine Hashmap ist und wie sie

Johannes

funktioniert. Ja, okay. Das stimmt.

Johannes

Also das ist irgendwas, wo man

Dominik

ganz schnell nachgucken kann, weil man direkt weiß, wo es ist.

Dominik

Also man kann quasi dem Key ansehen,

Dominik

wo er sein muss.

Dominik

Oder so. Dem Key nicht,

Johannes

aber man kann aus dem Key was rauskitzeln.

Johannes

Okay, aber aus diesem Rauskitzeln

Dominik

weiß man direkt, wo es sein muss, weil

Dominik

das irgendwie...

Dominik

Ja, der Trick

Johannes

ist im Wesentlichen

Johannes

schon im Namen. Also man nimmt

Johannes

nicht die Keys selber, sondern man nimmt Hashes von Keys.

Johannes

Deswegen muss es auch Hatchable sein.

Johannes

Genau deshalb muss es hashable sein. Und weil eine Eigenschaft eine Hash-Funktion sein soll, dass sie nicht vorhersehbar ist, bedeutet das auch, dass sie gleich verteilt ist über den Raum der möglichen Hash-Ausgänge.

Johannes

Das bedeutet, wenn ich aus einem Wert einen Hash mache, dann kriege ich im Wesentlichen einen zufälligen Wert in der Menge aller möglichen Hashes raus.

Johannes

Und wenn ich diesen Hash jetzt

Johannes

mit Modulo nehme, ja, und quasi

Johannes

als Index in eine Liste reinnehme,

Johannes

dann bedeutet

Johannes

es, dass der irgendwo hinzeigt.

Johannes

An einen Index, der

Johannes

nicht vorhersehbar ist und

Johannes

der auch gleich verteilt ist über die gesamte

Johannes

Reichweite der Liste. Aber ich muss

Dominik

da reingehen, quasi die Länge der Liste. Das heißt, ich weiß,

Dominik

wie groß das maximale Reich ist. Genau, ich muss wissen, wie groß

Johannes

die Liste ist. Beziehungsweise Python

Johannes

macht da viele coole Tricks,

Johannes

die

Johannes

dir helfen. Magie, Magie.

Johannes

Aber das ist bei einer Hashmap

Johannes

immer so, die hat so einen Füllungsgrad,

Johannes

wir haben es vorhin schon angesprochen, bei Python ist es

Johannes

2 Drittel, die ist maximal 2 Drittel voll.

Johannes

Also Wurzel 3, hast du gesagt.

Johannes

Wurzel 3 wäre noch besser, aber

Johannes

das ist halt leider kein Integer.

Johannes

Ist das der goldene Schnitt? Nein.

Johannes

Ne, der goldene Schnitt

Johannes

ist 1,618 noch was.

Johannes

Was ist Wurzel 3?

Johannes

Der heißt auch Phi.

Johannes

Wurzel 3 ist

Johannes

1,7 irgendwas.

Johannes

Verdammt, knapp daneben.

Dominik

Vielleicht noch besser.

Dominik

Ist übrigens auch interessant,

Dominik

weil ternäre Logik wäre besser,

Dominik

weil das näher an irgendeiner Zahl dran ist.

Dominik

Ach, keine Ahnung, spielt keine Rolle jetzt.

Dominik

Das Wichtige ist,

Johannes

wenn ich aus einem Diktionario rauslesen möchte,

Johannes

dann nehme ich den Key, den ich lesen möchte

Johannes

und hashe den

Johannes

und nehme dann diesen Hash als Index in eine Liste rein.

Johannes

Und wenn in dieser Liste an der Stelle was steht,

Johannes

was nicht None ist,

Johannes

dann ist das der Wert,

Johannes

der zu diesem Key gespeichert wurde.

Johannes

Und umgekehrt, wenn ich in eine Hashmap etwas reinschreiben möchte,

Johannes

dann mache ich den Hash aus diesem Key

Johannes

und schreibe den Wert in diese Liste

Johannes

an der Stelle des Hashindex rein.

Johannes

Und das ist sozusagen der Trick.

Johannes

Ich berechne einen, ich nenne es mal,

Johannes

zufälligen Index in diese Liste

Johannes

weil der gleich

Johannes

verteilt ist, weil diese Hash-Funktion gleich verteilt

Johannes

ist, füllt die diese Liste

Johannes

gleichmäßig auf und

Johannes

kann

Johannes

dann

Johannes

eben in O von 1, weil diese Berechnung

Johannes

dieses Hashes immer gleich lange dauert,

Johannes

diesen zufälligen Index finden und dann

Johannes

da reinschreiben. Jetzt gibt es ein Problem.

Johannes

Was ist, wenn zwei Hashes zu dem

Johannes

auf den gleichen, also wenn zwei Keys auf den

Johannes

gleichen Hash-Index zeigen?

Johannes

Und das passiert, wenn wir

Johannes

Wenn wir ein Dictionary haben, was acht Einträge hat,

Johannes

dann ist die Wahrscheinlichkeit, dass zwei auf den gleichen Index zeigen,

Johannes

vergleichsweise hoch.

Johannes

Eins zu acht.

Johannes

Das heißt, man muss sich eine Technik überlegen,

Johannes

um sogenannte Kollisionen zu vermeiden.

Johannes

Und da gibt es zwei Möglichkeiten.

Johannes

Entweder kann ich sagen, jeder Eintrag in meinem Dictionary ist eine Liste.

Johannes

Das heißt, wenn zwei auf die gleiche Sache herrschen,

Johannes

dann muss ich halt durch diese Liste durchgucken

Johannes

und da den entsprechenden Wert rausholen.

Johannes

Das heißt Chaining. Oder man kann einen neuen Hash berechnen und sagen, wenn da eine Kollision ist, dann verändere ich meine Hash-Berechnung und wähle sozusagen einen neuen zufälligen Hash. Und die Wahrscheinlichkeit, dass da eine Kollision auftritt, wird eben jedes Mal kleiner. Und das heißt Open Addressing.

Johannes

Und Python Dictionaries machen tatsächlich Open Addressing, das heißt, die haben keine Liste an jeder Stelle gespeichert, sondern die sagen halt, wenn da eine Kollision ist, wenn das nicht der richtige Key ist, den ich da gefunden habe, dann muss ich diesen Prozess fortsetzen.

Johannes

Muss einfach sozusagen nochmal einen Hash berechnen.

Johannes

Ein Hash vom Hash.

Johannes

Ja, da wird dann so ein Counter mitlaufen gelassen, damit man eben wieder diese Eigenschaft hat, aber sozusagen diese Bits wiederverwenden kann.

Johannes

Dass du nicht in zwei Richtungen wächst,

Johannes

sondern dass deine Hashmap einfach nur in eine Richtung wächst.

Johannes

Das sind Implementierungsdetails.

Johannes

Aber das ist im Wesentlichen die Magie,

Johannes

dass man aus dem Key einen Hash berechnet

Johannes

und dieser Hash hat eine gewisse Eigenschaft

Johannes

und die heißt gleich verteilt.

Johannes

Und auch wenn ich die auf einen Index zusammendampfe,

Johannes

dann sind sie immer noch gleich verteilt

Johannes

und das ist der Trick da dran.

Johannes

Bedeutet halt, dass der Key hashable sein muss.

Johannes

Es gibt eine ähnliche Datenstruktur, die heißt TreeMap.

Johannes

Da werden die Keys in einen Tree abgelegt.

Johannes

Dann müssen sie nicht hashable sein,

Johannes

dann müssen sie sortierbar sein.

Johannes

Und dann habe ich halt einen Tree.

Johannes

Dann habe ich Zugriffe, die alle log-in sind.

Johannes

Genau.

Johannes

Ich weiß nicht, ob es immer noch so ist,

Jochen

die Hash-Map-Default-Implementation

Jochen

der Standard-C++-Bibliothek von Boost

Jochen

war irgendwie so ein Tree-Map.

Jochen

Eine Tree-Map, ja.

Jochen

Und hat dann irgendwie,

Jochen

als wenn man was optimieren wollte,

Jochen

dann ein C++ geschrieben habe und dann war das

Jochen

überraschend von der Performance her, weil das war dann hinterher

Jochen

langsamer als die Ticks und Beiden.

Jochen

Großartig.

Jochen

In Java gibt es diese

Johannes

beiden Optionen unter diesen Namen. Es gibt

Johannes

HashMap und es gibt DreamMap. Das heißt, bei Java

Johannes

muss man sich immer raussuchen, was man haben möchte.

Johannes

Die Antwort ist immer HashMap,

Johannes

aber egal.

Johannes

Und natürlich bei einer HashMap

Johannes

heißt das, dass man immer Hash-Funktionen

Johannes

haben muss. Und Hash-Funktionen sind auch

Johannes

so eine Sache. Die müssen

Johannes

schnell sein und trotzdem gut und ich möchte

Johannes

gerne viele verschiedene haben und

Johannes

die sollen alle schnell sein und alle

Johannes

möglichst gut. Und da die

Johannes

richtige Hash-Funktion rauszufinden

Johannes

und eine gute Implementation davon zu haben, ist nicht ganz

Johannes

einfach.

Johannes

Welche wird verwendet?

Johannes

Das weiß ich nicht.

Johannes

Na, ich stelle

Johannes

dir Fragen, das weiß ich nicht.

Johannes

Ja, es gibt ja so Hash-Funktionen, die kennt man ja.

Johannes

Es gibt MD5 und SHA-1

Johannes

und SHA-256 und

Johannes

CRC32 und die sind

Johannes

aber alle nicht geeignet dafür

Johannes

und dann gibt es so welche, die kennt man

Johannes

überhaupt nicht und die haben

Johannes

auch abgefahrene lustige Namen,

Johannes

von denen ich jetzt keinen einzigen sagen kann, weil ich

Johannes

kenne sie ja nicht, die aber eben

Johannes

keine kryptografischen Hashes sind, sondern

Johannes

eben solche Hash-Funktionen, die man für solche

Johannes

Satenstrukturen verwendet,

Johannes

die dann halt aber andere Eigenschaften haben.

Johannes

Die brauchen dann nur acht Cycles und

Johannes

geben nur zwei Byte als Hash zurück

Johannes

oder irgendwie solchen Quatsch,

Johannes

weil das hier viel, viel wichtiger ist.

Jochen

Ja, also ich kenne die Hash-Funktion für kleine Integers

Jochen

und die ist sehr einfach.

Jochen

Die ist das Integer selber.

Jochen

Also der Hash von 1 ist 1, der Hash von 2 ist 2.

Jochen

Aber das wird dann, wenn die Zahlen größer werden,

Jochen

ist das dann nicht mehr so toll.

Johannes

Aber das ist der Hash von 128, Jochen.

Johannes

Das glaube ich auch immer noch, 128.

Johannes

Ah, ich glaube, es geht nur bis 127.

Johannes

Ja, ich weiß.

Johannes

Ich glaube, Small Integer in Python geht nur bis 127.

Jochen

Moment, Moment, ich habe doch hier die Rappel schon aufgemacht,

Jochen

da kann ich auch gleich nochmal

Jochen

128.

Jochen

Ich habe ja kürzlich

Jochen

immer noch 128, aber wenn ich

Jochen

512, verdoppeln

Jochen

war eine gute Strategie, habt ihr eben gesagt.

Jochen

512 ist auch immer noch, 512

Jochen

bei 1024 auch immer noch, oh mein Gott.

Jochen

65. Vielleicht ist es bei Integers

Jochen

einfach immer so.

Jochen

Nein, nein, wenn die wirklich groß werden,

Jochen

dann ist es nicht mehr so. Okay, sie müssen

Jochen

wirklich groß werden. Ich bin gerade schon bei einer Million,

Jochen

bei der Milliarde. Dann sind es vermutlich 32

Johannes

Bit, wenn die über 32 Bit sind.

Dominik

Unsigned and, man weiß es nicht,

Dominik

mal ein Minus.

Johannes

Es gibt ja ein sehr schönes Paper, das heißt

Johannes

People mistake knowledge

Johannes

on the internet for their own knowledge.

Johannes

Du hast eine gefunden. Also ich habe eine gefunden,

Jochen

aber da musste ich jetzt schon irgendwie 20, 30 Nullen

Jochen

hintendran machen. Ich weiß gar nicht mehr, wie das heißt.

Jochen

Das sind die,

Jochen

die früher L hießen. Das war super.

Jochen

Erstmal mal verdoppeln, also

Dominik

12.420, dann 10.000, 100.000,

Dominik

1.000.000, 10.000.000, 100.000.000

Dominik

und dann auf einmal so. Ich weiß nicht, wie die Zahl

Jochen

heißt, die jetzt da rausgefallen ist, aber ich weiß

Jochen

jetzt doch, bis wo denn das

Jochen

wohl ist, das ist wohl tatsächlich bis zur Grenze, bis zur

Jochen

64-Bit-Grenze, weil das, was hier rausgefallen

Jochen

ist, ist irgendwie maximal 64-Bit.

Dominik

Aber wo es halt die Implementation-Details

Dominik

sind, das ist eigentlich signed oder unsigned in Python

Dominik

und was ist das in 64 oder in 32?

Jochen

Das ist signed, meine ich.

Jochen

In Python

Johannes

die Integer sind Long-Integer.

Johannes

Also 64, also

Johannes

es gab früher eine Unterscheidung zwischen Long-Integer

Johannes

und Integer, die gibt es halt Python 3 nicht mehr.

Johannes

Ist jeder Integer eine Ganzzahl

Johannes

und die verhalten sich auch korrekt wie mathematische

Johannes

Ganzzahlen. Du kannst beliebig viele Stellen machen.

Johannes

Die Implementation dahinter

Johannes

schaltet um zwischen Integers

Johannes

und Long-Integers. Aber das ist ja nur

Johannes

ein Implementationsdetail. Das ist nur

Johannes

ein Umsetzungsdetail.

Jochen

Hash von minus 1 ist minus...

Jochen

Hash von minus 1

Jochen

ist minus 2. Ja, schön.

Jochen

Interessant. Okay.

Jochen

Wieder was gelernt. Gut. Die exakte

Jochen

Funktion spielt gar keine Rolle.

Johannes

Wenn du Hash von irgendeinem String machst, kriegst du halt auch

Johannes

irgendeine Zahl raus.

Johannes

Das Wichtige ist eher, dass das

Johannes

schnell sein muss und dass es

Johannes

deterministisch ist und so weiter und diese ganzen

Johannes

Eigenschaften, die man so stellt an

Johannes

Funktionen und halt,

Johannes

dass es gleich verteilt ist über die Menge

Johannes

der Hashes. Und ich glaube, die Menge der Hashes,

Johannes

wenn du die Zahlen vor dir hast, Jochen, die sehen aus wie 32

Johannes

Bits-Zahlen, oder?

Johannes

Ja.

Johannes

Minus 2?

Johannes

Minus 4.

Johannes

Nein, keine Ahnung.

Dominik

Oh, hash minus 1 ist gleich hash minus 2.

Dominik

Da hast du direkt eine Kollision.

Dominik

Dann musst du Open Addressing machen.

Dominik

Ja, okay.

Dominik

Ja, witzig, witzig.

Dominik

Das heißt, kann man Dicts,

Dominik

Keys, wenn das Int sein können,

Dominik

können das auch negative Int sein?

Dominik

Ja, na klar.

Dominik

Alles, was Hash-Build ist.

Dominik

Das heißt, wenn du minus 1 reinschreibst,

Dominik

dann muss er tatsächlich eine Kollision machen

Dominik

und minus 2, dann muss er quasi eine Ebene tiefer gehen.

Dominik

Ja, okay.

Dominik

Du kannst auch deine eigenen Objekte

Jochen

ersparen werden. Ja, genau. Das ist auch etwas, was ich gerne

Jochen

mache, tatsächlich.

Jochen

Und was Leute mal so überrascht,

Jochen

wenn man dann Objekte als Keys hat, dann

Jochen

sagen die immer so,

Jochen

aber nein, das geht.

Jochen

Das ist okay. Du solltest dann eigentlich

Jochen

auch immer noch Frozen-Versionen machen.

Dominik

Musst du dann eine Methode an deine Klasse dran machen, die

Dominik

hashable ist? Ja, das muss natürlich hashable

Dominik

sein. Wie wird das hashable?

Dominik

Was versucht der beim Hash denn zu machen?

Jochen

Implementierst einfach Dunder-Hash.

Jochen

Dann wird die aufgerufen und dann

Jochen

kannst du, wenn du eine ID schon hast,

Jochen

dann kannst du die natürlich auch zurückgeben.

Jochen

Oder du kannst halt, ja,

Jochen

wie auch immer du das...

Dominik

Also du gibst etwas zu...

Dominik

Jedes Objekt ist doch herrschbar, oder?

Dominik

Die Objektidentität als Herrschfunktion.

Dominik

Ja, das kann natürlich sein,

Dominik

dass das der Default ist.

Dominik

Ja.

Johannes

Hm, wie könnte man das jetzt schnell rausfinden?

Johannes

Ha.

Johannes

Hey, dann mal auf.

Johannes

Dann dein Hash.

Dominik

Help, dann dein Hash, wie wäre das denn?

Dominik

Genau, aber du kannst natürlich

Dominik

deine eigene Hash

Jochen

Scheint so zu sein, ja.

Jochen

Help, dann dein Hash?

Johannes

Du kannst natürlich deine eigene Funktion

Johannes

da reinschreiben, das heißt, du kannst

Johannes

eine Hash-Methode schreiben, die

Johannes

für deine Objekte spezifisch ist.

Johannes

Aber wenn du das machst,

Johannes

wenn man seine eigene Hash-Methode

Johannes

implementiert, dann muss man wirklich

Johannes

darauf achten, dass sich

Johannes

Keys in einem Dictionary nicht ändern dürfen.

Johannes

Das heißt, wenn ich einem Objekt

Johannes

eine Hash-Funktion gebe,

Johannes

eine Hash-Methode gebe,

Johannes

die sich zwischendurch verändern kann,

Johannes

dann geht mein Dictionary kaputt.

Johannes

Ja.

Johannes

Und das geht dann auch gleich richtig kaputt,

Johannes

weil dann finde ich gar nichts mehr in meinem Dictionary.

Johannes

Ja, ja, ja.

Jochen

Also da muss man dann natürlich aufpassen.

Jochen

Aber ich meine, oft hat man ja tatsächlich eine ID,

Jochen

die man nehmen kann.

Jochen

Und man gibt halt bei der Hash-Methode,

Jochen

man rechnet das nicht selber aus,

Jochen

aber man gibt halt etwas zurück, was dann

Jochen

durch Hash nochmal durchläuft.

Johannes

Man fällt zurück auf irgendwas, aber dass man

Johannes

halt sagt, okay, eine Adresse ist halt,

Johannes

der Hash einer Adresse ist der Hash aus der

Johannes

Straße und der Postleitzahl und der

Johannes

Stadt, das ist ja schon

Johannes

irgendwie naheliegend, dass du halt irgendeinen

Johannes

wegbildest, was du dann hashst.

Johannes

Und

Johannes

klar, das kann man natürlich

Johannes

machen. In meiner

Johannes

Erfahrung tritt es nicht so häufig auf, aber wenn

Johannes

du sagst doch, dass du das gerne machst, dann

Jochen

Vielleicht mach ich es auch falsch, ich weiß es nicht so genau.

Jochen

Also ja, gerade mit

Jochen

Zusammenhang mit Data Classes,

Jochen

beziehungsweise so Atris, da benutze ich...

Jochen

Data Classes sind ja automatisch hashable, oder?

Jochen

Ja, bei Data Classes weiß ich es gar nicht so genau.

Jochen

Also ich hab das jetzt, das, was ich jetzt im Kopf hab,

Jochen

ist mit Atris und da muss man dann auch,

Jochen

da kann man dann auch solche Sachen sagen, also einmal, man kann es natürlich

Jochen

selber implementieren, aber man kann auch sagen irgendwie,

Jochen

also ich hab, es soll hashable sein

Jochen

und diese Attribute will ich dafür

Jochen

verwenden und die müssen dann auch natürlich auch in der Uni sein

Jochen

und so, ja.

Jochen

Und dann macht es manchmal Sinn,

Jochen

weil dann kann man halt bestimmte Sachen

Jochen

look-uppen

Jochen

mit einem anderen bestimmten Ding und dann

Jochen

ist es manchmal ganz praktisch.

Johannes

Ja, das ist ja oft so, dass

Johannes

man seine

Johannes

Algorithmen beschleunigen kann, wenn man so ein

Johannes

look-up macht, wenn das

Johannes

in dem Algorithmus vorkommt.

Johannes

Wir hatten einmal so einen Fall

Johannes

im Computerclub, da war der

Johannes

Bison auch da und hat da eben seinen Algorithmus mit

Johannes

einer Liste geschrieben, wo er

Johannes

dann eben immer die Elemente aus der Liste raussuchen

Johannes

musste, wo er immer nachgucken musste, habe ich diesen

Johannes

Knoten schon besucht

Johannes

in der Liste und das war halt O von N

Johannes

und dann haben wir es umgebaut zu einem Set,

Johannes

was

Johannes

im O von 1 ist, wo diese Operation O von 1 ist

Johannes

und dann wird es halt deutlich schneller. Also wenn man das

Johannes

braucht, ist das

Johannes

schon ein Superpower.

Johannes

Ja.

Johannes

Hast du noch etwas

Johannes

auf deiner Liste stehen, Johannes?

Johannes

Nee, ich habe jetzt tatsächlich meinen ganzen Notizzettel

Johannes

abgefrühstückt.

Johannes

Jochen, hast du noch was zu Dikt, was wir

Jochen

noch nicht gefunden haben? Also ja, was ich ganz

Jochen

gerne vielleicht noch sagen

Jochen

wollen würde oder so, ist halt, dass man

Jochen

auch selber sich Sachen implementieren kann,

Jochen

die dann halt so funktionieren wie Dicts.

Jochen

Es gibt ja seit Python 3.3, glaube ich,

Jochen

Protocols oder was weiß ich wie das.

Jochen

Man hat halt auf jeden Fall diese AppSecBase-Klasses,

Jochen

wo es dann Interfaces für diese ganzen Geschichten gibt.

Jochen

Und da hat man dann halt...

Dominik

Moment, also Protocols sind fertige

Dominik

ABCs, AppSecBase-Klasses? Protocols sind was

Dominik

total Cooles. Die Implementierung

Dominik

von Python-Modulen,

Dominik

die es schon gibt? Ach, cool.

Dominik

Die kann man ja auch fürs Typing dann benutzen.

Dominik

und so. Ja, genau. Und die sind großartig

Johannes

fürs Typing. Da kann man nämlich richtig gutes

Johannes

Duck-Typing machen, was aber trotzdem getypt

Jochen

ist. Genau. Das ist großartig. Genau. Und dann kannst du

Jochen

eben deine eigene, für

Jochen

eben deinen Anwendungsfall etwas Spezielles hinbauen,

Jochen

wo du dann sicher sein kannst, dass sich das dann aber

Jochen

genauso verhält und auch an den Stellen

Jochen

verwendet werden kann, wo du normalerweise

Jochen

ein DIC benutzen würdest und so.

Jochen

Da kannst du auch sehr coole Sachen mitmachen.

Jochen

Wobei das Protokoll von einem DIC-Driver

Jochen

ist ja vergleichsweise groß. Was ist das denn?

Jochen

Was ist denn ein DIC-Type? Das ist, meine ich, mappable,

Jochen

aber ich gucke mal gerade.

Jochen

wo haben wir das denn da?

Jochen

Es gibt Mapping, Mapping heißt das, genau.

Jochen

Ein Mapping.

Jochen

Mutable Mapping.

Jochen

So, ach,

Jochen

jetzt steht das Interface hier aber nicht dabei.

Jochen

Collections.abc

Jochen

Import.

Jochen

Abstract Base Class.

Jochen

Moment, ich importiere das gerade mal, mach mal ein Diagramm.

Dominik

Ja, das ist cool, weil dann kannst du einfach von Mapping ärgern lassen

Dominik

und alles, was du nicht implementiert hast, wird dann einfach direkt

Dominik

geraced.

Dominik

Genau. Wenn das halt nicht da ist, das ist doch schon

Dominik

Beziehungsweise ein MyPi oder ein Type-Checker

Dominik

sagt dir der auch direkt das.

Dominik

Ja, aber du wirst direkt gezwungen, das richtig zu implementieren.

Dominik

ABC Blood Collections.

Dominik

Ja, ich hab mich gerade geschützt.

Dominik

Weil ABC ist ja die ABC selber drin.

Dominik

Ich weiß, ich weiß.

Jochen

Gleichzeitig reden, tippen und das alles.

Jochen

Ich glaube, was du auch machen kannst,

Jochen

wo keiner zu sehen kann.

Dominik

Mach mal ein neues Objekt von Mapping auf, einfach.

Dominik

Das kannst du nicht ins Studio.

Dominik

Sehen Sie nächstes Mal in diesem Podcast.

Dominik

Das geht nicht.

Dominik

Genau, da steht aber jetzt dann, was du brauchst.

Dominik

Ja, okay.

Dominik

Du musst halt Get-Item-Itter

Dominik

und Längen definieren von meinem

Jochen

Wrapping. Okay, zumindest, ja.

Jochen

Also das Interface selber ist jetzt doch

Jochen

etwas größer, das sind halt

Jochen

37

Jochen

Methoden und das ist natürlich schon eine ganze Menge.

Johannes

Ja, das hatten wir ja vorhin auch schon angesprochen, dass eben

Johannes

Dicts relativ viel Oberfläche

Johannes

haben. Ja.

Johannes

Weil sie halt für alles verwendet werden.

Johannes

Ja.

Jochen

Ja, aber eben, also man kann das

Jochen

halt verwenden. Interessant,

Jochen

interessant.

Dominik

Ja. Ist das euer Lieblingsdatentyp?

Dominik

Ja, also von den primitiven

Jochen

Dingen auf jeden Fall. Ich habe das auch

Jochen

letztens, also diese ganzen

Jochen

Type-Ins,

Jochen

Typisierungsgeschichten, die es jetzt neuerdings gibt.

Jochen

Es gibt ja immer so, auf Twitter gibt es dann so

Jochen

die alten Säcke, die da rumhängen

Jochen

und die

Jochen

äußern sich ja manchmal.

Jochen

Wie alt bist du gleich noch, ihr jungen Hüpfer?

Jochen

Ja, sie sind noch älter als ich.

Jochen

Die im Kopf alten Säcke.

Jochen

Ja, nee, also

Jochen

verdiente Veteranen.

Jochen

Ah ja, okay, sehr schön.

Jochen

Der Python-Community und

Jochen

die sich manchmal so ein bisschen despektierlich äußern,

Jochen

was diese ganzen neuen

Jochen

Entwicklungen angeht. Der ganze Scheiß, gar nicht mehr

Jochen

Pythonic. Genau, und so ein bisschen

Jochen

kann ich das natürlich auch, kann ich das nachvollziehen, muss ich

Jochen

sagen. Also zum Beispiel, ich sag jetzt mal

Jochen

einen Namen, David Beasley zum Beispiel.

Jochen

Der ganz viel cooles

Jochen

Zeug gemacht hat, der auch eines der besten Bücher

Jochen

Python-Bücher geschrieben hat, irgendwie Python

Jochen

Essential Reference, glaube ich.

Jochen

War lange super. Jetzt gibt's da sogar

Jochen

Python Distilled, ist jetzt nochmal

Jochen

eine neue Ausgabe.

Jochen

Super Buch.

Jochen

Und der sagt so, also ich weiß

Jochen

nicht, dieses ganze Typing-Zeugs,

Jochen

ich finde, das sieht nicht gut aus,

Jochen

ich mag das nicht. Und was wir

Jochen

früher, als wir nix hatten, was wir gemacht haben,

Jochen

wir haben immer irgendwie Dicts genommen und

Jochen

ein paar List Comprehensions und damit haben wir

Jochen

alles gemacht. Alles haben wir damit gemacht. Und das war

Jochen

viel besser, als irgendwie, wenn einer sich mit Java

Jochen

hingesetzt hat und hat dann irgendwie so angefangen

Jochen

erst mal Interfaces zu definieren und dann

Jochen

irgendwie, keine Ahnung, sich da erst mal

Jochen

in, ja,

Jochen

weiß ich nicht, in so ein Spinnennetz

Jochen

aus komischen Dingen, die man alle so machen

Jochen

muss, weil man sie halt machen muss.

Jochen

Wenn man irgendwas hinschreibt, genau,

Jochen

diese ganze Zeugs, dann hat man sich in so einem Spinnennetz

Jochen

von Dingen verheddert,

Jochen

bevor man auch nur eine Zeile

Jochen

produktiven Code geschrieben hat und dann ist man mit den Dicts und

Jochen

den Miscomprehensions so lange fertig.

Jochen

Und damit hat er nicht so

Jochen

ganz Unrecht. Also tatsächlich ist es so,

Jochen

das dickst, wenn man das beherrscht und

Jochen

so wirklich verstanden hat, wie das funktioniert, mit eben

Jochen

vielleicht noch Dick-Comprehensions,

Jochen

vielleicht noch Generator-Expressions würde ich

Jochen

dazu nehmen und List-Comprehensions.

Jochen

Damit kann man

Jochen

einen Großteil von dem, was man so im Alltag an

Jochen

Programmierproblemen hat, tatsächlich lösen

Jochen

und es ist

Jochen

sehr, ja, man kommt da schnell

Jochen

hin. Sehr convenient und halt

Jochen

dem Python-Prinzip gar nicht.

Dominik

Das ist auch

Johannes

so ein bisschen die Stärke von Python.

Johannes

Ich muss auch

Johannes

gelegentlich andere Sprachen machen, jetzt so ein bisschen

Johannes

TypeScript kommt auf mich zu und

Johannes

C-Sharp

Johannes

und da sind solche Mapping-Typen

Johannes

einfach unhandlich, die sind einfach

Johannes

schwieriger zu benutzen.

Johannes

Du musst definieren,

Johannes

was da für Typen drin sind, nicht in TypeScript.

Johannes

In TypeScript kannst du einfach,

Johannes

der Trick an TypeScript, kannst du einfach immer Annie sagen.

Johannes

Jeder Typ ist Annie

Johannes

in TypeScript, aber in C-Sharp

Johannes

kannst du das auch machen, kannst du auch

Johannes

Annie sagen, aber

Johannes

wird nicht gerne gesehen.

Dominik

Mein Lieblingstalent wird Andy übrigens, der sagt, das reicht ihm nicht.

Dominik

Ja, okay, gut.

Johannes

Das ist eine Einstellungsache, das kannst du ja abschneiden.

Johannes

Ja, kann ich.

Johannes

Das geht trotzdem.

Johannes

Aber es ist einfach unhandlicher.

Johannes

Und das ist auch sowas, wenn man sich an diese Art zu denken gewöhnt hat,

Johannes

dann sieht man auch überall Dictionaries.

Johannes

Und dann will man sie auch überall verwenden.

Johannes

Deshalb mir fällt die Schauprogrammierung sehr, sehr schwer,

Johannes

weil ich mir ganz oft denke, ja, da könnte ich jetzt einen Dictionary verwenden,

Johannes

aber kann ich an der Stelle nicht.

Johannes

Ja, muss nicht so viele Spiele programmieren.

Johannes

und muss aber zwölf Umwege

Johannes

machen.

Johannes

Ich sehe aber auch, also

Johannes

ich sehe auch den Vorteil von diesem Typing an.

Johannes

Ich bin da ganz klar auf der

Johannes

Seite der jungen Hüpfer wie dir, Jochen.

Johannes

Und das ist für mich so ein bisschen

Johannes

diese, es gibt ja diesen klassischen

Johannes

Kampf zwischen Explore and Exploit,

Johannes

wo jeder entscheiden muss, was

Johannes

er machen muss, um ein Problem

Dominik

zu lösen. Also Explore ist unbekannte

Dominik

Dinge angucken und Exploit ist bekannte

Dominik

Dinge so lange gegenhauen, bis es irgendwie kaputt geht?

Dominik

Ja, genau. Also Explore heißt

Johannes

Lösungen ausprobieren, die

Johannes

dir selber noch nicht bekannt sind.

Johannes

Also suchen quasi. Und Exploit

Johannes

heißt Dinge anwenden, die du schon weißt.

Johannes

Und

Johannes

Menschen sind da halt sehr unterschiedlich

Johannes

und das ist tatsächlich wohl so, dass das mit dem Alter

Johannes

eher zu Exploit geht

Johannes

als zu Explore, was ja auch okay ist, weil

Johannes

du viel Explore schon gemacht hast

Johannes

und dann eben die Dinge

Johannes

anwendest, die du schon weißt. Wenn du mehr weißt, ist das

Johannes

natürlich effektiver, als wenn du weniger weißt. Kinder machen

Johannes

viel, viel mehr Explore. Wusstest du, dass einige

Dominik

Hacker schon von Anfang an Greise

Dominik

im Kopf gewesen sind? Ja, das

Dominik

Man muss sich das auch manchmal wieder zurück

Johannes

in den Kopf rufen, dass man vielleicht

Johannes

gelegentlich wieder Explore machen muss. Das ist auch der Grund, warum

Johannes

ich C-Sharp und TypeScript und so weiter mache, damit

Johannes

man mal ein bisschen wieder was anderes macht. Ich dachte, C-Sharp

Dominik

machst du, damit du endlich noch ein Spiel realisieren kannst.

Dominik

Ja, irgendwie muss man

Johannes

ja sein Schloss sicher arbeiten.

Dominik

wie erschlossen arbeiten

Dominik

das spricht sich doch schon von alleine

Dominik

ja Erben

Dominik

ich glaube

Dominik

oder erobern

Dominik

Schlösser müssen eigentlich geobert werden

Dominik

mit Verteidigungsanlagen oder Heirat

Dominik

ja das ist auch eine Art

Dominik

der Eroberung

Dominik

sieht bei mir

Dominik

jetzt nicht so gut aus

Dominik

ich bin schon verheiratet

Dominik

und mit Erben

Dominik

ich habe meinen Vater gefragt

Dominik

im Inventar.

Dominik

Hast halt die hübsche genommen, ist eine schlechte Entscheidung.

Dominik

Absolut.

Johannes

Und hübsch und schlau, das sind ja schon zwei Ereigenschaften,

Johannes

die man sonst nicht im Paket kriegt.

Johannes

Hat sich mein Vater gefragt,

Johannes

wann ich als Erbpatter direkt die Schlösser austauschen lasse.

Johannes

Ja, aber das ist eben,

Johannes

man muss sich auch immer wieder in den Kopf rufen,

Johannes

dass man ein bisschen Explore macht und nicht nur Exploit.

Johannes

Also nicht nur das anwenden, was man kann,

Johannes

sondern auch mal was ausprobieren, was man noch nicht kann.

Johannes

Und Dictionaries und Typing gehören halt dazu.

Johannes

Es gibt so eine witzige Liste von,

Johannes

wie man Programmiersprachen beschreiben kann.

Johannes

Und die fangen alle an mit, what if everything was?

Johannes

Und C zum Beispiel, bei C ist das Mandat,

Johannes

what if everything was a pointer?

Johannes

Und in Java ist, what if everything was an object?

Johannes

Und Python ist halt

Johannes

what if everything was a dictionary?

Johannes

Und das ist schon so. Dictionaries sind so ein bisschen

Johannes

der Kern von Python.

Johannes

Die sind leicht zu verwenden, die sind sehr mächtig,

Johannes

man kann so gut wie alles damit machen und

Johannes

die

Johannes

formen dann so ein bisschen das Denken.

Dominik

Jetzt haben wir es ein bisschen verherrlicht, weil wir jetzt noch gar nicht die Nachteile

Dominik

davon erklärt haben. Warum wollen wir das denn vielleicht

Dominik

nicht benutzen? Nachteile?

Johannes

Was könnte es jetzt noch für Nachteile geben?

Johannes

Es ist O von 1, es kann alles speichern,

Johannes

das ist großartig. Also vielleicht so wie

Johannes

Speicherverbrauch. Ja,

Johannes

Ja gut, das haben wir am Anfang schon gesagt.

Johannes

Also ein Dictionary verbraucht direkt

Johannes

ein Viertel Kilobyte.

Dominik

Das heißt, bei so Embedded Programming oder irgendwelche

Dominik

IoT-Sachen ist das dann

Dominik

vielleicht nicht die richtige Wahl.

Dominik

Es ist auf jeden Fall

Dominik

relativ wasteful.

Johannes

Also man hat immer einen großen

Johannes

Overhead. Immer mindestens

Dominik

50 Prozent Overhead. Wir laufen alle auf so Kisten, wo wir genug

Dominik

Speicher haben, da ist das wurscht. Ja, natürlich.

Johannes

Das ist die Ausrede, die man heutzutage macht. Aber es gibt

Johannes

natürlich auch Fälle, wo es eben nicht so der Fall ist.

Johannes

Oder wo man an die Grenzen kommt.

Johannes

Ja, so eine Waschmaschine hat halt 4 Kilobyte Hauptarbeitsspeicher.

Johannes

Wenn du 100.000 TPS machen kannst statt 1 Million und du brauchst dann 1 Million, dann wird das halt schon irgendwann relevant.

Jochen

Ja, Moore's Law wird alles gut machen langfristig.

Dominik

Auch eine Waschmaschine bekommt dann mehrere Gigabyte Speicher für einzelne Waschbocken.

Johannes

Ja, Waschmaschinen haben ja heutzutage schon mehr Hauptspeicher.

Dominik

Irgendwann musst du da einfach mal noch so Grundrohstoffe reinkippen wie, keine Ahnung, weiß jetzt nicht, Sand und Salz oder sowas.

Dominik

Und da baut es automatisch Waschmittel raus

Dominik

und das perfekt für die Wäsche

Dominik

geeignet ist.

Dominik

Du kannst doch schon so

Johannes

Waschmaschinen, Waschmittel, Cartridges kaufen

Johannes

und die werden dann auch so dosiert,

Johannes

dass es für den Waschmittelhersteller optimal ist.

Johannes

Okay.

Johannes

Für den Waschmittelhersteller,

Johannes

das ist natürlich, ja, egal.

Johannes

Ja, leider nicht.

Dominik

Ich hoffe, euch hat eure Folge, unsere Folge zu Dix

Dominik

heute gefallen. Falls dir noch irgendwas dazu einfällt,

Dominik

dann...

Jochen

Ich glaube, Pics und sowas machen wir irgendwann anders.

Dominik

wir sind auch schon. Ja, ich glaube, wir sind jetzt heute weit

Dominik

fortgeschritten. Also mein Lieblingsmodul

Dominik

in Python ist ja

Johannes

Buildings.dict. Das ist mein Pick der Woche.

Johannes

Okay.

Dominik

Ich mache dann einfach von einem Padentic.dict.

Dominik

Ja, okay, perfekt.

Dominik

Und Jochen macht Name-Tubel.

Dominik

Ja, Adress eher.

Dominik

From Jochen Imports.

Dominik

Die eigene Implantierung, ja. Aber genau, kann man sich

Jochen

auf jeden Fall auch mal angucken. Das lohnt sich.

Jochen

Da haben wir doch Picks gemacht.

Jochen

Ging schnell.

Dominik

Ja, dann bleibt uns gewogen,

Dominik

hört uns immer, wo ihr uns hören wollt und

Dominik

eine schöne Zeit und bis zum

Dominik

nächsten Mal. Bis zum nächsten Mal.

Dominik

Bis zum nächsten Mal. Tschüss.