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

· Zurück zur Episode

Vollständiges Transkript der Episode. Zeitstempel beziehen sich auf die Audiowiedergabe.

Dominik

Ja, hallo liebe Hörerinnen und Hörer.

Dominik

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.

Dominik

Hi Jochen.

Jochen

Halli, hallo, Dominik.

Dominik

Dominik, genau.

Dominik

Und heute ist auch wieder Johannes dabei.

Hi Johannes.

Hallo zusammen.

Jochen

Ja, moin.

Dominik

Ja, wir fangen wie immer ein bisschen News aus der Szene an.

Dominik

Und was es sonst noch so einfällt.

Dominik

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

Ja.

Dominik

Also du wolltest unbedingt auch über den Copilot reden, habe ich gehört.

Jochen

Ich wollte das.

Ja, ich ja auch.

Der Johann ist derjenige,

Johannes

der immer darüber sprechen möchte.

Dominik

Ja, wir haben schon zweimal drüber gesprochen.

Dominik

Aber jetzt hat auch Jochen ihn ausprobiert.

Johannes

Jetzt hat auch PyJarm hat jetzt auch Copilot.

Dominik

Deswegen, genau.

Jochen

Genau, ich habe irgendwann die erlösende Mail von GitHub dann 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, obwohl du immer schon so davon so vorgeschwärmt hast.

Dominik

Ja, du hast mal gesagt, ach, was für ein Fach ist ja völlig egal.

Jochen

Das kann ja nicht, also wenn man jetzt irgendwie so den durchschnittlichen Code da von irgendwelchen Leuten kriegt, das kann ja nichts, das kann ja nichts taugen.

Jochen

Aber ich muss sagen, ich bin doch sehr überrascht, dass das manchmal wirklich, wirklich

hilfreich ist.

Dominik

Sogar Jochen findet das hilfreich.

Ja, sogar Jochen findet es hilfreich.

Dominik

Ja, ich finde es auch sehr, sehr cool.

Dominik

Also ich finde vor allem dieses Auto completion cool.

Dominik

Er lernt irgendwie aus seiner eigenen Codebase und weiß so ein bisschen, was du als nächstes vorhaben könntest oder macht manchmal so einen guten Vorschlag.

Dominik

Ist natürlich nicht immer, ist auch nicht immer richtig, aber manchmal ist es erstaunlich richtig.

Jochen

Ja.

Jochen

Ja, und manchmal findet man halt Dinge dadurch erst, die man also ich hab, ich mache jetzt manchmal auch so ein bisschen JavaScript bzw.

Jochen

TypeScript und manchmal weiß ich einfach nicht, wie Sachen gehen.

Jochen

Also ich habe keine Ahnung, wie das geht.

Jochen

Und dann fange ich irgendwie mit einem Variablen-Namen an und dann kriege ich so einen ganzen Codeblock und der tut genau das, was ich eigentlich machen wollte.

Ja, klar, das ist halt richtig.

Dominik

Also du musst halt wirklich aufpassen, was für einen Namen du denn Ding gibst.

Dominik

Wenn du den gute Namen gibst, ist er viel besser, als wenn du schlechte Namen gibst.

Dominik

Und wenn du zusätzlich.

Johannes

Da muss man sowieso aufpassen und immer gute Namen drin.

Dominik

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

Dominik

Oder halt, also was halt bei mir voll gut funktioniert, ich mache halt den Methodennamen beispielsweise oder den Klassennamen oder die Funktion und die Argumente und Type-Ns und dann weiß er ziemlich oft, was zu tun ist, wenn ich einen DocString noch mache.

Dominik

Dann schreibe ich im Docspring 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 gut.

Dominik

Und ich weiß, warum Joch den gut funktioniert, weil er sich halt immer am selber am eigenen Code-Repo orientiert und der orientiert sich an Jochens eigenen Code und dann denke ich Joch natürlich immer, oh, was für ein

toller Vorschlag, ja.

Ja, ja.

Jochen

Nee, aber es ist ja immer eine, also Kritik würde ich sagen, also ich habe, es ist auch besser geworden, wenn man diese Nightly-Version nimmt.

Jochen

Ich habe zuerst die Standard-Version genommen, die, und man kann halt die aktuelle Bleeding-Edge Geschichte nehmen, die ist, äh, finde ich, nochmal ein gutes Stückchen besser.

Jochen

Was manchmal nicht so gut funktioniert, also was womit Copilot halt irgendwie unerwarteterweise, weil man denkt, das ist ja eigentlich eine eine fache Geschichte, große Probleme hat, wo er das ein großes Problem hat, sind Klammern.

Jochen

Also die Klammern richtig zu setzen, also zum Beispiel zumachen, das macht eigentlich fast nie die Klammern richtig zu.

Jochen

Oder halt irgendwie, dass das halt 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 und dann ist das natürlich, das funktioniert halt nicht.

Okay.

Kannst du das machen?

Johannes

Kannst du dir das nicht erklären, dass das doch irgendwie diese neuronalen Netze, weil die halt nicht genügend Zustand für sowas

haben, oder?

Jochen

Ja, man muss denen halt irgendwie die Syntax sozusagen irgendwie so einprügeln, dass sie das halt nicht, dass das nichts Unscharfes ist oder das funktioniert vielleicht nicht so richtig.

Ja, aber

Johannes

prinzipiell hat dieses Netz ja kein Verständnis von, ich habe N-Klammern geöffnet und du musst jetzt N-Klammern auch wieder schließen in der richtigen Rente.

Dominik

Na gut, aber du kannst ja alle Vorschläge aussortieren, bei denen das nicht stimmt.

Dominik

Oder du kannst ja danach noch auditieren oder sowas.

Jochen

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

Jochen

Nur das ist halt irgendwie so ein bisschen erstaunlich, wo man sich denkt, so, naja, also den schwierigen Teil, den kann es eigentlich überraschend gut.

Jochen

Nämlich irgendwie rausfinden, was man da machen wollte und dann den so Code schreiben, der zumindest so aussieht, als würde das nicht mehr.

Ja, machen wir eine Klammerfehler.

Jochen

Und dann kommen halt so Dinge, wo man sagt, das kann man ja fast, eine Idee kann das ja schon, so die Klammern richtig setzen.

Jochen

Und das geht da nicht mehr.

Jochen

Ja, gut.

Jochen

Aber ich meine, das sind Sachen, die wird man halt mit der Zeit in den Griff kriegen, denke ich mal.

Jochen

Und dann ist das schon echt beeindruckend.

Dominik

Was man auch mal machen muss, das so User-Daten enttäuscht.

Dominik

Beispielsweise machst du irgendwie eine JSON auf und dann irgendwie zwei einen Namen, eine E-Mail-Adresse oder sowas und ein Passwort.

Dominik

Oder machst du Autocomplete und dann machst du dir halt eine Liste von Usern irgendwie, die mit Nutzernamen, Passwort und so.

Dominik

Das ist schön.

Dominik

Das ist halt dann die Frage, so wieder.

Johannes

Hast du direkt Demo-Benutzer, perfekt?

Dominik

Generiert oder?

Dominik

Ja, oder sind die generiert oder echt?

Dominik

Man weiß es aber nicht so genau, von wo die sind, dass das schon sind.

Die haben alle gelernt.

Johannes

Ja, es ist wohl auch, wenn man so Zahlenfolgen eingibt, dann gibt er einem interessante Instruktionen.

Das haben wir jetzt noch exit.

Johannes

Hand einen Screenshot gesehen, wo der ein russische Funktionsnamen dazu kam.

Jochen

Also, oh, okay.

Jochen

Ja, ich bin ja mal gespannt, was dabei rauskommt, wenn man sowas, man anfängt irgendwie so 3.1417.

Ja, ja.

Dominik

Hab mich hier nachgemacht, warte, ja.

Jochen

Ja, ja, vielleicht, vielleicht.

Jochen

Also, ja, das ist ja.

Johannes

Es ist noch keine AGI, es ist noch keine generelle Intelligenz,

Jochen

glaube ich.

Da habe ich letztens, äh, ach, ich komme vom Holzchen aufs Stöckchen, aber vielleicht ist das ja auch nicht so uninteressant, wieder eine ganz, ganz netten, netten Podcast-Episode gehört mit Lex Friedman, äh, Wolf, Lex Friedman, Stephen Wolfram von Wolfram interviewt hat, genau.

Jochen

Ja, der ist ja so ein Wunderkind und dann so ein bisschen hinter dir am Arbeiten.

Jochen

Ja, polarisierend.

Warum?

Dominik

Jetzt muss das genau aufklären, direkt.

Johannes

Ja, es gibt Leute, die lieben ihn total und er macht ja auch viele gute Sachen, aber es gibt Leute, die hassen ihn auch total, weil der halt auch seine Meinung für sehr wichtig hält.

Dominik

Achso, okay, ich wollte gerade sagen, wir wollen ja die Gründe und Anekdoten auch hören.

Dominik

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

Johannes

Ja, und er ist auch so ein, er hat so ein paar interessante Fixierungen.

Johannes

Der findet, dass die ganze Welt aus State-Machines besteht und muss alles mit State-Machines machen.

Und Rule 34 ist das Einzige, was

Jochen

diese andere Nummer.

Jochen

War das nicht Rule Rule 38 oder so?

Jochen

Das ist die.

Ja, diese 30er-Regeln, also das ist so eine Klasse von State-Machines.

Johannes

Und die kannst du durchnummerieren und die haben eine natürliche Ordnung und dann findest du halt irgendwann eine, die eine universelle Turing-Maschine ist im Wesentlichen.

Johannes

Steven Wolfram sagt halt mehr oder weniger, der schreibt ganze Bücher darüber, ja, was diese State-Maschine alles kann und dass die das Universum encodiert.

Johannes

Und das ist natürlich.

Johannes

Wenn du die gesamte Wissenschaft umstellen willst auf State Machines, ist es.

Dominik

Also ich habe immer noch keine Ahnung, was Rule 38 ist, aber das Urban Dictionary hat mir gesagt, Rule 38 is a prison offense in which someone is masturbating in public.

Ah, ja, okay.

Johannes

Wenn man Spaß haben, wenn du so einen Private Modern hast, dann google doch mal nach.

Jochen

Rule 34, das ist, glaube ich, die.

Jochen

If it exists, there's pawn of it, glaube ich.

Jochen

Das ist auch irgendwie eine sehr wichtige Regel und tatsächlich stimmt sie halt einfach immer.

Jochen

Aber.

Johannes

Leider, leider erstaunlicherweise.

Dominik

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

Achso, okay.

Das ist auch Rule 38, bestimmt hier.

Johannes

Rule 30 sagen die, dass

das dann.

Jochen

Okay, aber das sind beides nicht die Regeln, die ich jetzt gerade meinte.

Johannes

Regel 30 ist es.

Jochen

Genau, ne, aber genau, um diese Dinger ging es natürlich bei der Episode auch.

Jochen

Und also ich finde das schon interessant, ja.

Jochen

Ich meine, das ist ja, also er hatte irgendwie, Leute hatten hohe Erwartungen an ihn, weil er war halt so ein Wunderkind.

Jochen

Und dann ist aber irgendwie da doch nicht irgendwie so wirklich so einsteinmäßige Ausmaße, haben seine Theorien da jetzt nicht angenommen, sondern eher so ein bisschen hinter den Erwartungen zurückgeblieben.

Jochen

Und aber tatsächlich ist er ja, genau, eben der Meinung, dass er hatte ein Buch geschrieben, das hat auch schon so einen Titel New Kind of Science.

Jochen

Das kann man ja auch nur nehmen, wenn man denkt, da hat man jetzt mal echt was gefunden.

Johannes

Er hat ein gewisses Selbstbewusstsein, da kann man

Jochen

nichts kennen.

Jochen

Aber er hat ja auch coole Sachen gemacht.

Jochen

Also so ist es nicht.

Also es ist nicht nur.

Johannes

Er ist halt auch super ungeheuer produktiv.

Johannes

Also es gibt so eine, er hat so ein Diagramm veröffentlicht, von wann er E-Mails schreibt und der hat eigentlich immer 18-Stunden-Tage und manchmal hat er auch 24-Stunden-Tage.

Johannes

Also es ist der erschlägt es einfach durch Produktivität, diese ganzen Kritikpunkte.

Jochen

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

Johannes

Ja, oder eben Wolfram Alpha, wie gesagt.

Jochen

Und Wolfram Alpha, genau, ja.

Jochen

Und ja, auch die Firma so zu nennen, also naja gut, aber das ist macht ja wirklich cooles Stock.

Jochen

Also so kann man eigentlich auch nichts sagen.

Jochen

Und das fand ich mir ganz interessant, weil es jetzt, weil er auch da dann, weil kam das Thema auch auf Pi.

Jochen

Ich meine, das ist ja auch so eine Zahl, die einem ab und zu mal irgendwie über den Weg läuft.

Johannes

Du meinst Tau halbe?

Jochen

Ja, genau.

Jochen

Ja, stimmt.

Jochen

Tau ist dann vielleicht etwas, was man häufiger noch braucht als Pi.

Jochen

Und genau, wie ja, wie jeder weiß, ist das Ding halt transzendent, irrational.

Jochen

Und hat eine Menge super interessante Eigenschaften.

Jochen

Aber so fundamentale Sachen, die man jetzt, wo man denkt, das müsste man doch eigentlich darüber wissen.

Jochen

Also wie zum Beispiel sowas wie: kommen denn alle Ziffern in der Dezimalbruchentwicklung von Pi mit der gleichen Wahrscheinlichkeit vor?

Jochen

Also ist Pi normal oder nicht?

Jochen

Das weiß man halt nicht.

Jochen

Und zwar so gar nicht und hat auch gar keine Ahnung, wie man das irgendwie hinkriegen könnte.

Jochen

Dabei ist die Regel, die jetzt Pi erzeugt, eben auch ziemlich einfach eigentlich.

Jochen

Und dann ist es doch irgendwie überraschend, dass dabei eine Ziffernfolge rausfällt, die einmal so total zufällig aussieht, wo man nicht drüber sagen kann, jetzt okay, nicht mal die Verteilung der Ziffern da drin sagen kann.

Jochen

Und die so aussieht, als wäre sie, als könnte man wirklich nicht, man kann es halt auf nichts anderes reduzieren.

Jochen

Man kann da drin, findet daran keine Muster.

Jochen

Oder ja, die muss, also da kommt einfach alles, was es überhaupt ein Mustern irgendwie gibt, kommt wohl offenbar daran vor.

Jochen

Und das ist halt, ja, die Frage ist halt, wie kommt aus so etwas, aus so einer einfachen Regeln, wie man Pi bilden kann, warum fällt da plötzlich so ein ganzes Universum raus?

Johannes

Ja, das ist ja, also das ist ja im Wesentlichen das, was der Wolfram auch sagt mit seiner Regel 30.

Johannes

Das ist ja eine ganz simple Regel.

Johannes

Das ist die 30ste, die du ausprobierst, wenn du sie nach seiner Ordnung machst und dann kommt so mordsmäßiges Chaos raus und alles, was du dir vorstellen kannst.

Johannes

Das ist so ein generelles, so eine generelle Sache in der Mathematik.

Johannes

Irgendwann mache ich da auch mal noch einen längeren Diskurs drüber, dass man mathematisch gesehen aus sehr einfachen Regeln, wo man denkt, ja, die sind einfach genug, um sie im Kopf auszuführen, Dinge produzieren kann, die völlig unabsehbar sind und völlig überraschend auch, weil sie eben nicht mehr sich an die Regeln halten, sondern weil sie dann irgendwelche chaotischen, 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.

Dominik

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,

Jochen

nicht bekannt sind, überhaupt nicht bekannt sind alle.

Jochen

Also du kannst sie ja nicht kennen, das ist ja so ein bisschen.

Jochen

Aber man weiß halt nicht.

Johannes

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

Johannes

Einfach gar keine mehr.

Dominik

Ist das normalerweise so beim.

Dominik

Ja, okay.

Johannes

Nee, ist eben nicht normalerweise so.

Johannes

Aber es könnte sein, wir können es nicht ausschließen.

Johannes

Das ist die Sache, was der Joch sagt.

Keine Ahnung.

Jochen

Und das ist überraschend, dass man da so gar keine Ahnung hat, weil man denkt, so, naja, das müsste man doch jetzt irgendwie, wenn man sich irgendwie etwas an, wenn man die Regel VP entwickelt wird, hinschreibt und eine Funktion, die VP ausrechnet, das ist wirklich so ein paar Zeilen.

Jochen

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

Johannes

Oder zumindest ist man immer mal wieder eine 9 vor.

Johannes

Das ist ja schon eine Aussage, die sehr schwer zu treffen ist.

Johannes

Ja, aber das ist doch im Endeffekt, reduziert sich das darunter auf das Halting-Problem, oder?

Johannes

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.

Johannes

Das gab es vor einer Weile mal, das Tau-Manifest, wo jemand behauptet hat, Pi ist eigentlich die falsche transzendente Zahl.

Johannes

Die richtige transzendente Zahl ist eigentlich Tau und es ist zweimal Pi.

Johannes

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.

Johannes

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 Unbeliegende.

Dominik

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, ja, 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 halb mal 1.

Johannes

Dann gibt es irgendwelche ganz leichten Formeln.

Johannes

So 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, das heißt, die ist nicht algebraisch, das heißt, es gibt auch kein 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, ja, das sind alles algebraische Zahlen.

Johannes

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.

Ne, es gibt keinen Zahlen.

Gibt es nicht?

Dominik

Also es bewiesen, es nicht gibt.

Johannes

Ja, weil es transzendent ist.

Johannes

Und tatsächlich der Beweis, dass Pi transzendent ist, ist eine sehr schwierige Sache.

Ist auch noch gar nicht ungeheuer lange her.

Johannes

Aber das Ergebnis ist eben sehr wichtig, weil das eine Klasse von Zahlen ist, von denen es wesentlich mehr gibt als von anderen Zahlen, die für uns aber aus unserem menschlichen Verständnis her sehr schwer erreichbar sind, weil wir eben Brüche gewohnt sind und Wurzeln von irgendwas, also algebraische Zahlen.

Johannes

Das sind aber tatsächlich so auf eine gewisse Art und Weise die wenigsten reellen Zahlen.

Johannes

Es ist eben eins von diesen bekannten Beispielen für eine Zahl, die sich anders verhält, als man denkt.

Johannes

Und deshalb ist sie in der Mathematik sehr wichtig, weil sie eben eine transzendente Zahl ist.

Johannes

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

Die Eulersche Zahl.

Johannes

Die Eulersche Zahl, genau, und die hat nicht ganz so eine einfache Erklärung.

Sehr gut, Dominik.

100 Punkte zusätzlich.

Johannes

Die hat nicht ganz so einfache Eigenschaften, die sind nicht ganz so einfach zu erklären, aber ist auch transzendent, ist auch, 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, obwohl es eigentlich sehr viele davon gibt.

Johannes

Und ja, das ist halt leider so.

Jochen

Ja, und genau, also ja, in gewisser Weise haben die jetzt auch was mit eben diesen ganzen theoretischen Informatikschichten zu tun, weil sie sozusagen in gewisser Weise berechnungstechnisch irreduzierbar sind, sozusagen.

Jochen

Also man kann halt nicht eben, ja, also man muss es halt.

Es gibt keine geschlossene Form.

Jochen

Ja, man muss sie tatsächlich ausrechnen, sonst sonst kriegt man sie halt nicht in den Griff.

Jochen

Und das Problem ist, das ist halt teuer, ja, die auszurechnen, da muss man halt.

Johannes

Ja, und das ist ja auch so ein bisschen ein Sport, ja, dass der die meiste Anzahl Stellen von Pi ausgerechnet ist.

Jochen

Ja, da gab es letztens irgendwie wieder eine Nachricht, dass da jemand hier 60 Millionen Stellen oder weiß ich nicht, oder noch mehr.

Jochen

Ich weiß gar nicht genau, wie viele.

Johannes

Genau, also da kommt man dann halt wirklich sehr schnell in solche Bereiche rein, wo es dann gar nicht mehr so sehr um Prozessorleistung geht und gar nicht so sehr um Smarthead geht, sondern da kriegst du dann so richtig die Big Data-Probleme.

Johannes

Wie schaffst du das auf einer Zahl zu operieren, die 60 Milliarden stellen.

Dominik

Ich meine, ich meine, kennengelernt, der hat sich als auch Hobbyaufgabe gemacht, Nachkommastellen von Pi auswendig zu lernen, halt, glaube ich, die ersten 250 auch sagen können.

Jochen

Okay, das ist schon mal nicht so schlecht.

Johannes

Wir haben doch alle so einen Freund, oder?

Johannes

Der sowas.

Jochen

Ja, es gibt auch irgendwie die Gesellschafter Freunde von Pi, glaube ich.

Jochen

Und da muss man irgendwie die ersten 100 Stellen auswendig können oder so, damit man da aufgenommen werden kann.

Dominik

3,1, 4, 2, wie geht das weiter?

Johannes

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

Jochen

Wie da ist, da gibt es auch so interessante Fälle, wo dann in irgendeinem Cut-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.

Jochen

So eher sechste, siebte Nachkommastelle oder sowas.

Jochen

Und dann waren halt alle Baupläne irgendwie der letzten zehn Jahre alle falsch.

Johannes

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, aber es ist eigentlich falsch, weil es geht ja mit neun weiter.

Johannes

Wenn man Pi, ich glaube, auf 15 Stellen genau hat, dann reicht das schon für alle physikalischen Sachen aus, weil das dann irgendwie schon im Nanometer-Bereich ist 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, der 10 Meter im Durchmesser hat, hast du halt eine Abweichung von 1%.

Johannes

Also das ist dann schon schon eine ganze Menge.

Okay.

Johannes

Jede Programmiersprache hat eine Konstante, der eingebaut die Pi heißt.

Johannes

Python übrigens auch.

Math.py.

Johannes

Und die hat mehr Stellen, als man je in seinem Leben brauchen wird.

Johannes

Deshalb völlig ausreichend.

Dominik

Du da hast gerade einen Bogen zu Python gedacht, ich bin nicht begeistert.

Jochen

Ja, wunderbar, oder?

Jochen

Ja, ja, sollten wir vielleicht irgendwie mal zurückkommen.

Jochen

Ach, das ist aber wieder so völlig unvorhergesehen, aber ich finde das eigentlich halt so.

Das sollte doch heute eine

Johannes

wenigsten Episode sein, oder?

Jochen

Ja.

Jochen

Da bist die Lot halt durch.

Jochen

Wenn man in die Möhre ran will, da muss man auch ab und zu mal irgendwie keine Ahnung.

Johannes

Man muss ja erst ausgraben, die Möhre.

Dominik

Ja, Rotten.

Dominik

Gibt es noch was am News?

Jochen

Am News, ich weiß nicht genau, ist irgendwas Interessantes passiert.

Jochen

Django ist jetzt gerade die Pre-Release irgendwie.

Johannes

4.0 ist der Pre-Release.

Das hatten

wir komisch.

Jochen

Ja, da war das letzte Mal hatten wir Alpha.

Jochen

Ansonsten weiß ich nicht, gibt es eigentlich nichts.

Johannes

Python 3.10 ist immer noch aktuell und immer noch cool.

Dominik

Ja, mit letzte Folge hieß Python 3.10 Jahre.

Johannes

Ja, gut.

Johannes

Dann ist es trotzdem, ich wiederhole mich, es ist immer noch aktuell und immer noch cool.

Okay.

Jochen

Ja.

Jochen

Es gab ganz nette Artikel, einmal so über Python im Bankenumfeld gab es einen, der irgendwie in einer Variante hat,

denkt Python.

Johannes

Großartig.

Wie?

Was?

Johannes

Es gibt wohl eine Variante von Python, die bei großen amerikanischen Banken eingesetzt wird und die hat gewisse spannende Eigenschaften, sagen wir mal.

Johannes

Die hat beschrieben als ein Fork des kompletten Bankten Python.

Dominik

Bank Python, jetzt habe ich es aufgefangen.

Johannes

Bank Python.

Johannes

Großartig.

Johannes

Ich habe diesen Artikel gelesen und ich fand den super.

Johannes

Und da sind auch so ein paar Ideen drin, wo ich mir denke, ja, da könnte man versuchen, sich eine Scheibe abzuschneiden.

Dominik

An oral history of Bank Python.

Genau.

Johannes

Genau.

Cale Peterson.

Johannes

Und das sind auch ganz viele Sachen drin, wo man sich denkt, naja, gut, okay, gut.

Johannes

Die sind halt in dem Jahr, in dem sie den Fork gemacht haben, stehen geblieben und das war vermutlich 1994 und das ist jetzt halt so.

Johannes

Aber es gibt auch ein paar Sachen, die eigentlich sehr cool sind.

Johannes

Also dieser globale State und dieses globale Deployment und der Code ist in der Datenbank und du kannst alles anfassen.

Barbara.

Johannes

Das sind schon viele Dinge, die man sich mal überlegen könnte.

Ja.

Johannes

Den hast du vermutlich in meinen Weeknotes gefunden, oder?

Johannes

Ja, genau, ja.

Johannes

Werbung machen für eigene Sache.

Jochen

Ja, richtig.

Jochen

Ja, ich häng mit meinen Weeknotes wieder total hinterher.

Jochen

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

Johannes

Das muss Teil des Prozesses werden.

Johannes

Das muss eine Gewohnheit werden.

Dominik

Du hast ja nichts zu tun, ja, alles.

Johannes

Ich habe genügend zu tun, aber ich habe immer noch genügend Freizeit, dass ich Reddit lesen kann.

Johannes

Und wenn ich statt Reddit Weeknotes schreibe, dann ist das doch ein Gewinn für uns alle.

Ja, das stimmt.

Dominik

Ja, so viel Freizeit habe ich leider nicht.

Johannes

Warte mal, warte mal, Dominik.

Johannes

Haben wir nicht erst Montagabend von 20 bis 24 Uhr Computerspiele gespielt?

Dominik

Ist das Freizeit?

Johannes

Nein, das ist Socializing.

Dominik

Und das war erst um 20.36 Uhr haben wir angefangen.

Johannes

Oh ja, gut, okay, dann.

Dominik

Ja, und dann dran gespielt haben, habe ich natürlich nächsten Morgen noch was gekostet.

Dominik

Das ist ja auch klar.

Dominik

Wir haben übrigens gespielt, Max, Mechanized Assault and Exploration.

Jochen

Okay.

Dominik

Das ist ein Spiel, das kam das erste Mal, ich will es nicht lügen, bei 98 raus.

Und so sieht es auch aus.

Dominik

Es ist trotzdem super.

Dominik

Es gibt eine Max R, es ist eine Gehektorvision.

Dominik

Wenn man die Original, in Original-Videos und Sprites und sowas noch hat, ist gar nicht so schlecht aus, finde ich.

Dominik

Naja, das

Johannes

Interface, also das ist oft so.

Johannes

Diese alten Sachen haben oft gute Ideen, aber schlechte Internet.

Dominik

Und passiert das mit unheimlicher Komplexität.

Dominik

Das ist das aus der 96 Tonnen.

Ha, ehrlich.

So alt.

Johannes

Fast so alt wie ich.

Dominik

Ja, wir haben es geliebt.

Dominik

Ja, und wir spielen das auch übrigens noch weiter, die nächste Johannes.

Ja, okay Gott.

Ich dachte, wir spielen noch andere alte Spiele.

Dominik

Ja, das werden wir auch mal schaffen.

Dominik

Vielleicht nächstes Jahr.

Johannes

Na gut, wie war das gleich noch mit Python?

Jochen

Ja, genau.

Jochen

Dann machen wir jetzt, machen wir Python-Dictionaries und so, ne?

Ja, heute entspannt.

Johannes

Ihr wolltet heute über Dictionaries sprechen.

Ich habe es richtig verstanden.

Dominik

Also was ist denn ein Python Dictionary, ein Wörterbuch, ein Mapping von Dingen auf andere Dinge?

Johannes

Wie verstehst du denn ein Python Dictionary?

Johannes

Also ich meine, der Jochen und ich, wir können uns gleich noch über die Interna unterhalten und da gibt es viele spannende Dinge, die man da besprechen kann.

Johannes

Aber Dominik, wie siehst du denn ein Python Dictionary?

Johannes

Was ist denn für dich ein Python Dictionary?

Was ist denn das, was ein Python ist?

Dominik

Erstmal ein zweifte geklammertes, definiertes Objekt in Python, also dass es kein Z ist, sondern dass eine Zuordnung immer macht von einem Key auf einen Wert und wo halt der Lookup, also das, wenn man nachgucken kann, sehr, sehr schnell geht, weil man schön drauf zugreifen kann und dann gibt es direkt einen Wert zurück, den es rausschmeißt.

Dominik

Das ist so das, wie im Python Dikt man einfach, glaube ich, schnell benutzt.

Johannes

Okay, Zuordnung von einem Key zu einem Wert.

Johannes

Das heißt, ich könnte mir jetzt zum Beispiel zum Key Dominic deine Telefonnummer speichern.

Dominik

Ja, und dann könntest du das Phone Numbers nennen oder sowas und dann machst du das gleich mit Jochen noch und ja.

Johannes

Und könnte ich mir aber nicht auch deine Adresse dazu merken?

Dominik

Ja, aber zu was?

Dominik

Also es ist ja die Frage, ob du, wie du das strukturieren möchtest.

Dominik

Also die kann man ja beliebige Objekte als Value hinterlegen?

Nee, das

Johannes

stimmt nicht.

Achso, als Value schon.

Johannes

Aber Key als Key nicht.

Dominik

Nein, aber genau, als Value hinterlegen, das heißt, da kannst du natürlich dann an.

Johannes

Aber wir haben nur einen, oder?

Dominik

Du kannst ja ein Tupel reinpacken.

Johannes

Okay, ich kann Tupel reinpacken, aber ich könnte mir jetzt nicht zweimal zu dir zwei verschiedene Sachen merken.

Also das müsste ich dann selber machen.

Dominik

Nee, tatsächlich.

Dominik

Also ein Key muss ist unique in einem Käfig.

Johannes

Weil das ist ja in einem Wörterbuch nicht so.

Johannes

Und in einem Telefonbuch ist das auch nicht so.

Johannes

Das ist so eine Sache, die immer, ich mache gelegentlich Python-Schulungen, übrigens im Dezember wieder.

Dominik

Naja, aber wahrscheinlich ist es dann so, dass dann, wenn du das Lookup machst und dann Dominik nachguckst und dann gibt es verschiedene Dominics, dann hast du erst eine Liste von Dominics, die du zurückkriegst und in dieser Liste stehen dann die einzelnen Dänder drin.

Ja, aber ich kriege ja keine Liste.

Johannes

Wenn man Dominik nachguckt, dann kriege ich nur einen Wert.

Der kann dann eine Liste sein.

Dominik

Genau, aber wenn es eine Liste ist, ja, aber dann der Unterschied zum Telefonbruch ist ja marginal, du musst ja einfach nur gucken, dass ein oder mehrere Werte und dann jeweils dann wieder weiterpacken.

Ja, also ich

finde, es ist fürs Verständnis her schon ein sehr wichtiger Unterschied.

Johannes

In einem Dictionary kann jeder Eintrag nur einmal vorkommen, jeder Key kann nur einmal vorkommen.

Dominik

Okay.

Dominik

Also ich habe tatsächlich irgendwann nochmal mit dem Kind.

Johannes

In Müller gibt es sehr viele verschiedene Müllers.

Dominik

Ja gut, aber wenn du Müller dann alle Liste von allen Müllers bekommst, dann ist ja der Zugriff auf einen einzelnen Müller genau wieder, dann müsstest du eigentlich nur eine Ebene tiefer rein.

Dominik

Egal.

Dominik

Also was ich da so tiefer drin verstanden habe, dass es irgendwie halt in den Speicher gemerkt wird und das deswegen so schnell ist, weil er dann einfach dann die Speicheradresse nachschauen kann.

Johannes

Ja, das ist ja die Magie des Hashtable.

Dominik

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

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, da weiß ich, dass der das weiß.

Dominik

Ja, also ich weiß, dass Stringsples sein können.

Dominik

Ich weiß, dass es Integers sein können.

Noch was?

Strings auch?

Dominik

Ja, genau, Strings habe ich gesagt, Strings, Insig.

Johannes

Kann es auch ein Dictionary sein?

Nee.

Doch.

Sind die Hashable?

Und eine Liste?

Jochen

Sind die hashable?

Jochen

Das war schon eine sehr, sehr gute Frage.

Das frage ich dich, Dominik.

Dominik

Das weiß ich nicht, immer ausreichend.

Johannes

Die Regel ist, tatsächlich ganz interessant, ein Key von einem Dictionary muss etwas sein, was sich nicht verändern kann.

Johannes

Hashable sind diese Typen alle, aber der Hash kann sich verändern, wenn sich das Objekt verändert.

Und deshalb gibt es für Dictionary, äh, für Liste gibt es Tuple.

Johannes

Ich kann eine Liste nicht als Key verwenden, weil die sich verändern kann.

Johannes

Ich kann aber ein Tuple verwenden.

Johannes

Und ein Tuple ist ja im Wesentlichen nichts anderes als eine Liste, die sich nicht verändern kann.

Johannes

Für Dictionaries und für Sets gibt es einen äquivalenten Datentyp.

Johannes

Der heißt Frozen Dict und Frozen Set.

Johannes

Und das sind im Wesentlichen Dictionaries und Sets, die sich nicht verändern können.

Johannes

Das heißt, wenn ich ein Set als Key in einem Dictionary haben möchte, muss ich ein Frozen Set draus machen.

Johannes

Und das ist auch so ein bisschen der einzige Sinn für diese beiden Datentypen, dass du eben ein unveränderliches Dictionary oder ein unveränderliches Set haben kannst, um sie als Key in einem Dictionary zu verwenden.

Dominik

Und weil man das machen will, ist weil man ein Lookup haben will nach dem Motto, wenn das da drin ist, dann gibt mir dies.

Jochen

Ja, aber halt auch, wenn man sie wieder in ein Set packen möchte, weil man möchte, dass da Schnittmengen von Sachen bilden können oder feststellen können, ob man das schon mal gesehen hat oder so.

Johannes

Oder die Reihenfolge spielt keine Rolle.

Das ist ja, das ist so ein bisschen, als Mathematiker ist das Set wie eine Liste ohne Reihenfolge.

Dominik

Und interessant, Reihenfolge müssen wir es auch merken, weil Order Dict und sowas, weil das ja früher nicht so ging, das glaube ich an die Freude.

Ja, muss man inzwischen nicht mehr.

Johannes

Früher musste man sich Order Dikt immer merken, aber inzwischen sind alle Dicts Order Dicts, deshalb, den Typ Order Dict gibt es noch, aber der macht irgendwie gar nichts mehr.

Jochen

Ja, doch, doch, doch.

Der hat noch ein Reversed, aber.

Jochen

Ja, doch, der hat, die verhalten sich unterschiedlich.

Jochen

Also tatsächlich macht das durchaus Sinn.

Jochen

Also man muss ab und zu mal, das ist vielleicht so ein bisschen, vielleicht sollte man das nicht müssen, aber je nachdem, wie man, wie man Dikt verhält, äh, äh, wie sich das Dikt verhalten soll, das man verwendet, also wenn man zum Beispiel viele Insatz hat von Keys, dann ist es besser, Order Dikt zu nehmen statt dem Default-Ding.

Jochen

Also es gibt da tatsächlich subtile.

Warum Jochen?

Johannes

Wie wächst es denn?

Johannes

Wie wächst denn ein Dictionary?

Jochen

Ja, genau.

Ich habe es vorhin nachgeguckt.

Soll ich es euch verraten?

Ja, verbindet.

Ja, aber ich hatte eh mal.

Johannes

Ein Dictionary fängt an mit null Buckets.

Johannes

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

Johannes

Es hat null Buckets.

Johannes

Es verbraucht 64 Byte.

Johannes

Ist übrigens unterschiedlich zwischen 32 und 64-Bit Maschinen, aber ich glaube, wir sind alle inzwischen auch 64-Bit angelangt.

Johannes

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

Johannes

Buckets sind Speicherplätze.

Erklären wir gleich noch, weil es eben zu dieser HashMap gehört.

Johannes

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

Dominik

Wobei das heißt quasi der Speicherbereich wird vorreserviert für alles, was wir rein haben.

Johannes

Genau, diese Datenstruktur, das heißt, die heißt Hash Map und die braucht leeren Platz.

Johannes

Die kann nicht 100% voll sein.

Johannes

Und deshalb machen die halt immer eine Verdopplung.

Johannes

Verdopplung ist so eine Wachstumsstrategie, die gut funktioniert.

Johannes

Auch bei Resizable Listen, die verdoppeln sich auch.

Johannes

Das ist einfach so eine Wachstumsstrategie, die so eine gute Balance ist.

Johannes

Am besten wäre es, glaube ich, wenn man Wurzel 3 hätte als Wachstumsfaktor, das ist 2,3 oder irgendwas.

Johannes

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

Jochen

Ja, stimmt.

Jochen

Bei dem Array-Array-Modul bei dem eingebauten, das habe ich mir mal näher angeguckt aus Gründen.

Jochen

Und da ist das auch so.

Jochen

Weil das ist ja auch interessant, dass er quasi sozusagen wie eine Liste bloß halt statisch getypt.

Jochen

Und man verbraucht tatsächlich nur den Platz, den halt, also für den Integer braucht man halt nur, ja, je nachdem 32 oder 64-Bit.

Jochen

Und da ist es auch so, da kann man Append sagen hinten und wenn man da was hinzufügt und der Bereich der Memory-View innen drin ist, erschöpft, dann verdoppelt sich das halt auch immer.

Johannes

Ja, das ist eine klassische Strategie.

Johannes

Okay, das bedeutet aber halt auch, man darf sich nicht darüber im Unklaren sein, so ein Dictionary verbraucht relativ viel Speicherplatz.

Johannes

Wenn ich einen Eintrag in den Dictionary rein tue, dann hat es direkt 240 Byte Hauptspeicher verbraucht.

Johannes

Das ist nicht ganz ohne.

Johannes

Wenn ich sechs Einträge rein tue, hat es direkt 480 Byte verbraucht.

Johannes

Also es verbraucht relativ viel Speicherplatz.

Johannes

Es geht hier nicht um Effizienz, sondern es geht um Schnelligkeit.

Johannes

Und diese Schnelligkeit, die hat der Dominik schon angesprochen, es ist sehr schnell.

Johannes

Das heißt, es ist O von 1.

Johannes

Jeder Zugriff dauert immer gleich lang, amortisiert.

Johannes

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.

Johannes

Dann kann es schon sein, dass es eine Weile dauert, aber amortisiert ist es O von 1, jeder Zugriff.

Johannes

Das heißt, jeder Zugriff dauert im Schnitt

Dominik

gleich schnell.

Dominik

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

Nee, das bedeutet im Schnitt.

Dominik

Im Schnitt amortisiert.

Johannes

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

Johannes

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

Dominik

Diesen Worttransfer von amortisiert auf dem Schnitt hinbekommen.

Wenn du

Johannes

eine große Anzahl Zugriffe machst, dann ist die Dauer so, als ob du

Dominik

alles okay, genau, weil das Umbauen quasi Grenzwert 0 hat.

Johannes

Das Umbauen passiert selten genug.

Dominik

Genau, dass es der Grenzwert 0 hat in der Bitte erteilt und O von 1.

Dominik

Also O von 1 bedeutet, es ist ein Problem.

Johannes

O von 1 schreiben.

Johannes

Also wenn ich ein Element einfüge, dann dauert das O von 1 und wenn ich ein Element rauslese, dauert das auch O von 1.

Johannes

Und beim Lesen ist es immer O von 1.

Johannes

Also das ist nicht nur amortisiertes O von 1, sondern das ist Ofen 1.

Dominik

Also das heißt tatsächlich, also um nochmal einhören, das so ein bisschen näher zu bringen, dieser Zeitnotation Big O noch nicht so viel anfangen kann.

Dominik

O von 1 bedeutet, es dauert quasi keine Zeit, das zu tun.

Es dauert immer gleich lang.

Jochen

Es ändert sich nicht mit der Menge der, also normalerweise, wenn du jetzt sagen, O von 1 im Vergleich zu O von N, ist jetzt bedeutet, dass sozusagen, wenn deine, äh, deine Eingabedatenmenge halt nicht N ist, dann wenn du eine Hashmap hast, dann ist es halt immer noch O von N immer noch konstant.

Dominik

Genau, aber das ist.

Jochen

Bei was anderes, 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 wolltest, haben wolltest oder nicht.

Dominik

Aber O von 1 bedeutet halt, ich kann halt nichts machen.

Dominik

Also es ist halt so.

Dominik

Genau.

Dominik

Das heißt, also auch egal, ob kleine oder große Datenmengen völlig wurscht, was da passiert.

Dominik

Und das halt quasi in meiner Berechnung, ob ich da irgendwas algorithmisch verbessern kann zu vernachlässigen, weil das keine Rolle spielt, ob das muss halt einfach so.

Ja, genau.

Johannes

Und das ist was ganz Witziges.

Johannes

Ich hatte mal in der Python-Schulung einen Teilnehmer, der da auch gut mitgemacht hat, und der war empört darüber.

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

Das kann gar nicht sein.

Johannes

Und dann haben wir tatsächlich einen kleinen Benchmark geschrieben 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, wie sich diese Laufzeiten verhalten.

Johannes

Wie lange es dauert, 1000 Einträge einzufügen und 10.000 Einträge einzufügen und 100.000 Einträge einzufügen und die dann auch wieder rauszulesen im Vergleich zu einer Liste.

Dominik

Also einfach quasi, du hast einfach quasi die Keys mit Brackets dann gesetzt in einer Schleife oder was?

Genau, ja.

Johannes

Genau, und hab einfach die Zahlen von 1 bis 10.000 als Key und als Value, das spielt ja keine Rolle, ja, wenn die nur die Größe wissen wollen.

Johannes

Das ist dann ein sehr unnützes Dictionary, weil das halt einfach immer sagt, zum Key 1 gehört der Wert 1 und zum Key 10 gehört der Wert 10.

Johannes

Aber wenn es nur ums Benchmarken geht, dann ist das eine einfache Sache.

Johannes

Und bei einer Liste genauso, einfach mal Listen, eine Liste aus zwei Tupeln zusammengebaut.

Johannes

Und dann in diese Liste einen bestimmten Eintrag suchen, ist halt O von N, weil durch diese Liste von vorne bis hinten durchgegangen werden muss.

Johannes

Und wenn ich jetzt den Eintrag 100 suche, dann muss ich halt das erste Element angucken und fragen, ist das eins?

Nein.

Johannes

Dann das zweite Element, ist das eins?

Johannes

Nein.

Johannes

Und das muss ich dann 99 mal machen und beim 100.

Johannes

sage ich, ist das Element 100.

Und dann sage ich ja und dann bin ich fertig.

Johannes

Bei einem Dictionary, Hash Map, wir sprechen gleich, wie das funktioniert.

Im Moment, Magie.

Johannes

Dann passieren halt zehn Rechenschritte und dann steht da, okay, du hast dir zu 100, hast du dir 100 gemerkt.

Johannes

Und es spielt keine Rolle, ob das Dictionary einen Eintrag hat, nämlich nur diese 100 oder ob es eine Million Einträge hat.

Johannes

Das ist immer gleich schnell.

Dominik

Genau, aber was jetzt da interessant ist, hat zwei Dinge.

Dominik

Also erstens, wie man dann, also das ist halt eigentlich halt ein Datentyp, aber wie man dann in der Liste das vielleicht schneller suchen könnte.

Dominik

Weil also theoretisch könntest du ja in der Liste quasi auch daraus eine Hashtable bauen, irgendwie aus allen Einträgen dieser Liste und einfach dann nachgucken, wenn die Hashtable sind, diese Datentypen oder sowas, ja, genau.

Dominik

Und dann halt überlegen sich irgendwie einen Algorithmus, wie man relativ schnell die Dinge in dieser Liste findet, ohne dass man halt über die ganze Liste iterieren muss.

Jochen

Ja, aber da brauchst du eine andere Datenstruktur.

Jochen

Wenn du nur die Liste hast, dann musst

du nicht sagen.

Dominik

Genau, aber ja, genau.

Johannes

Die Liste an sich garantiert dir das nicht.

Johannes

Garantiert dir nur, das sind Elemente in einer Abfolge.

Dominik

Die nächste Frage wäre jetzt, wie halt in das Dikt, was ja auch im Prinzip eine Liste von Keys ist, jetzt erstmal so in der Synth, wie das dann in den Speicher so reinkommt, dass man diesen Lookup machen kann, dass man halt quasi aus dem Wert des Keys eine Speicheradresse bekommt, quasi.

Dominik

In die man dann halt reintritt.

Ich möchte noch dazu sagen, ja.

Johannes

Ich möchte noch dazu sagen, du hast jetzt gesagt, das ist eine Liste von Keys.

Johannes

Das ist so, dem stimme ich so nicht ganz zu.

Johannes

Es gibt nämlich da drei Ansichten drauf.

Jochen

Es gibt die Keys.

Johannes

Das ist ein Set, das ist eine Menge.

Johannes

Die hat auch keine Reihenfolge.

Schon, aber früher nicht.

Dominik

Also hat eine Reihenfolge.

Johannes

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

Dominik

Die Reihenfolge, die sie reingeschrieben wurden sind, liest sie nicht.

Johannes

Ja, das ist die Reihenfolge, die jetzt halt irgendwann dazukommen sind, aber sagen wir mal, wenn wir ein Dikt von Python 3.4 nehmen, dann hat es keine Reihenfolge.

Dominik

Also in Python 3.5 kam ein Order-Dickt.

Jochen

Nee, also ein Order-Dickt gab es schon immer, aber

Standard, die Pets.

Jochen

Dass das sortiert ist, es 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.

Okay.

Johannes

Aber wenn man sich so ein ursprüngliches Dikt mal anschaut, dann sind die Keys eigentlich ein Set.

Johannes

Die haben keine Reihenfolge in dem Sinne und die kann auch keine Duplikate enthalten.

Johannes

Und das ist genau das, was eine Menge ausmacht, ja,

ein Set.

Dominik

Hatte quasi ein Set auf Sorted Set.

Johannes

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

Johannes

Dann gibt es die Values, das ist auch ein View auf diese Daten, die in dem Dictionary drin sind.

Johannes

Das sind halt die Werte, die da gespeichert sind.

Johannes

Das ist im Wesentlichen eine Liste.

Die Liste der Werte.

Und dann gibt es noch die Items.

Johannes

Das ist eine Menge aus Tupeln, die jeweils Key und Value enthalten.

Johannes

Und für mich sind die Items so ein bisschen das, was das Dictionary ausmacht.

Johannes

Das ist das, was da drin ist.

Dominik

Also das kann man ja nicht.

Dominik

Genau, damit kann man ja quasi auch über so ein Dictionary iterieren oder sowas.

Dominik

Dann kannst du halt erstmal mit Mode.notated aufrufen und dann kannst du quasi for Key Value in Dick Dot Items, bla.

Johannes

Genau, for Key Value in Dict-Items.

Johannes

Das ist so ein Muster, das sieht man ganz häufig, weil man da einfach quasi durch das gesamte Dictionary durchgeht.

Johannes

Man könnte auch sagen, for Key in Dictionary und dann sich jeweils den Value holen, weil es ist ja O von 1.

Johannes

Das kostet ja so gesehen algorithmisch nichts.

Naja, sagen wir so, wenn du das kostet Ausführungszeit.

Jochen

Wenn du da eine Vorschleife machst über alle, dann ist das halt schon O von N sozusagen.

Johannes

Ja, genau.

Jochen

Nur im Einzelfall halt nicht.

Dominik

Aber die Value nochmal rauszuholen, wenn du Key schon hast.

Johannes

Genau, also die O-Notation von for Key Value in Dict Items irgendwas tun und for Key in Dictionary und dann den Value als Dict von Key holen, ist identisch.

Johannes

Aber die Laufzeiteigenschaften sind natürlich für den zweiten Fall schlechter, weil ich dann jedes Mal nochmal in das Disdictionary rein muss.

Johannes

Natürlich nur für einen konstanten Faktor.

Jochen

Ja, aber der Summe zählt halt auch auf.

Johannes

Aber konstante Faktoren, ja, konstante Faktoren sind.

Johannes

Also wenn etwas nur zehnmal langsamer ist, das ist auch ein konstanter Faktor, das

Jochen

macht schon einen Unterschied.

Ist schon ein Unterschied, ja.

Jochen

Genau.

Wie kann man denn dicks bauen?

Wisst ihr das?

Johannes

Es gibt, ich habe vorhin einen ganz coolen Trick gelernt.

Johannes

Es gibt ja mehrere Wege, Dictionaries zu bauen.

Dominik

Ja, was meint ihr?

Dominik

Syntaxmäßig jetzt geschreifte Kammer.

Dominik

Also du kannst es natürlich einmal machen als Dictionary Comprehension, indem du sagst, geschweifte Klammer, Key Value, fortgeschrittener Stuff.

Dominik

Oder du machst halt einfach die Definition einfach in den eckigen Klammern, schreibst dann eine Key in die Value hinter.

Dominik

Oder du schreibst eine Liste von Keys und Values mit Gleichzeichen dahinter und machst dann ein Dick draus.

Dominik

Also Dikt-Off.

Ja genau, das ist der normale, also das ist der Konstruktoransatz.

Johannes

Du kannst die Keys auch in einer Schleife einfach hinzufügen oder hinzufügen.

Ja, genau hinzufügen.

Dominik

Du kannst auch irgendwie, du kannst an durch halt Tupel-Unpacking oder sowas, die ganzen direkte reingeben mit so Sternchen, Sternchen, Halbparksyntax.

Johannes

Beziehungsweise wenn du eine Sequenz von Tupeln reingibst von zwei Tupeln, dann nimmt

er die automatisch.

Jochen

Eine Methode, die ich gerne verwende, ist Dikt.fromKeys.

Dominik

Was macht das?

Jochen

Naja, du gibt es halt eine Liste von Keys und dann halt vielleicht einen Default-Wert oder so und dann erzeugt er das Ding dann raus mit diesem einen Factory-Methodenaufruf von dem Dikt.

Dominik

Default-Dikt gibt es noch irgendwie, ne?

Jochen

Das heißt, was anderes.

Da müssen wir nachher müssen wir

nachher noch drüber sprechen.

Johannes

Das ist nämlich auch eine spannende Sache.

Johannes

Ich möchte noch einmal kurz zu der Comprehension zurückkehren, weil die ist nämlich was sehr, sehr, sehr Cooles.

Johannes

Und die ist was, was auch für Leute, die das nicht kennen, super schwer zu verstehen.

Johannes

Diese Dictionary Comprehension ist eine der coolsten Wege, die es gibt, so ein Dictionary zu bauen, weil das halt im Wesentlichen diese Schleife, die man dazu braucht, in das Dictionary reintut.

Johannes

Also in die Konstruktion.

Und das ist was sehr, sehr mächtiges.

Johannes

Die Syntax davon jetzt hier im Podcast zu besprechen, ist vielleicht nicht so gut.

Jochen

Nee, macht nicht so viel Sinn, dann muss man sich angucken.

Da 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 Dikt-Zip.

Johannes

Also wenn ich eine Liste von Keys habe und eine Liste von Values.

Dominik

Dann kannst du die zippen und dann machen die zippen und dann einen Dictionary draus machen.

Dominik

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

Johannes

Das geht nur.

Zip nimmt auch unterschiedlich lange Listen.

Naja, 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 die Values, aber in zwei Händen und mit Zip kannst du sie in eine schöne Reihenfolge bringen, die das

Dictionary drin.

Dominik

Einmal Reisabschluss, bitte.

Netter Trick.

So, wie kann man denn da Sachen wieder rauskriegen?

Dominik, weißt du?

Johannes

Ich frag dich jetzt ab, ich finde es total gut.

Dominik

Was meinst du?

Johannes

Wie komme ich an die Werte wieder drin?

Dominik

Ja, du kannst einfach den.

Johannes

Wenn ich jetzt einen Telefonbuch habe, wie kriege ich deine Telefonnummer raus?

Dominik

Du machst halt zum Beispiel entweder ein Get oder halt mit der Bracket-Syntax ziehst du einen Key-Saint-Serie.

Wie ist das da der Unterschied?

Dominik

Bei Get kriegst du einen Default-Wert zurück und du kriegst einen Error, wenn du da rausversuchst, ein Key zu lesen, den es nicht gibt.

Johannes

Genau, wenn du es mit eckigen Klammern machst, kriegst du im besten Fall einen Key-Error.

Genau.

Johannes

Der heißt tatsächlich Key Error.

Johannes

Also wenn man das abfangen möchte, gibt es

Dominik

das heißt.

Genau.

Dominik

Also und beim Get kannst du halt an den Default dann dranhängen.

Es gibt noch zwei andere coole Attribute.

Dominik

Ich kann die Frage beantworten, ja.

Johannes

Es gibt noch zwei andere coole Attribute, die heißen Pop und Pop-Item.

Johannes

Und die sind quasi destruktiv, die sind destruktiver Zugriff.

Genau.

Wie aus der Liste, Punkt Pop entfernt Dominik,

Johannes

dann heißt es, entferne den Eintrag für Dominik, aber gib mir den Wert auch noch zurück.

Dominik

Wie bei einer Liste.

Wie bei einer Liste, genau.

Johannes

Also ja gut, halt mit diesem Key-Zugriff.

Johannes

Ich muss bei Pop muss ich immer den Key sagen, bei einer Liste müsste ich den Index sagen.

Dominik

Genau.

Dominik

Also er gibt dir den ersten Wert, was natürlich beim Dick nicht geht, weil das nur einer hat.

Genau.

Johannes

Das heißt, Dick.pop muss immer einen Key haben.

Johannes

Es gibt da keinen ersten oder letzten oder wie auch immer.

Also das kann ich nicht machen.

Johannes

Aber es gibt Pop-Item.

Johannes

Und Pop-Item, das macht LIFO, last in, first out.

Johannes

Das heißt, es gibt dir tatsächlich den letzten Eintrag, der hinzugefügt wurde, zurück als Item.

Jochen

Das ist natürlich interessant.

Jochen

Da kann man bescheiden.

Also Key und Value.

Jochen

Das ist schon sehr cool.

Johannes

Das heißt, du kannst so eine Wild-Schleife machen und kannst dieses Dictionary sozusagen abarbeiten.

Ja.

Johannes

Und hast dann so eine Art Dictionary Keue.

Johannes

Und das ist eine praktische Sache, die ich erst heute gelesen habe.

Ja, sehr schön.

Jochen

Ne, habe ich auch so noch nicht verwendet, aber da fallen mir auch direkt viele Sachen zu ein, die man damit coolerweise cool machen kann.

Jochen

Ja.

Johannes

Wo man so ein Dictionary zerlegen kann.

Jochen

Ja.

Jochen

Ja, man, also es gibt noch, ähm, es gibt auch noch Set-Default.

Jochen

Das ist, ähm, ich weiß nicht, ob man das Leute überhaupt erzählen sollte, dass es die Methode noch gibt.

Johannes

Das darf man nicht sagen.

Jochen

Darf man nicht sagen, naja, die ist eigentlich nicht gut.

Jochen

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

Jochen

Ja, stimmt.

Jochen

Wo ich anfange, das erklärt, fällt mir schon ein, das ist vielleicht keine gute Idee.

Johannes

Es ist, glaube ich, besser, da direkt ein Default-Dikt zu hören.

Jochen

Ja, genau.

Jochen

Das ist auch die Empfehlung, sollte man halt heutzutage eher Default-Dickt.

Oder Get.

Johannes

Ein Get und dann den Wert setzen.

Wo ist denn das?

Dominik

Get und Wert setzen und Default-Dickt.

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

Dominik

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

Johannes

Ein Default-Dickt ist ein Dictionary, eine Unterklasse von Dictionary.

Dominik

Das keine Keys hat, aber wenn du einen Key abrufen willst, den es noch nicht gibt, dann gibt dir den Default-Wert zurück.

Johannes

Genau.

Johannes

Du sagst ihm, welchen Standardwert es haben soll und wenn du einen Key abrufst, den es noch nicht gibt, kriegst du den Standardwert.

Johannes

Oh, es gibt drei große Varianten davon.

Johannes

Die erste ist die Lambda-Variante, wo du halt eine Funktion reingibst, die dann diesen Standardwert erzeugt.

Johannes

Und das ist sozusagen die allgemeine, ja.

Johannes

Das ist Default-Dickt.

Johannes

Du musst dem Default-Dikt irgendeine sogenannte Factory geben, damit er diesen Wert erzeugen kann.

Johannes

Und da kannst du jede beliebige Funktion reintun, meistens ist das halt irgendeine kleine Lehrerinderation.

Johannes

Aber es gibt schon zwei Funktionen, die du da verwenden kannst, nämlich List und Int, die nützlich sind.

Johannes

Also wenn du ein Default-Dikt Klammer auf Listklammer zumachst, dann heißt das, das ist ein Dictionary und wenn du deinen Key abrufst, dann gibt er dir, wenn du noch nichts eingefügt hast für diesen Key, eine leere Liste zurück.

Johannes

Eine neue leere Liste.

Johannes

Und genauso für Int, wenn du ein Default-Dikt Int hast, dann kannst du jeden beliebigen Key abrufen und kriegst 0 zurück.

Dominik

Du kannst einen Counter machen, dass du immer halt get auf hast.

Johannes

Ja, aber Counter gibt es auch.

Jochen

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

Johannes

Und die ist richtig cool, diese Counter-Klasse.

Die müssen wir jetzt auch gleich noch.

Johannes

Das müssen wir auch klar noch besprechen.

Johannes

Okay, wofür würde ich Default Dikt verwenden?

Johannes

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

Dominik

Aber wenn dann nochmal, wenn du das gleiche, nochmal auch muss, gibt man natürlich dann den neuen Wert zurück, ne?

Johannes

Genau, also wenn du einen Wert in dieses Dictionary, in dieses Default-Dikt reinspeicherst, dann ist es wie ein normales Dictionary, ja.

Johannes

Also wenn es diesen Key schon gibt, dann kriegst du das, was da gespeichert wurde.

Johannes

Das kann auch was anderes sein als ein Int oder eine Liste.

Johannes

Das heißt, es ist nicht eine Typisierung, sondern das ist nur so dieser Fallback.

Dominik

Da ist nochmal noch eine Zwischenfrage, kleiner Expos.

Dominik

Wenn ich jetzt da einen Get mache auf so eine Liste, ja, auf so einen Default-Dikt von der Liste.

Dominik

Und ich habe dann eine leere Liste in der Hand und ich schreibe in die was rein.

Dominik

Beim nächsten Mal auf denselben Key, gibt dir mir dann diese Liste, in der was drin ist.

Oh.

Warum nicht?

Johannes

Das wäre das, was ich Jochen vorher gesagt hätte.

Johannes

Das wäre Set Default.

Ah.

Johannes

Weil du beim Abrufen entweder den Wert kriegst, der in der Liste, der in dem Dictionary drin ist, 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, dass dann das Objekt der Liste dann doch schon gibt und dass das Objekt dieser Liste auf das dann ja.

Johannes

Ja, aber die wird nicht in das Dictionary abgelegt.

Du musst

Dominik

nicht tatsächlich zuweisen, die du nur das

in der Hand hast.

Johannes

Und du musst die dann tatsächlich zugreifen zuweisen.

Johannes

Wenn du das möchtest, dass du eine Liste abrufst und die dann bearbeiten kannst, dann musst du Set Default machen.

Johannes

Und Set-Default heißt, ruf einen Key ab, wenn es denen schon gibt, gib mir das, was da drin ist.

Johannes

Ansonsten setze in dem Dictionary den Wert, den ich dir da als Default angebe und gib ihn mir zurück.

Dominik

Okay.

Dominik

Ja, das dachte ich, dass wäre das, was Default-Dickt so machen würde.

Dominik

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

Johannes

Genau, dafür müsst ihr das Set-Dafault machen.

Jochen

Ja, aber es ist die Funktion Set-Default, also sie ist in mehrerer Hinsicht verwirrend, sie ist auch verwirrend benannt, wie man jetzt auch gerade wieder sehen könnte.

Jochen

Und vielleicht sollte man das echt mehr machen, weil tatsächlich, wenn man es aber Default Dikt macht, ist es sauberer.

Jochen

Und ja, genau, was ich noch anmerken wollte zu den Factory-Funktionen, die man übergeben muss.

Jochen

Also es kann eine beliebige Funktion sein.

Jochen

Die einzige Bedingung ist, sie darf keine Argumente nehmen.

Jochen

Wenn man jetzt so mehrfach verschachtelte Geschichten baut, das geht.

Jochen

Aber das wird dann auch relativ schnell relativ unübersichtlich.

Jochen

Ich habe noch keine gute Lösung dafür, aber das ist, dann muss man halt da, das sieht dann komisch aus.

Dominik

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

Dominik

Also Factories möchte man ja gerne mal auf eine bestimmte Art Weise initialisieren.

Dominik

Das muss man ja irgendwie von einer Default-Factory alles schon erben und muss das dann irgendwie

curried sein.

Jochen

Ja, aber da gibt es etwas, also zumal, wenn man jetzt bei unterschiedlichen Keys unterschiedliche Sachen machen möchte.

Jochen

Es kann ja manchmal sein, dass du sagst so, wenn ich diesen Key habe, okay, dann möchte ich ja gar keine Liste dazu machen, sondern was ganz anderes oder so.

Jochen

Und dann geht das mit dem Default-Dick ja alles so nicht mehr so richtig.

Jochen

Eben deswegen, weil man kann halt nicht ein Argument angeben, was man dann.

Jochen

Also das ist, das geht ja nicht mehr.

Jochen

Da gibt es aber auch etwas sehr Cooles, was ich auch erst in der Vorbereitung, ich habe ja einfach nochmal geguckt, was zu dieser Episode habe ich mir nochmal so ein bisschen angeguckt, was habe ich denn an Literatur zu Dicts, steht da irgendwas Interessantes drin und habe tatsächlich etwas gefunden, was ich noch nicht wusste, wo ich auch sagen würde, oh cool, dass ich das jetzt weiß.

Jochen

Und zwar gibt es Danda Missing als sozusagen Spezialmethode, die man überschreiben kann, wo man dann den Key bekommt.

Das ist quasi der Key-Error.

Jochen

Du kannst ja einen Key-Eror überschreiben.

Dominik

Und macht dann Default-Tickt, mache ich dann eine neue Klasse, die von Default-Tickt erbt und überschreibt dann dann dann Missing und guckt dann mit einem Match-Case-Statement, was da drin ist.

Jochen

Oder man kann, also du kannst von Default-Ticket erben, na klar, aber dann, also das musst du dann ja im Grunde nicht mehr.

Jochen

Wenn du die Methode überschreibst, dann bestimmst du ja selber, was passiert.

Jochen

Und da kannst du alles.

Das ging früher übrigens auch nicht.

Johannes

Ich konnte früher nicht von dict erben, deshalb gibt es noch eine Klasse, die User-Dickt heißt.

Achso, das heißt

Dominik

tatsächlich, ich mache tatsächlich sowas ähnliches wie User-Dict und ich mache eine neue Klasse auf die App einfach von Dict.

Dominik

Und da überschreibe ich dann nur die Missing-Methode und dann gucke ich halt, was er statt dem Key-Error drauszugeben, dass er dann tatsächlich irgendwas Neues anstellt.

Jochen

Ja, das würde auch tatsächlich funktionieren, aber es wird, diese Diskussion hatten wir in dem PDF, also Python-User Group Düsseldorf-Channel auch vor kurzem, ob es denn okay ist, von Dikt zu erben oder wenn man lieber von User-Dict erben soll oder so.

Jochen

Und ich hatte das halt noch so im Hinterkopf, dass man von Userdikt erben soll und nicht von Dict.

Jochen

Und tatsächlich habe ich jetzt auch nochmal nachgeguckt, und nee, man soll von Userdikt erben und nicht von dict.

Jochen

Also man kann das ja zwar jetzt.

Warum?

Johannes

Was ist da

der Unterschied?

Jochen

Also der entscheidende Unterschied, warum das unter Umständen einem Problem machen kann, ist, dass bestimmte Methoden halt, also Missing ist jetzt, die funktioniert, die kann man überschreiben, aber bestimmte andere nicht.

Jochen

Und wenn du dann dickt auf bestimmte andere Arten, wenn du da Sachen mitmachst, dann geht das an den Methoden, die du überschrieben hast, vorbei.

Jochen

Das heißt, wenn du von Dikt, Dikt von dem Bild entdikt herbst und dann überschreibst du halt irgendeine Methode und denkst, ja, müsste doch funktionieren, dann funktioniert es manchmal halt vielleicht nicht, weil zum Beispiel, also auch der Konstruktor davon ist halt so, der schreibt das halt irgendwie direkt, der geht nicht über die Set-Item-Get-Item-Geschichten, die es da halt normalerweise gibt.

Jochen

Das heißt, dann verhält sich das Ding unter Umständen unerwartet.

Jochen

Und ja, Laufzeitverhalten ist auch so ein bisschen anders.

Jochen

Also, und ja, das habe ich jetzt aber auch wieder vergessen.

Jochen

Also es war auch irgendwie, es ist eine wichtige Geschichte, warum das, wenn das ein Data-Attribut ist und sozusagen die Zugriffe dahin nur delegiert werden, das macht auch irgendwie, ich glaube, es kann sogar sein, dass das der Grund ist, weshalb man Z-Item-Get-Item dann überhaupt quasi richtig überschreiben kann.

Jochen

Ja, genau, genau.

Jochen

Und daher sollte man, wenn man das selber, wenn man erben will und will Sachen überschreiben, dann lieber Userdikt nehmen, statt einfach vom Bild enterben.

Also, also User Dict

ist quasi eine Klasse, die das gleiche Interface hat wie Dictionary.

Ja.

Johannes

Aber eben ein Attribut heißt, das heißt Data.

Johannes

Und das ist ein Dictionary und einfach alles durchreicht an dieses Data.

Genau.

Johannes

Und das bedeutet, dass wenn ich von Userdict ableite, kann ich jede beliebige Methode überschreiben und die wird dann auch korrekt aufgerufen, auch Konstruktor und

alles mögliche.

Jochen

Genau.

Jochen

Ja.

Ja, okay, wusste ich auch nicht.

Ich wusste nicht, dass es da Unterschiede gibt.

Jochen

Ja, es ist immer wieder interessant, auch wenn ich dachte, also ich meine, das verwendet man ja jeden Tag und irgendwie schon ganz lange und so.

Jochen

Und dann muss man sich so, da kann ja eigentlich nichts Neues mehr, aber manchmal so.

Johannes

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

Dominik

Also generell von Build-Ins, so Sachen fühlt sich immer so ein Stringpommel.

Ist nicht so häufig.

Johannes

Die sind einfach gut genug.

Beziehungsweise, wenn man eine neue Datastruktur schreibt, dann benutzt man normalerweise eben eine und leitet nicht direkt davon ab.

So ist meine Erfahrung.

Dominik

Instanziert die dann irgendwie so mit so einem Injector-Pettern oder sowas, dass man die halt dann beim Putz hat.

Johannes

Genau, dieses Data, dass du halt sagst, okay, mein Baum ist eigentlich eine Liste, aber ich habe eine Liste, die das macht.

Johannes

Ich habe nicht das Interface von Liste geerbt, sondern ich habe halt eine in der Hand, die das macht.

Johannes

Ja, das ist so meine Erfahrung.

Johannes

Ich weiß nicht, wie ihr das seht.

Jochen

Doch, doch, nee, ich sehe das, sehe das ganz genauso.

Jochen

Achso, das ist, genau, das ist auch noch der eine der Grund dafür, warum das mit dem Delegieren eine gute Idee ist, weil halt ansonsten, wenn du direkt erbst, dann hat dein Objekt eine ganze Menge Methoden, die halt unsinnig sind unter Umständen.

Jochen

Also in einem Kontext, wo man sich dann fragt, wenn man so dir macht auf dein Objekt.

Jochen

Und dann sieht man halt einen ganzen Haufen komisches Zeug, wo man sich da so, hä, warum ist das denn alles da drin?

Jochen

Was man halt einfach so mitbekommt, wenn man das, wenn man da direkt erbt.

Jochen

Also, ja.

Dominik

Also wir müssen noch so ein paar Sachen, ich habe erstmal eine Notizenliste, ist gerade leider gerade leer gegangen, aber.

Jochen

Da ist so ein Ladegerät und da ist ein, das kann man das ganze Telefon anschließen.

Dominik

Oh, du hast USB-C?

Dominik

Wow.

Johannes

Nee, das ist sogar als Apple House halt USB-C.

Jochen

Ja, ja, so braucht man das schon.

Cool.

Johannes

Es gibt eine Methode, es gibt eine Methode in Dictionaries, wo wir gerade über das Dictionary-Interface sprechen.

Johannes

Die ist in 3.9 dazugekommen.

Johannes

Es gibt eine in 3.9 hat sich das Dictionary-Interface verändert.

Okay.

Johannes

Und zwar ist der Pipe-Operator dazugekommen.

Jochen

Ah, richtig.

Jochen

Ja, klar, natürlich.

Johannes

Und das ist sowas, was, wenn man das braucht, dann ist das ungeheuer wichtig.

Johannes

Und wenn man es nicht braucht, dann ist es so, okay.

Johannes

Nie gedacht, dass man, dass jemand sowas brauchen könnte.

Johannes

Das ist Dictionary-Vereinigung.

Dominik

Ja, Unions zwischen Dikts.

Jochen

Genau.

Johannes

Dann gibt es jetzt den Operator dafür.

Johannes

Früher musste man immer, jede von uns hat so eine Sammlung von Tricks, wie man Dictionaries vereinigt.

Ja, das ist ganz einfach mit Sternstern und unter Dictionary und das gibt es jetzt als Operator.

Johannes

Und auch mit Pipe gleich.

Johannes

Also man kann auch gleich rein vereinigen.

Johannes

Wobei das einfach ein Update ist, meiner Meinung nach, oder?

Jochen

Oh, das würde ich jetzt ausprobieren, das weiß ich auch nicht.

Jochen

Aber stimmt, ich wusste, dass das passiert ist.

Jochen

Ich habe es aber nie verwendet, seitdem daher ist es mir jetzt gar nicht mehr bewusst, dass es alles gar nicht so gut ist.

Dominik

Ein Update ist halt Julian.

Dominik

Ist es exklusiv, ist die Frage.

Johannes

Es ist immer exklusiv, weil du ja keine Keys

verdoppelt hast.

Dominik

Ja, aber dann geht das nicht mit dem Update, weil bei Update werden ja nur die Keys geupdatet, die in dem Update enthalten sind.

Nee, doch.

Johannes

Dictionary Punktupdate übernimmt alle Keys und Values aus dem Update-Book-System.

Genau, aber die, die es noch nicht drin waren, was da drin ist.

Dominik

Genau, aber wenn welche vorher schon drin waren und die dann überschrieben werden.

Dominik

Genau, aber wenn die vorher schon drin werden, die sind.

Dominik

Nein, aber wenn die vorher schon drin waren und nicht in dem Neuen drin sind, dann sind die, wie sie vorher waren.

Dominik

Aber wenn du den Unit-Operator gleich machst, dann sind sie eben nicht mehr drin.

Dominik

Weil sie halt nicht in dem Update sind.

Das verstehe ich jetzt nicht.

Dominik

Okay, du hast zwei einigermaßen des Jungs-Dicks.

Du hast D1 und D2.

Dominik

Genau, das sind zwei einigermaßen des Dinge Dicts.

Dominik

Und das sind irgendwie zwei Keys gleich.

Dominik

Wenn du jetzt mit dem Update machst, werden die zwei gleichen Keys in dem ersten Dictionary überschrieben.

Dominik

Wenn du das, ne?

Erstes Dikt-Update.

Dominik

Wenn du aber die Union machst, erstes Ding, das zweite Mann.

Dominik

Nein, dann sind nur noch die zwei Keys drin.

Jochen

Nee, das kann ich.

Johannes

Nee, das wäre ja komisch.

Johannes

Das wäre ja der Schnitt, nicht die Beinigung.

Dominik

Achso, stimmt.

Ein Schnitt kann es nicht.

Gibt es nicht auch den Schnitt?

Das gibt es nur bei Set.

Jochen

Bei Set gibt es das UNT-Apparator.

Dominik

Gibt es nicht auch die Intersector?

Johannes

Set.Intersect.

Johannes

Ne, für Dickness gibt es keine Intersector.

Dominik

Okay, schade eigentlich.

Dominik

Weil das wäre doch eigentlich sehr logisch, dass das mit dem.

Johannes

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

Diktator sind.

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 dickt und dann hast du die Unions direkt.

Dominik

Das wäre doch schön Syntax schwer.

Ich probiere

Jochen

das mal in der Odel aus.

Ja, mach mal.

Union ist oder

Johannes

und das ist einfach die Vereinigung.

Johannes

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

Johannes

Ja, okay.

Johannes

Mit den Werten aus dem jeweils letzten.

Dominik

Mach mal und, und, Fitter.

Jochen

Nee, das geht nicht.

Jochen

Ne, und und geht schon mal gar nicht.

Die Python sowieso nicht.

Und und geht nicht.

Jochen

Dann sagt er Unsupported Operant Type.

Dominik

Bitwise geht auch nicht, oder?

Ja, okay.

Jochen

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

Ja, okay.

Jochen

Wohingegen bei Set, wenn man das jetzt so macht?

Johannes

Bei Set

gibt es Intersect.

Johannes

Es gibt Set.intersect, es gibt Z.U.

Johannes

Union und es gibt Z.

Johannes

Es gibt noch eine dritte, Difference.

Jochen

Symmetric Difference oder sowas, ja, genau.

Ja, Symmetric Difference ist ja das Minus, das andere Plus, das andere Minus das ein.

Dominik

Oh mein Gott, dass er Intersect nicht hat.

Dominik

Warum hat er das denn?

Dominik

Also bei Set, dass bei Set geht, aber bei Dix nicht.

Dominik

Das müsste ja irgendwann mal reinkommen.

Jochen

Die Frage ist, was soll denn, wie sollen denn dann die Values aussehen bei einer Intersection der Keys?

Jochen

Welche nimmst du denn dann?

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, es müsste anders sein und dann wundert man sich halt, was passiert, was man.

Jochen

Also, ja,

Johannes

eigentlich müsstest du den Schnitt über die Keys machen und dann entscheiden, aus welcher Quelle du

dir die Value nimmst.

Dominik

Das ist halt quasi wie beim Update.

Dominik

Mit Exclude oder sowas.

Dominik

Kann man das machen mit Exclude?

Nee.

Auch doof.

Dominik

Ja, also was mir jetzt aber, es ist irgendwie relativ ähnlich zu dem, was man irgendwie bei den neuen Sachen hat, wie mit Data Classes oder Pydentic oder sowas, oder was gibt es denn noch?

Dominik

Alles Atolls oder sowas?

Jochen

Also was diese, ja, oh, es gibt auch noch NemedTuple ist.

Ja, genau, named Tupel.

Das ist auch spannend.

Johannes

Warum denn Nameduple?

Jochen

Ja, das ist ein total komischer Name dafür.

Jochen

Ich weiß auch nicht.

Dominik

Um Dot-Notate-Zugriffe auf irgendwelche Objekte zu haben für die einzelnen.

Johannes

Okay, aber dann, also was ist denn der Unterschied zwischen einem Dictionary und einer Klasse?

Johannes

Weil bei einer Klasse habe ich auch Namen drin, Punkt irgendwas.

Du hast auch irgendwie.

Johannes

Und da ist genau ein Wert dazu drin.

Dominik

Du hast so ein Konstruktor und irgendwie noch.

Jochen

Ja, gut, aber das ist ja, da muss man.

Johannes

Der Konstruktor ist nur eine Konvention.

Jochen

Du kannst auch deine Sachen anders konstruieren, genau.

Jochen

Also ich würde sagen, es gibt keinen großen Unterschied.

Jochen

Tatsächlich ist es eine sehr ähnliche Geschichte und ich glaube, ich meine, es ist ja auch so, dass wir nicht so gut.

Jochen

Genau, genau.

Jochen

Also in Python-Ojekte, das sind halt Dikts, sozusagen, was ihre Struktur angeht, ja.

Johannes

Mit ein kleines bisschen Syntax dazu.

Jochen

Genau.

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 die Values in dieser Instanz sind.

Johannes

Also eine Instanz ist immer ein Dictionary in Python.

Johannes

Das ist irgendwie komisch oder seltsam.

Johannes

Gerade wenn man von anderen Programmiersprachen kommt, weil in anderen Programmiersprachen ist es ja nicht so.

Jochen

Weiß ich nicht.

Jochen

Also ich würde gerade sagen, bei dem, was üblicherweise so als Skriptsprache, als Skriptsprache, quasi Skriptsprache.

Johannes

Vielleicht schon.

Jochen

Da ist das auch, also bei JavaScript, da heißen die Dinger sogar Object.

Johannes

Vielleicht ist das das entscheidende Merkmal.

Jochen

Ja, vielleicht, ich weiß nicht.

Johannes

Eine Skriptsprache.

Jochen

Also bei Perl war das auf jeden Fall auch so.

Jochen

Da waren auch, also ich meine, das hat ja keine Offenheit.

Johannes

Bei dynamischen Klassen und dynamischen Instanzen geht es ja quasi nicht anders.

Johannes

Du musst ja quasi diese Zuordnung haben von Attributname zu irgendeinem Wert.

Johannes

Aber bei kompilierten Sprachen ist das ja anders.

Nee, da ist das anders, genau.

Johannes

Bei kompilierten Sprachen musst du es nur während der Kompilierungszeit machen und dann kannst du sagen, okay, das Attribut mit dem Namen X ist halt Feld Nummer 2.

Jochen

Man kann das in Python auch machen, quasi.

Jochen

Man kann das halt festdengeln, ohne dass es halt dann noch so dynamisch ist.

Jochen

Ja, man kann halt die Attribute in einem Spezialattribut Dunder-Slots angeben und dann sind die halt da fix.

Jochen

Die kann man dann aber auch nicht mehr dynamisch zuweisen.

Das ist aber auch nur Konvention, oder?

Jochen

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

Jochen

Wenn ich auch weniger.

Johannes

Wenn ich das mache, dann ist es, kann ich doch trotzdem zusätzlich machen.

Dominik

Nochmal Dunler-Slots.

Jochen

Achso, Moment, kann ich dann trotzdem dynamisch zuweisen?

Jochen

Ich weiß es nicht.

Jochen

Ich meine, das geht dann nicht mehr.

Das muss ich ausprobieren.

Johannes

Joch macht seinen Editor an.

Johannes

Einer von uns beiden ist vielleicht falsch.

Johannes

Oder eben Nametuple.

Nameduple ist genauso nur halt schneller.

Johannes

Weil der eben diesen Aufruf nicht über ein Dictionary macht, sondern über eine lineare Liste, weil die Annahme ist, dass du nicht so viele davon hast.

Johannes

Oder vielleicht ist das so eine Hybridsache.

Johannes

So ein bisschen ist das Dictionary ja der Kern von Python.

Johannes

Es gibt ja so eine Listen.

Jochen

Moment, Moment.

Jochen

Ich habe es gerade ausprobiert.

Jochen

Nein, wenn man halt Slots definiert hat und dann was anderes dynamisch zuweisen möchte, kriegt man einen Exception-Attribute-Error.

Aber wenn man Slots macht, dann ist es kein richtiges Dictionary, sondern nur.

Jochen

Also es ist halt auch so ein Trick, damit kann man halt, wenn man viele Objekte hat oder so, damit kann man die Objekte selber schneller machen und sie brauchen viel weniger Speicher.

Dominik

Jetzt muss man noch erklären.

Johannes

Aber Nametuple macht das doch genauso, oder Jochen?

Johannes

Jetzt ist es auch schneller als eine allgemeine Klasse.

Jochen

Ja, ja, klar.

Jochen

Nametuple macht das genauso und darüber funktioniert.

Jochen

Ich glaube, dann intern kann es sogar sein, dass die interne Datenstruktur Tupel ist und sich dann sozusagen nur in Zuordnung gemerkt wird von Index auf irgendeinen Namen.

Johannes

Aber das wäre ja schon, das würde ja schon nichts bringen, sondern das würde ja, dann hörst du ja den gleichen Aufruf auf, sondern das muss eine andere Struktur sein.

Das ist keine HashMap.

Jochen

Ja, ja, ja.

Jochen

Nee, das ist irgendwas anderes.

Jochen

Keine Ahnung.

Jochen

Was auch immer.

Johannes

Man darf nicht vergessen, wenn ich eine kleine Menge an Keys habe, dann ist eine Art Listenzuweisung.

Johannes

Also ich merke mir einfach, die Keys in einer Liste und gehe die Liste linear durch.

Johannes

Das kann schneller sein als so ein Hashmap-Zugriff.

Johannes

Für kleine Werte von N.

Johannes

Für kleine Werte von N ist O von N kleiner als O von 1.

Kann sein.

Kann gut sein, ja.

Johannes

Und das ist, glaube ich, der Trick von Slots und der Trick von Nametuple, dass die halt sagen, okay, wir machen keine allgemeine Zuweisung, sondern wir sagen, aha, wir haben ja nur drei benannte Attribute, dann ist es besser, die in einer Liste zu haben.

Dominik

Okay, Slots bitte noch einmal explizit erklären, weil das kommt gerade zum ersten Mal vor.

Dominik

Slots und Nametupel, auch gerade zum ersten Mal gefallen, eigentlich gesagt.

Jochen

Achso, Slots, wie gesagt, darüber weiß ich jetzt gerne.

Ich hast du dicksfragen.

Ich dachte einfach, was ich.

Johannes

Kl's mal als Nametuple.

Johannes

Was ist denn ein Nametuple?

Dominik

Ich wollte gerade nach Slots fragen, ja.

Johannes

Ja, ja, das kommt gleich.

Jochen

Naja, da definierst du sozusagen ein Objekt dadurch, dass du am Anfang, du gibst halt so, glaube ich, wie ist der Aufruf Nametuple, dann sagt man irgendwie einen Namen dafür und dann sagt man die Parameter, die Attribute, die das haben kann, irgendwie.

Johannes

Und das verhält sich dann aber wie eine Klasse.

Jochen

Ja, genau.

Jochen

Und dann kann man mit Punkt drauf zugreifen, ja.

Johannes

Aber nur mit diesen, die ich da angegeben habe.

Johannes

Also wenn ich ein Nametuple habe, das heißt Fuba.

Johannes

Keine Ahnung, das heißt Fubar und das hat die Attribute A, B und C.

Johannes

Dann kann ich einen Fubar.a machen und Fubar.b und Fubar.c und kriege die entsprechenden.

Johannes

Das verhält sich dann wie ein Dictionary, ja, für diese drei Keys.

Dominik

Aber Dick kann ich ja nicht mit Dot machen, muss ja mit den Key Kategorien.

Johannes

Genau, genau.

Johannes

Also das ist wie eine Klasse.

Johannes

Wie eine Instanz von einer Klasse.

Johannes

Also das ist so ein Ding, das mache ich häufig ja, dass ich einfach eine Klasse mache, die heißt Dataholder und die hat keine Attribute, weil dann kann ich nämlich mit Punkten irgendwas machen.

Dominik

Wenn wir jetzt gerade schon bei Nametupels noch sind, da gibt es übrigens auch eine kleine Neuerung, weil früher gab es ja immer vom Collections NameTuple, man muss ja NameTuple oft machen.

Dominik

Und jetzt gibt es aber auch Typing Nametuple und Typing-NamTuple ist ein bisschen eleganter, weil dann kannst du einfach das wie eine Klasse schreiben.

Und dann darunter die Attribute.

Jochen

Ich würde Nametuple gar nicht so prominent, weil auch das ist, glaube ich, nicht mehr so wirklich empfohlen und nicht mehr so richtig aktuell.

Das gibt es halt nicht.

Jochen

Aber eigentlich, was man.

Dominik

Dann erklärt auch mal Slots.

Wie auch immer.

Johannes

Wenn man Nametuple verstanden hat, dann ist Slots leicht zu erklären, weil Slots ist nämlich eine andere Syntax für die gleiche Funktionalität.

Ja, du sagst, welche Attribute eine Klasse haben darf und dann hat es nur genau diese Attribute.

Dominik

Das heißt, okay, also in Slots ist eine dann dann Methode, die in einer Klasse drinstecken kann.

Jochen

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

Dominik

Das ist ein Attribut A, okay, das ist ein Attribut und da sind eine Liste von Namen rein.

Dominik

Und das eine Liste ist und in der Liste stehen quasi die Strings drin von den Namen, die als Attribut einer eben erlaubt sind.

Johannes

Wäre dann die Klasse, die Klasse hieße Fuba und die hätte ein Attribut, das hieß dann das Slots und da steht drin A, B und C als Strings.

Dominik

Stehen da auch Methodennamen drin oder nur Attributnamen?

Jochen

Nee, nur die Attributnamen.

Dominik

Und wenn ich da Methodennamen reintreibe, dann kann ich da eine Methode für definieren, die trotzdem funktioniert?

Johannes

Kannst du machen, klar, wenn du willst.

Jochen

Da müssen wir ausprobieren, was passiert.

Jochen

Kann sein, dass komische

Sachen passieren.

Nee, das kannst du generell machen.

Johannes

Du kannst generell an jede Klasseninstanz eine Methode dran machen, die muss halt den Parameter self haben.

Als erstes.

Johannes

Und dann funktioniert es wie eine Methode, weil Methoden an Klassen sind nichts anderes als Methoden, die den Parameter self haben.

Dominik

Aber was ist denn, wenn das nicht in den Slots drinsteht?

Jochen

Ja, wenn es

Johannes

nicht in den Slots drinsteht, kannst du nicht drauf zugreifen.

Dominik

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

Dominik

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

Du kannst die

Johannes

Methode in die Klassendefinition reinschreiben und die kommt dann zusätzlich zu den Slots dazu.

Jochen

Du kannst sie halt nicht dynamisch hinzufügen.

Johannes

Du kannst sie nicht dynamisch hinzufügen.

Dominik

Ach, Slots wird zusammengebaut aus dem, was in dem Attribut-Slots drinsteht und in den Namen, die eigentlich Methode gibt.

Da wäre ich mir nicht so sicher.

Probier's mal aussachen.

Johannes

Ja, ist meiner Meinung nach so.

Dominik

Jetzt müssen wir gerade ein bisschen tippen und wir gucken, ob du

Jochen

das jetzt gerade gleich.

Jochen

Okay.

Also foo.

Jochen

Das funktioniert schon mal.

Also genau so.

Jochen

Und jetzt sagen wir mal foo.slots und das glaube nicht, dass das zusammengebaut wird.

Jochen

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

Jochen

Ja, es bleibt

Dominik

wie es ist.

Dominik

Aber das funktioniert.

Dominik

Methoden gehen, ohne dass in Slots drinsteht und es ist nicht in den Slots drin.

Ja, du kannst aber Methoden hinzuschauen.

Genau.

Johannes

Weil die Methoden an dem Typ dranhängen und nicht in der Instanz.

Johannes

Das heißt, an einer Instanz, die ein Slots-Attribut hat, kannst du nichts verändern.

Johannes

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

Johannes

In dem darüberliegenden Typ hast du Methoden drin und da kannst du auch, kannst du alles mögliche drin haben.

Johannes

Das ist dann eine normale Klasse.

Dominik

Okay, das geht leider nur für die Instanz, die Slots.

Johannes

Genau.

Johannes

Die Slots sind für Instanzen von dieser Klasse.

Johannes

Und wenn diese Klasse aber selbst noch Methoden hat oder Attribute, ja, du kannst auch in diese Klasse ein Attribut reinschreiben.

Johannes

Du kannst x gleich 10 reinschreiben und das kannst du auch auslesen.

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

Dominik

Ja, okay.

Aber nicht in den Instanzen.

Johannes

Weil in den Instanzen darfst du nur auf Slots zugreifen.

Johannes

Und das bedeutet, dass eine Klasse mit Slots im Wesentlichen wie ein Nametuple ist.

Nur besser.

Johannes

Mit besserer Syntax und mehr Methoden.

Und das ist auch der Grund, warum Nametuple nicht mehr so richtig.

Dominik

Jawohl, aber ich finde, das ist das neue NameTuple, von dem Vertryping ist doch gar nicht so schlecht.

Jochen

Nee, also es hat auch noch andere Nachteile.

Jochen

Also es gibt ja jetzt auch denn etwas, was man vielleicht, ja, neben, also vielleicht meintest du das auch.

Jochen

Es gibt ja Data-Classes, die sind ja auch jetzt in der Sprache drin direkt.

Jochen

Genau.

Jochen

Und die sind auch in eigentlichen, also es gab es auch, ich weiß nicht, Artikel zu, ich meine, ich habe es jetzt nur mal so gelesen, ich habe es nicht wirklich selber überprüft, aber so wo Leute sagen, also bitte nehmt doch alle Data Classes und nicht mehr nehmen Tuppel, weil Data Classes ist es schneller, es ist besser, es ist in jeder Hinsicht besser, es gibt keinen Grund mehr dazu nehmen.

Jochen

Das alte Zeug ist nur noch drin.

Ja.

Jochen

Okay, ja.

Ja, es kann mehr und es ist schneller.

Johannes

Also ich meine, es gibt keine großen Nachteile.

Jochen

Und es gibt das natürlich, also das Vorbild für Data Classes ist halt dieses Atres-Modul, das sehr beliebt ist.

Jochen

Das kann halt dann noch viel mehr.

Dominik

Und das ist auch relativ schnell, wenn ich das so richtig verstehe.

Jochen

Ist auch sehr nett, ja.

Jochen

Und also das ist das, was vielleicht damit angefangen hat.

Jochen

Dann Data Classes eingebaut und jetzt gibt es halt auch noch sowas wie Pydentic.

Jochen

Das ist ja auch so ähnlich.

Jochen

Das ist noch schneller.

Der Münster

Dominik

bei Data ist das nicht schneller als Atis.

Jochen

Ich weiß nicht, nee, Paydentic meine ich auch, ist eine eigene Geschichte.

Dominik

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

Jochen

Doch, doch.

Jochen

Nee, ist es nicht.

Dominik

Nee.

Dominik

Es ist ein Einstehender sogar langsamer als Atis zum Beispiel.

Jochen

Okay.

Johannes

Ich dachte, es wäre Data-Clein drin.

Dominik

Ich habe irgendwo so ein Video, das muss ich eigentlich bei den Shownos verlinken, wo jemand das ganz gut auseinandernimmt, wo der so am Timings auf mir macht.

Jochen

Also das muss sich mal irgendjemand mal ganz genau angucken und dann Bescheid sagen, wie das denn wirklich ist.

Und dass wir alle

Johannes

in dieser Episode hier in den Podcast kommen und uns das allen erklären, wie es ist.

Genau, das wäre gut.

Jochen

Ja, absolut.

Jochen

Genau, aber es ist auf jeden Fall ein Ding, was halt und diese ganzen Dinge, wenn man die sich alle anguckt, also Nametuple ist halt das, was man am wenigsten nehmen sollte von den ganzen Sachen.

Dominik

Ich finde ja die moderne Sundheitresse sieht eigentlich ganz hübsch aus.

Dominik

Es ist halt so schnell.

Dominik

Wenn du es halt aufschreiben willst, vom Typ-Import Name-Toupel, dann machst du einfach auf, keine Ahnung, Name-Tupel, Define-Nametup und irgendwas und dann schreibst du halt die Attribute untereinander wie in der Klasse.

Dominik

Definierst ihn jetzt klar, welchen Datentyp haben die denn und so, das sieht schon so aus, als.

Jochen

Okay, vielleicht muss ich mir das auch nochmal angucken, weil dass ich das vom Typing importiere, kenne ich jetzt noch gar nicht.

Dominik

Ja, aber das ist auf jeden Fall, glaube ich, ich weiß auch gar nicht, ob sich denn an der Implementierung da was geändert hat, aber die glaubst du wenigstens haben, oder?

Dominik

Also das muss ich erstmal kurz aufmachen, um das mal anzuschauen.

Tatsächlich.

Jochen

Okay, dann muss ich da mal ein bisschen.

Ja, wenn man die Sicht

Johannes

habe, ich würde tatsächlich eher Data Classes verwenden für diesen Use Case, aber ich habe ja immer seltsame Ansichten.

Johannes

Ich habe mich von der Funden, dass ich nicht im Standard bin.

Jochen

Ach, so sieht das.

Jochen

Nee, okay.

Jochen

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

Jochen

Ja, typing.named tuppel und dann sagt man hier irgendwie quasi.

Dominik

Ja, aber das hast du sogar noch, Moment, jetzt muss ich uns.

Dominik

Ja, da unten, also das nicht, sobald ich

Johannes

zuhälere den Monitor nicht

sehen können.

Jochen

Genau, das ist das Problem bei Podcasts.

Jochen

Ja, und das Problem ist auch, weil ich kann das jetzt nicht vorlesen, kann ich schon, hilft nur nicht.

Dominik

Ja, genau, aber das ist meistens alle, ich finde so Gesundheit, das sieht doch gar nicht so

Jochen

schlecht aus.

Jochen

Ja, okay, also gut.

Das ist halt ein klasse.

Johannes

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

Jochen

Ja, ja, ja.

Jochen

Ja.

Jochen

Ja, ja, sehr nett.

Johannes

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

Johannes

Wenn ich das jetzt richtig mache.

Ja, Syntaktikschucker.

Jochen

Ja.

Johannes

Okay, gut.

Johannes

Also dann ist es quasi ein Name-Douple.

Okay, schön, das ist auch okay.

Es gibt noch zwei Dinge, die ich vorhin gelernt habe.

Johannes

Das erste ist Counter.

Wir haben es schon kurz angesprochen.

Counter ist auch eine Dictionary-Subklasse.

Johannes

Und die macht im Wesentlichen das, was sie sagt.

Johannes

Ich gebe eine Sequenz rein und die zählt, wie oft jedes Element drin vorkommt.

Johannes

Das heißt, wenn ich einen String reingebe, dann habe ich hinterher ein Dictionary und in dem Dictionary steht drin, wie oft jeder Buchstabe in diesem String vorkommt.

Johannes

Und das ist großartig.

Johannes

Weil das baut man sich so oft selbst.

Johannes

Und das baut man sich so oft von Hand und macht einen Default-Dict oder macht einen Get und inkrementiert die Zahl dann und so weiter.

Johannes

Einfach ein Counter und die Sequence reintun und fertig.

Johannes

Und man kriegt ein Dictionary raus mit den Ansatz.

Super, ist großartig.

Johannes

Und das hat auch diese ganzen Funktionen, die man dazu braucht, ja.

Johannes

Also wenn man das dann updaten möchte oder wenn man das Generator hat oder wenn man irgendwas anderes in der Hand hat, ja, und das nicht genau vorher weiß oder wenn man zwischendurch noch was machen möchte, ist großartig.

Johannes

Ein Counter zusammen mit einer Comprehension, super.

Johannes

Es deckt so viele von diesen Fällen ab, für die man sonst default dickt verwendet.

Johannes

Ich habe noch was anderes Schönes gefunden und zwar heißt es Chainmap.

Jochen

Das ist auch im Collections Modul drin.

Dominik

Was ist denn eine Chainmap?

Johannes

Eine Chainmap, das ist so ein.

Johannes

Mich hatte so ein bisschen an JavaScript Objects erinnert.

Johannes

Wenn du nach einem Key suchst, 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, dann guckt er im ersten Dictionary, ist er 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.

Johannes

Und so weiter.

Johannes

Bis er alle seine darunterliegenden Dictionaries durchgeschaut hat.

Johannes

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

Johannes

Wenn du aber einen Wert reinschreibst, in diese Chain Map, dann schreibt er das immer in das oberste Dictionary rein.

Johannes

Das heißt, du veränderst nur das erste Dictionary aus deiner Kette, hast aber lesenden Zugriff auf die darunterliegenden.

Johannes

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

Jochen

Wenn du

Johannes

liest, liest du immer aus dem ersten, was verfügbar ist, aber wenn du schreibst, schreibst immer ins Oberste rein.

Jochen

Ja, ich überlege gerade auch, also ich meine, das ist auch so was, ja, ich weiß es nicht genau, ich würde es jetzt nicht, aber es ist halt eine, ich mache jetzt auch so ein bisschen JavaScript gerade.

Jochen

Und was dann doch ein bisschen einfacher hinzuschreiben ist als in Python, ist halt diese Dreipunkt-Spread-Operator-Syntax, wo dann halt sich neue Sachen generiert, indem man halt ein altes Ding nimmt und dann sagt man Punkt, Punkt, Punkt, altes Ding und dann schreibt man noch ein neues Ding dazu oder so.

Jochen

Und mit Chainmap hat man ja da quasi was ganz ähnliches.

Jochen

Das erfasst man.

Sache.

Johannes

JavaScript ist die halt der Kern von JavaScript.

Johannes

Jedes Objekt oder jedes Dictionary in JavaScript hätte einen Prototypen, auf den du zurückfallen kannst.

Johannes

Und das kannst du hier mit Chainmap nachbauen.

Jochen

Ja.

Jochen

Ja, nett.

Johannes

Fand ich sehr schön, dass es gibt.

Habe ich noch nie gebraucht.

Johannes

Wüsste ich jetzt auch nicht, an welcher Stelle ich das einsetzen will, aber gibt es auf jeden Fall.

Und ich glaube, wenn man das braucht, ist das eine sehr, sehr nützliche Sache.

Johannes

Weil man so Hierarchien damit bauen kann.

Ja.

Dominik

Vielleicht nochmal einmal ganz kurz, weil ich gerade nachgeguckt hatte zu diesem Which Python Data Classes Best, habe ich einen Artikel, also ein Video gefunden von einem Kanal, der M-Coding heißt.

Dominik

Und da vergleicht jemand tatsächlich Data Classes, Name Tuple, Tupel Address und Pydentic nach Geschwindigkeit und Memory FG und so.

Dominik

Und da scheint Pydentic vor allem beim Erstellen von den Objekten relativ schlecht ab.

Jochen

Okay, gut, ja.

Dominik

Und dass irgendwie, weiß ich nicht, 15 Mal so lange dauert oder so.

Dominik

Aber sonst vielleicht schnell.

Ja, gut.

Johannes

Im Laufe seines Programmierebens hat er mich davon weg entfernt, Geschwindigkeit

primär zu machen.

Dominik

Und Notiztitel wieder angemacht.

Dominik

Ja, ja, genau.

Dominik

Geschwindigkeit, ja, ist die Frage, braucht man das oder auch will man das?

Dominik

Das ist völlig egal, haben wir nicht genug Rautspeicher und sind solche, also das überhaupt nicht mehr.

Johannes

Nie genügend Geschwindigkeit und nie genügend.

Jochen

Letztens jemand kennt ihr bestimmt auch.

Jochen

Pavel Meier aus Chaos Radio oder jetzt.

Johannes

Aus dem Chaosumfeld, nee, die kenne ich alle nicht.

Jochen

Ah, okay, der.

Jochen

Naja, gut.

Jochen

Der hatte das mal irgendwie so beschrieben, dass sein Computer eigentlich für ihn nur eine relevante Eigenschaft, also ein Attribut hat, das irgendwie wichtig ist.

Jochen

Oder das drei gibt drei ganz wichtige.

Jochen

Und zwar, das ist halt erstens Performance.

Jochen

Das zweite ist halt Performance.

Jochen

Und das dritte ist, was auch noch sehr wichtig ist, Performance.

Es sind ja nur drei Dinge.

Jochen

Ja, da ist auch schon was dran.

Jochen

Aber tatsächlich, naja, irgendwie sowas wie Lesbarkeit und so ist auch nicht so schlecht.

Dominik

Es hast du der Papel Meier, der dieses mega langsame Covid-Dashboard geschrieben hat.

Jochen

Ja.

Jochen

Genau.

Tassel.

Johannes

Es gibt so Leute, also ich meine, es gibt auch Felder, in denen das wichtig ist, ja, die Geschwindigkeit.

Johannes

Und Geschwindigkeit ist immer irgendwie so ein Faktor, der wichtig ist, aber man kann da so tief reingehen, wie man möchte.

Johannes

Und es gibt immer noch jemanden, der es schneller macht.

Johannes

Ich sehe mir sehr gerne die Videos von Casey Muratori an.

Johannes

Der kommt halt aus der Spieleentwicklung und der sagt, man kann den C alles machen, also soll es den C auch alles machen, aber wenn es schnell sein muss, dann musst du halt schon auf die Intrinsics gehen und den Prozessor kennen, den der da gerade benutzt und dann die die Befehle, den Befehlssatz kennen, weil dann kannst du nämlich alles 256 Mal so schnell machen wie vorher.

Johannes

Und ja, das ist prinzipiell korrekt.

Dominik

Aber vielleicht ist SMB-Coden auch zu langsam, also wenn man es gut kann, ich weiß nicht.

Johannes

Der kann das sicherlich gut genug, aber.

Jochen

Noch kurz zu Fabrival.

Jochen

Ah ja, genau, da gibt es auch gerade auf Netflix so eine so eine Miniserie oder so: The Billion Dollar Code, die ist quasi mehr so, orientiert sich an deren Biografien da.

Ja, im Fernsehen.

Dominik

Ich habe schon eine Wiederwerbung Jochen, das ist aber eine werbungsvolle Folge.

Jochen

Diesmal ist ja noch gar nicht so, also ja, da, also gut, wir machen Werbung, Werbung machen wir immer, aber wir werden nicht dafür bezahlt, dass

Johannes

Netflix, weil sie zuhört, der Jochen wäre durchaus offen dafür, bezahlt zu werden.

Dominik

Also Johannes, wir können jetzt ja nicht mit anderen Werbepartnern direkt parallel Netflix würde ich vielleicht auch nicht.

Dominik

Also wir hatten ja letztes Mal, also wenn wir jetzt schon das Thema Werbung haben und jetzt gerade Werbung versuchen, machen wir.

Dominik

Ja, wir haben ja überlegt, ob wir Werbung schalten sollen und ein bisschen darüber lustig gemacht und wir haben ein bisschen Feedback bekommen.

Dominik

Leute sagen, ja, macht doch einfach.

Dominik

Ja, dann haben wir uns auch gedacht, ja okay,

dann machen wir halt

Dominik

so ein bisschen kostendeckend arbeiten oder so.

Johannes

Es ist Leute, die euch bezahlen, ist ja verrückt.

Und die noch nicht berührt und schockiert.

Dominik

Du wirst nicht bezahlt, Hannes macht ja gar keine Diskussion.

Johannes

Achso, ja gut, dann

ist der egal.

Jochen

Nicht so direkt, aber ich finde, das wäre natürlich so eine Sache, die man machen könnte.

Jochen

Man könnte also einmal Hosting-Kosten, so die anfallen, ein bisschen damit vielleicht bezahlen.

Jochen

Aber was man auch machen könnte, wir könnten dem Johannes ordentliches Audio-Equipment schenken zum Beispiel.

Dominik

Ja, da müssen wir nochmal drum mal sehen.

Dann ist das jetzt hier mit der Spendenaufruf, wenn die Zuhörer gerne möchten, dass ihr mich besser hören könnt, dann folgende Bitcoin-Adresse.

Dominik

Wir schalten jetzt einfach Werbung.

Aber wenn ihr dann Werbung schalten würdet und dann auch Geld einnehmen würdet, dann könntet ihr euch ja auch richtige Gäste leisten und dann würde ich ja einfach gar nicht mehr, ich wäre dann einfach gar nicht mehr hier, sondern ihr würdet Gäste.

Jochen

Vielleicht könnte man sich dann noch andere Hosts leisten, die das so etwas professioneller machen und sowieso eine andere Webseite, die auch nicht so stärker aussieht.

Jochen

Und dann könnten wir endlich, was könnten wir denn dann eigentlich machen?

Ich wollte mir ein Schloss kaufen.

Wenn wir den Strand zur Ruhe setzen

Johannes

und mal eure Hobbys verfolgen, vielleicht, keine Ahnung.

Jochen

Vielleicht machen wir einen Pass auf.

Naja.

Dominik

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

Johannes

Möchtest du auch einen Spendenaufruf starten?

Johannes

Also mein Spendenaufruf war für ein gescheites Mikrofon, Dominik Spendenaufruf ist für ein Schloss.

Dominik

Ja, für meinen Schloss, für mein Schloss.

Ja, ja, für seinen Schluss.

Ja, okay.

Johannes

In diesen ganzen anderthalb Stunden, wo wir jetzt schon zusammensitzen, haben wir jetzt tatsächlich noch gar nicht drüber gesprochen, was eine Hashmap überhaupt ist.

Dominik

Du hast jetzt schon vorher vergessen, wir gebraucht haben, unser Audio-Equipment vorzubereiten, obwohl wir alle vorher sind.

Johannes

Ja, das ist halt an meinem schlechten Mikrofon, aber.

Johannes

Trotzdem sind wir noch nicht so weit gekommen zu erklären, was überhaupt eine Hash Map ist und wie sie funktioniert.

Dominik

Ja, stimmt.

Dominik

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

Dominik

Also man kann quasi dem Key ansehen, wo er sein muss.

Oder so.

Johannes

Dem Key nicht, aber man kann aus dem Key was rauskitzeln.

Dominik

Okay, aber aus diesem rauskitzeln kann man direkt weiß man direkt, wo es sein muss, weil das irgendwie.

Johannes

Ja, der Trick ist, der Trick ist im Wesentlichen schon im Namen, ja.

Johannes

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

Dominik

Deswegen muss es auch hashable sein.

Genau, deshalb muss es hashable sein.

Johannes

Und weil Hashes, 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 mit Modulo nehme, ja, und quasi als Index in eine Liste reinnehme, dann bedeutet das, dass der irgendwo hin zeigt.

Johannes

An einen Index, der nicht vorhersehbar ist und der auch gleich verteilt ist über die gesamte Reichweite der Liste.

Dominik

Aber ich muss da reingehen, quasi die Länge der Liste, das heißt, ich weiß, wie groß das maximal ist.

Johannes

Genau, ich muss wissen, wie groß die Liste ist.

Johannes

Beziehungsweise Python macht da viele coole Tricks, die Magie helfen.

Johannes

Aber das ist bei einer Hashmap immer so, die hat so einen Befüllungsgrad, wir haben es vorhin schon angesprochen, bei Python ist es 2 Drittel, die ist maximal zwei Drittel voll.

Dominik

Also Wurzel 3, hast du gesagt?

Johannes

Wurzel 3 wäre noch besser, aber das ist halt leider kein Integer.

Dominik

Ist das der goldene Schnitt?

Dominik

Nein.

Johannes

Nee, der goldene Schnitt ist 1,618 noch was.

Was ist das Wurzel 3?

Johannes

Und der heißt auch 4.

Wurzel 3 ist 1,7 knapp dann.

Dominik

Vielleicht noch besser einzeln.

Johannes

Ist übrigens auch interessant, weil ternäre Logik wäre besser, weil das näher an irgendeiner Zahl dran ist.

Johannes

Ach, keine Ahnung, spielt keine Rolle jetzt.

Johannes

Das Wichtige ist, wenn ich aus einem Dictionary rauslesen möchte, dann nehme ich den Key, den ich lesen möchte und hashe den und nehme dann diesen Hash als Index in eine Liste rein.

Johannes

Und wenn in dieser Liste an der Stelle was steht, was nicht None ist, dann ist es der Wert, der zu diesem Key gespeichert wurde.

Johannes

Und umgekehrt, wenn ich in eine in eine Hash Map etwas reinschreiben möchte, dann mache ich den Hash aus diesem Key und schreibe den Wert in diese Liste an der Stelle des Hash-Index rein.

Johannes

Und das ist sozusagen der Trick.

Johannes

Ich berechne einen, ich nenne es mal, zufälligen Index in diese Liste, weil der gleich verteilt ist, weil diese Hash-Funktion gleich verteilt ist, füllt die diese Liste gleichmäßig auf und kann dann eben in O von 1, weil diese Berechnung dieses Hashes immer gleich lange dauert, diesen zufälligen Index finden und dann da reinschreiben.

Johannes

Jetzt gibt es ein Problem.

Johannes

Was ist, wenn zwei Hashes zu dem auf den gleichen, also wenn zwei Keys auf den gleichen Hash-Index zeigen?

Johannes

Und das passiert, wenn wir ein Dictionary haben, was acht Einträge hat, dann ist die Wahrscheinlichkeit, dass zwei auf den gleichen Index zeigen, vergleichsweise hoch.

Johannes

Eins zu acht.

Johannes

Das heißt, man muss sich eine Technik überlegen, 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, dann muss ich halt durch diese Liste durchgucken und da den entsprechenden Wert rausholen.

Das heißt Chaining.

Johannes

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.

Johannes

Und die Wahrscheinlichkeit, dass da eine Kollision auftritt, wird eben jedes Mal kleiner.

Johannes

Und das heißt Open Addressing.

Johannes

Und Python Dictionaries machen tatsächlich Open Addressing.

Johannes

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.

Muss einfach sozusagen nochmal einen Hash berechnen.

Dominik

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, sondern dass deine Hash Map einfach nur in eine Richtung wächst.

Johannes

Das sind Implementierungsdetails.

Johannes

Aber das ist im Wesentlichen die Magie, dass man aus dem Key einen Hash berechnet und dieser Hash hat eine gewisse Eigenschaft und die heißt gleich verteilt.

Johannes

Und auch wenn ich die auf einen Index zusammen dampfe, dann sind sie immer noch gleich verteilt und das ist der Trick daran.

Johannes

Bedeutet halt, dass der Key hashable sein muss.

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

Johannes

Da werden die Keys in einen Tree abgelegt, dann müssen sie nicht hashable sein, dann müssen sie sortierbar sein.

Johannes

Und dann habe ich halt einen Tree, ja, dann habe ich Zugriffe in die alle Login sind.

Jochen

Genau, das Default, ich weiß nicht, ob es immer noch so ist, die Hash-Map, Default-Implementation der Standard-C<unk>-Bibliothek irgendwie vom Boost war irgendwie so ein Tree Map.

Jochen

Und hat dann irgendwie, als wenn man was optimieren wollte, dann C<unk> geschrieben hat und dann war das überraschend von der Performance selber.

Jochen

Das war da hinterher langsamer als die Ding zum Fall.

Großartig.

Johannes

In Java gibt es diese beiden Optionen unter diesen Namen.

Johannes

Es gibt HashMap und es gibt TreeMap.

Johannes

Das heißt, bei Java muss man sich immer raussuchen, was man haben möchte.

Jochen

Okay.

Die Antwort ist immer HashMap, aber egal.

Johannes

Und natürlich bei einer Hash Map heißt das, dass man immer Hash-Funktionen haben muss.

Und Hash-Funktionen sind auch so eine Sache, ja.

Johannes

Die müssen schnell sein und trotzdem gut und ich möchte gerne viele verschiedene haben und die sollen alle schnell sein und alle möglichst gut.

Johannes

Und da die richtige Hash-Funktion rauszufinden und eine gute Implementation davon zu haben, ist nicht ganz einfach.

Dominik

Welche wird dann verwendet?

Das weiß ich nicht.

Nein.

Jochen

Also ich denke dir.

Ja, das weiß ich nicht.

Johannes

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

Johannes

Es gibt MD5 und CHAW 1 und SHA 256 und CRC32 und die sind aber alle nicht geeignet dafür.

Johannes

Und dann gibt es so welche, die kennt man überhaupt nicht.

Johannes

Und die haben auch abgefahrene, lustige Namen, von denen ich jetzt keinen Einsatzigen sagen kann, weil ich kenne sie ja nicht.

Johannes

Die aber eben keine kryptografischen Hashes sind, sondern eben solche Hash-Funktionen, die man für solche Datenstrukturen verwendet, die dann halt aber andere Eigenschaften haben.

Johannes

Die brauchen dann nur acht Cycles und geben nur zwei Byte als Hash zurück oder irgendwie solchen Quatsch, weil das hierfür viel wichtiger ist.

Jochen

Ja, also ich kenne die Hash-Funktion für kleine Integers und die ist ja einfach.

Jochen

Ah, die ist das Integer seitlich.

Jochen

Also der Hash von 1 ist eins.

Jochen

Hash von 2 ist 2.

Jochen

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

mehr so.

Johannes

Von 128, ja.

Jochen

Das glaube ich auch immer noch 128.

Johannes

Ah, ich glaube, es geht nur bis 127.

Jochen

Moment, Moment, ich habe doch hier die REPL schon aufgemacht, da kann ich auch gleich nochmal Hash 128.

Ich habe ja kürzlich einen 27, aber wenn ich 512.

Jochen

Verdoppeln war eine gute Strategie, habt ihr eben gesagt.

Jochen

512 ist auch immer noch 512, bei 1024 auch immer noch, oh mein Gott, was sind.

Johannes

Beintegers einfach immer so.

65 oder 100.

Jochen

Nein, nein, nein, wenn die wirklich groß werden, dann ist es nicht mehr so.

Jochen

Okay, sie müssen wirklich groß werden.

Jochen

Ich bin gerade schon bei einer Million, bei der Milliarde.

Johannes

Dann sind es vermutlich 32 Bitend, ne?

Johannes

Über 32 Bitness.

Signed.

Dominik

Unsigned end.

Dominik

Man weiß es nicht, mal ein Minus.

Ah, okay.

Johannes

Es gibt ja ein sehr schönes Paper, das heißt People mistake knowledge on the Internet for Their Own Knowledge.

Du hast eine gefunden.

Jochen

Also ich habe eine gefunden, aber da musste ich jetzt schon irgendwie 20, 30 Nullen hinten dran machen.

Jochen

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

Johannes

Das sind die, die früher L hießen.

Das ist auch super.

Dominik

Erstmal beim Verdoppeln, also 128, 12.000, 24, dann 10.000, 100.000, eine Million, 10 Millionen, 100 Millionen, dann auf einmal so.

Jochen

Ich weiß nicht, wie die Zahlen heißt jetzt da draufgefallen ist, aber ich weiß jetzt doch, bis wo denn das wohl ist.

Jochen

Das ist wohl tatsächlich bis zur Grenze, bis zur 64-Bit-Grenze.

Jochen

Weil das, was hier rausgefallen ist, ist irgendwie maximal mehr

60 Bit.

Dominik

Aber wo Zeit Implementation D-Tay sind, das eigentlich Signed oder Unsigned Ints in Python?

Dominik

Und was ist das ins?

Dominik

64 oder ins?

Jochen

Designed meine ich.

Johannes

In Python, die Integer sind Long Integer.

Also 64.

Johannes

Es gab früher eine Unterscheidung zwischen Long Integer und Integer, die gibt es seit Python 3 nicht mehr.

Johannes

Also ist jeder Integer eine Ganzzahl und die verhalten sich auch korrekt wie mathematische Ganzzahlen.

Johannes

Du kannst beliebig viele Stellen machen.

Johannes

Die Implementation dahinter schaltet um zwischen Integers und Long Integers.

Was ist denn Hash von Material?

Johannes

Aber das ist ja nur ein Implementationsdetail, das ist nur ein Umsetzungsdetail.

Jochen

Hash von minus 1 ist minus 2.

Dominik

Minus 1 ist minus 2, ja, schön.

Interessant, okay.

Jochen

Wir haben wieder was gelernt.

Johannes

Gut, die exakte Funktion spielt gar keine Rolle.

Johannes

Wenn du Hash von irgendeinem String machst, kriegst du halt auch irgendeine Zahl raus.

Johannes

Das Wichtige ist eher, dass es schnell sein muss und dass es deterministisch ist und so weiter und diese ganzen Eigenschaften, die man so stellt an Funktionen und halt, dass es gleich verteilt ist über die Menge der Hashes.

Und ich glaube, die Menge der Hashes, wenn du die Zahlen vor dir hast, Jochen, die sehen aus wie 32-Bit-Zahlen, oder?

Ja.

Dominik

Hash minus 2.

Johannes

Minus 4.

Nein, keine Ahnung.

Dominik

Oh, Hash-1 ist gleich Hash-2.

Da ist es.

Johannes

Da hast du direkt eine Kollision.

Dann musst du Open Addressing machen.

Ja.

Dominik

Ja, okay.

Jochen

Ja, witzig, witzig.

Dominik

Das heißt, kann man dickt keys, wenn das Int sein können, können das auch negative Int sein?

Jochen

Ja.

Na klar.

Okay, das heißt erscheinen.

Jochen

Alles, was Hash will.

Jochen

Du kannst nochmal das,

was ich nicht verändern kann.

Dominik

Das heißt, er macht tatsächlich, wenn du minus 1 reinschreibst, dann muss er tatsächlich eine Kollision machen und minus 2, dann muss er quasi eine Ebene tiefer gehen und ja, okay.

Johannes

Du kannst auch deine eigenen Objekte.

Jochen

Ja, genau.

Jochen

Das ist auch etwas, was ich gerne mache tatsächlich.

Jochen

Und was Leute mal so überrascht, wenn man dann Objekte als Keys hat, dann sagen die immer so, aber nein, das geht.

Jochen

Das ist okay.

Du solltest denn eigentlich auch immer noch Frozen-Versionen machen oder an die.

Dominik

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

Jochen

Ja, also es muss natürlich hashable sein.

Jochen

Du hast hier jetzt einfach Danda Hash.

Danda Hash.

Jochen

Dann wird die aufgerufen und dann kannst du eine, wenn du eine ID schon hast, dann kannst du die natürlich auch zurückgeben.

Jochen

Oder du kannst halt, ja, irgendwie, wie auch man willst du.

Johannes

Jedes Objekt ist doch hashable, oder?

Gerne.

Johannes

Die Objektidentität als Hash-Funktion.

Jochen

Ja, das kann natürlich sein, dass das der Default ist.

Johannes

Wie könnte man das jetzt schnell rausfinden?

Dominik

Help, dann Hash.

Dominik

Wie wäre das denn?

Johannes

Genau, aber du kannst natürlich deine eigene Hashes machen.

Jochen

Scheint so zu sein, ja.

Dominik

Help, dann Hash.

Johannes

Du kannst natürlich deine eigene Funktion da reinschreiben.

Johannes

Das heißt, du kannst eine Hash-Methode schreiben, die für deine Objekte spezifisch ist.

Johannes

Aber wenn du das machst, wenn man seine eigene Hash-Methode implementiert, dann muss man wirklich darauf achten, dass sich Keys in einem Dictionary nicht ändern dürfen.

Johannes

Das heißt, wenn ich ein Objekt, wenn ich einem Objekt eine Hash-Funktion gebe, eine Hash-Methode gebe, die sich zwischendurch verändern kann, dann geht mein Dictionary kaputt.

Johannes

Und das geht dann auch gleich richtig kaputt, weil dann finde ich gar nichts mehr in meinem Dictionary.

Jochen

Ja, ja, ja.

Jochen

Also da muss man dann natürlich aufpassen.

Jochen

Aber ich meine, oft hat man ja tatsächlich eine ID, die man nehmen kann.

Jochen

Und man gibt halt bei der Hash-Printhol, man rechnet das nicht selber aus, sondern man gibt halt etwas zurück, was dann durch Hash nochmal durchläuft.

Johannes

Man fällt zurück auf irgendwas.

Johannes

Aber dass man halt sagt, okay, eine Adresse ist halt, der Hash einer Adresse ist der Hash aus der Straße und der Postleitzahl und der Stadt, das ist ja schon irgendwie naheliegend, ja.

Johannes

Dass du halt irgendeinen Wegbildest, was du dann hashst.

Johannes

Und klar, das kann man natürlich machen.

Johannes

In meiner Erfahrung tripp es nicht so häufig auf, aber wenn du sagst doch, dass du das gerne machst, dann.

Jochen

Vielleicht mache ich es auch falsch.

Ich weiß nicht so genau.

Jochen

Also ja, gerade mit Zusammenhang mit Data Classes, beziehungsweise so Atris, da benutze ich.

Data Classes sind ja automatisch hashable, oder?

Jochen

Naja, bei Data Class, das weiß ich gar nicht so genau.

Jochen

Also ich habe das jetzt, was ich jetzt im Kopf habe, ist mit Attres.

Jochen

Und da muss man dann auch, da kann man dann auch solche Sachen sagen.

Jochen

Also einmal man kann es natürlich selber implementieren, aber man kann auch sagen, irgendwie, also ich habe, das soll hashable sein und diese Attribute will ich dafür verwenden und die müssen dann auch natürlich auch Dread-Oni sein und so.

Jochen

Ja.

Jochen

Und dann macht es manchmal Sinn, weil dann kann man halt bestimmte Sachen lookupen mit einem anderen bestimmten Ding.

Jochen

Und dann, das ist manchmal ganz praktisch.

Johannes

Ja, das ist ja oft so, dass man seine Algorithmen beschleunigen kann, wenn man so ein Lookup macht, wenn es in dem Algorithmus vorkommt.

Johannes

Wir hatten einmal so einen Fall im Computerclub, da war der Bison auch da und hat er eben seinen Algorithmus mit einer Liste geschrieben, wo er dann eben immer die Elemente aus der Liste raussuchen musste, wo er immer nachgucken musste, habe ich diesen Knoten schon besucht in der Liste und das war halt O von N.

Johannes

Und dann haben wir es umgebaut zu einem Set, was im O von 1 ist, wo diese Operation O von 1 ist und dann wird es halt wirklich schneller.

Johannes

Also wenn man das braucht, ist das schon ein Superpower.

Dominik

Hast du noch etwas auf deiner Liste stehen, Johannes?

Johannes

Nee, ich habe jetzt tatsächlich meinen ganzen Notizzettel abgefrühstückt.

Dominik

Jochen, hast du noch was zu Dikt, was wir noch nicht.

Jochen

Also ja, was ich ganz gerne vielleicht noch sagen wollen würde oder so, ist halt, dass man auch selber sich Sachen implementieren kann, die dann halt so funktionieren wie Dikts.

Jochen

Also es gibt ja seit Python 3.3, glaube ich, Protocols oder weiß nicht wie das.

Jochen

Man hat halt auf jeden Fall diese Abstract-Base Classes, wo es dann Interfaces für diese ganzen Geschichten gibt.

Jochen

Und dann da hat man dann halt.

Dominik

Aber Moment, also Protokolls sind fertige ABCs Abstract-Base-Klasses.

Dominik

Die Implementierung von Python-Modulen, die es schon gibt.

Ach, cool.

Dominik

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

Ah, ja, genau.

Johannes

Und die sind großartig fürs Typing.

Johannes

Da kann man nämlich richtig gutes Duck-Typing machen, was aber trotzdem getypt ist.

Ist großartig.

Jochen

Genau.

Jochen

Und dann kannst du eben deine eigene für deinen Anwendungsfall etwas Spezielles hinbauen, wo du dann sicher sein kannst, dass sich das dann aber genauso verhält und auch an den Stellen verwendet werden kann, wo du normalerweise ein Dick benutzen würdest und so.

Jochen

Das kannst du auch sehr coole Sachen mitmachen.

Johannes

Wobei das Protokoll von einem Dick-Train ist ja vergleichsweise groß.

Dominik

Was ist das denn?

Dominik

Was ist denn ein Ding?

Jochen

Das meine ich Mappable, aber.

Jochen

Ich gucke mal gerade, wo haben wir das denn da?

Jochen

Es gibt Mapping.

Jochen

Mapping heißt das genau.

Dominik

Ein Mapping.

Jochen

Mutual Mapping.

Jochen

So, äh, ach, jetzt steht das Interface hier aber nicht dabei.

Dominik

Vom Collections.abC Import.

Abstract Base Class.

Jochen

Moment, ich importiere das gerade mal mach mal in dir.

Dominik

Ja, das ist cool, weil dann kannst du einfach von Mapping ergen lassen und alles, was du nicht implementiert hast, wird dann einfach direkt gerased.

Dominik

Wenn das halt nicht da ist.

Dominik

Das ist doch schon deine Zungen.

Johannes

Typechecker sagt dir da auch direkt, dass das.

Ja, ja, genau.

Dominik

Du hast direkt gezwungen, das richtig zu implementieren.

Dominik

ABC Boot Collections.

Ja, ich habe mich richtig.

Dominik

Weil ABC ist ja die ABC selber interessiert.

Ich weiß,

ich weiß.

Jochen

Gleichzeitig reden, tippen und das alles.

Ich glaube, was du aber auch Podcast hast, wo wir nicht mehr so gut haben.

Dominik

Mach mal ein neues Objekt vom Mapping auf einfach.

Jochen

Ich glaube, das kannst du nicht interessieren.

Das sehen Sie nächstes Mal in diesem Podcast.

Das geht nicht.

Dominik

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

Jochen

Ja, okay.

Dominik

Ich muss halt GetItem, Itter und Längen definieren von meinem Mapping.

Jochen

Okay, zumindest.

Jochen

Also das Interface selber ist jetzt doch was größer als halt 37 Methoden und das ist natürlich schon eine ganze Menge.

Ja, das hatten wir ja vorhin auch schon angesprochen, dass eben Dicks relativ viel Oberfläche haben.

Johannes

Weil sie halt für alles verwendet werden.

Jochen

Ja, aber eben, also man kann das halt verwenden.

Dominik

Interessant, interessant.

Dominik

Ist das euer Lieblingsdatentyp?

Jochen

Ja, also von den primitiven Dingen auf jeden Fall.

Jochen

Ich habe das auch letzte, also diese ganzen Typins-Typisierungsgeschichten, die es jetzt neuerdings gibt.

Jochen

Es gibt ja immer so, auf Twitter gibt es dann so die alten Säcke, die da rumhängen.

Jochen

Und die äußern sich ja manchmal so.

Wie alt bist du gleich noch?

Jungen Hüpfer.

Jochen

Ja, ich, äh, sie sind noch älter als ich.

Johannes

Die im Kopf Alpen und Säcke.

Jochen

Ja.

Jochen

Nee, also verdiente Veteranen, okay, sehr schön, sehr schön auch.

Jochen

Der Python-Community und die sich manchmal so ein bisschen despektierlich äußern, was so, was diese ganzen neuen Entwicklungen angeht.

Die ganze Scheiß,

Dominik

gar nicht mehr.

Dominik

Pythonic.

Jochen

Genau, und so ein bisschen kann ich das natürlich auch nachvollziehen, muss ich, muss ich sagen, also zum Beispiel, äh nehmen wir mal, ich sag jetzt mal einen Namen, David Beasley zum Beispiel, der ganz viel cooles Zeug gemacht hat, der auch eines der besten Bücher, Python-Bücher geschrieben hat, irgendwie Python Essential Reference, glaube ich.

Jochen

War lange super.

Jochen

Jetzt gibt es da sogar Python Distilt, ist jetzt nochmal eine neue Ausgabe.

Jochen

Super Buch.

Jochen

Und der sagt so, also ich weiß nicht, dieses ganze Typing-Zeugs, ich finde, das sieht nicht gut aus, ich mag das nicht.

Jochen

Und was wir, wir früher, als wir nichts hatten, was wir gemacht haben, wir haben immer irgendwie Dicts genommen und ein paar List-Comprehensions und damit haben wir alles gemacht.

Jochen

Alles haben wir damit gemacht.

Jochen

Und das war viel besser, als irgendwie, wenn einer sich mit Java hingesetzt hat und hat dann irgendwie so angefangen, erstmal Interfaces zu definieren und dann irgendwie, keine Ahnung, sich erstmal in ja, weiß ich nicht, in so ein Spinnennetz aus komischen Dingen, die man alle so machen muss, weil man sie halt machen muss, hinschreibt, genau, Getter Setter, diese ganzen Zeugs.

Jochen

Und dann hat man sich in so einem Spinnennetz von Dingen verheddert, bevor man auch nur eine Zeile produktiven Code geschrieben hat.

Jochen

Und dann ist man mit den Dicts und den List-Comprehensions schon lange fertig.

Jochen

Und damit hat er nicht so ganz Unrecht.

Jochen

Also tatsächlich ist es so, dass Dicts, wenn man das beherrscht und so wirklich verstanden hat, wie das funktioniert, mit eben vielleicht noch Dikt-Comprehensions, vielleicht noch Generator-Expressions, würde ich dazu nehmen, und List-Comprehensions.

Jochen

Damit kann man einen Großteil von dem, was man so im Alltag an Programmierproblemen hat, tatsächlich lösen.

Jochen

Und es ist sehr, ja, man kommt da schnell hin.

Dominik

Sehr convenient und dann halt dem Python-Prinzip gar nicht jeder.

Dominik

Simple Platter sind Complex wieder.

Johannes

Das ist auch so ein bisschen die Stärke von Python.

Johannes

Ich muss auch gelegentlich andere Sprachen machen.

Johannes

Jetzt so ein bisschen TypeScript kommt auf mich zu und C Sharp.

Johannes

Und da sind solche Mapping-Typen einfach unhandlich.

Johannes

Die sind einfach schwieriger zu benutzen.

Johannes

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

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

Johannes

Jeder Typ ist Annie in TypeScript.

Johannes

Aber in C Sharp, in C Sharp kannst du es auch machen, kannst du auch Annie sagen, aber wird nicht gerne gesehen.

Dominik

Also meine ist talentet Annie übrigens, der sagt, das reicht ihm nicht.

Ja, okay, gut.

Johannes

Das ist halt eine Einstellungssache.

Johannes

Das kannst du abschneiden.

Johannes

Ja, kann auch.

Johannes

Es 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, 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, weil ich mir ganz oft denke, ja, da könnte ich jetzt ein Dictionary verwenden, aber kann ich an der Stelle nicht.

Ich muss nicht so viele Spieleprogrammieren, aber muss aber auch zwölf Umwege machen.

Johannes

Ich sehe aber auch, also ich sehe auch den Vorteil von diesen Typing an.

Johannes

Ich bin da ganz klar auf der Seite der jungen Hüpfer, wie dir, Jochen.

Johannes

Und das ist für mich so ein bisschen diese, es gibt da diesen klassischen Kampf zwischen Explore und Exploit.

Johannes

Wo jeder entscheiden muss, was er machen muss, um ein Problem zu lösen.

Dominik

Also Explore als unbekannte Dinge angucken und Exploit als bekannte Dinge so lange gegenhauen, bis es irgendwie kaputt geht.

Ja, genau.

Johannes

Also Explore heißt Lösungen ausprobieren, die dir selber noch nicht bekannt sind.

Johannes

Also suchen quasi und Exploit heißt Dinge anwenden, die du schon weißt.

Johannes

Und Menschen sind da halt sehr unterschiedlich.

Johannes

Und das ist tatsächlich wohl so, dass es mit dem Alter eher zu Exploit geht als zu Explore, was ja auch okay ist, ja, weil du Explore schon gemacht hast und dann eben die Dinge anwendest, die du schon weißt.

Johannes

Wenn du mehr weißt, ist das natürlich effektiver, als wenn du weniger weißt.

Kinder machen viel, viel mehr Explore.

Dominik

Einige Hacker schon von Anfang an Greise im Kopf gewesen, ja.

Ja, das ist.

Sorry.

Johannes

Man muss sich das auch manchmal wieder zurück in den Kopf rufen, dass man vielleicht gelegentlich wieder Explor machen muss.

Johannes

Das ist auch der Grund, warum ich sie Sharp und Tarpskyp und so weiter mache, damit man mal ein bisschen wieder was anderes macht.

Dominik

Ich dachte, dass sie Sharp macht, damit du endlich noch ein Spiel releasen kannst.

Johannes

Ja, irgendwie muss man ja sein Schloss sicher arbeiten.

Erschlossen arbeiten.

Dominik

Das heißt, man widerspricht sich dort schon von alleine.

Johannes

Ja, Erben, ich glaube, das

Dominik

wird bei mir schwierig.

Dominik

Oder erobern.

Dominik

Schlösser müssen eigentlich geobert werden mit Verteidiganlagen oder Heirat.

Ja, das ist auch eine Art der Eroberung.

Ja, eine

gewisse Art.

Johannes

Sieht bei mir jetzt alles nicht so gut aus.

Johannes

Ich bin schon verheiratet.

Johannes

Und mit Erben, ich habe meinen Vater gefragt, aber im Inventar.

Dominik

Du hast halt die hübsche genommen, ist eine schlechte Teilung.

Absolut.

Johannes

Und hübsch und schlau, das sind ja schon zwei Eigenschaften, die man sonst nicht im Paket kriegt.

Jochen

Ich habe meinen Vater

Johannes

gefragt, von Bannf, was Erb hatte direkt die Schlösser austauschen lassen.

Johannes

Ja, aber das ist eben, man muss sich auch mal immer wieder in den Kopf rufen, dass man ein bisschen Explore macht und nicht nur Exploit.

Johannes

Also nicht nur das anwenden, was man kann, sondern auch mal was ausprobieren, was man noch nicht kann.

Johannes

Und Dictionaries und Typing gehören da halt dazu.

Johannes

Es gibt so eine witzige Liste von, wie man Programmiersprachen beschreiben kann.

Johannes

Und die fangen alle an mit What if everything was?

Johannes

Und C zum Beispiel, bei C ist die ist das Mandat What if everything was a pointer?

Johannes

Und in Java ist What if everything was an object?

Johannes

Under Python ist halt What if everything was a dictionary?

Und das ist schon so.

Johannes

Dictionaries sind so ein bisschen der Kern von Python.

Johannes

Die sind leicht zu verwenden, die sind sehr mächtig, man kann so gut wie alles damit machen und die formen dann so ein bisschen das Denken.

Dominik

Das haben wir so ein bisschen verherrlich, wir haben jetzt noch gar nicht die Nachteile davon erklärt, warum will man das denn vielleicht nicht benutzen?

Johannes

Nachteile ist, was könnte es jetzt noch für Nachteile geben?

Johannes

Es ist O von 1, es kann alles speichern, es ist großartig.

Dominik

Also vielleicht so wie Speicherverbrauch.

Johannes

Ja, ja gut, das haben wir am Anfang schon gesagt.

Johannes

Also ein Dictionaryverbraucht direkt ein Viertelkilobyte.

Dominik

Das heißt, bei solch embedded Programming oder irgendwelche so IoT-Sachen ist es dann vielleicht nicht die richtige Wahl.

Johannes

Es ist auf jeden Fall relativ wastev.

Johannes

Also man hat immer einen großen Overhead.

Johannes

Immer mindestens.

Dominik

Wie laufen alle auch für Kisten, wo wir genug Speicher haben, dann ist das wurscht.

Johannes

Ja, natürlich.

Johannes

Das ist die Ausrede, die man heutzutage macht.

Johannes

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

Johannes

Oder wo man an die Grenzen kommt.

Speicher.

Johannes

Wenn du 1000 TPS machen kannst, statt einer Million und du brauchst aber eine 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 einzelnen Waschprogramme und den Stück.

Johannes

Die Maschinen haben ja heutzutage schon mehr Wahl.

Dominik

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

Dominik

Und da baut es automatisch Waschmittel raus und das perfekt für die Wäsche geeignet ist.

Dominik

Wäschern die einzelnen Wäsche sind.

Johannes

Du kannst doch schon so Waschmaschinen, Waschmittel-Cartridges kaufen.

Johannes

Und die werden dann auch so dosiert, dass es für den Waschmittelhersteller optimal ist.

Okay, okay.

Dominik

Für den Waschmittelhersteller ist es natürlich.

Dominik

Ja, ich hoffe, euch hat eure Folge, unsere Folge zu Dicts heute gefallen.

Dominik

Falls dir noch irgendwas dazu einfällt, dann kann ich das nicht so ein bisschen.

Jochen

Ja, ich glaube, Pix und sowas machen wir einfach mal wann anders ist jetzt.

Dominik

Ja, ich glaube, wir sind jetzt heute weit fortgeschritten.

Johannes

Also mein Lieblingsmodul in Python ist ja build-ins.dikt.

Johannes

Das ist mein Pick der Woche.

Okay.

Dominik

Ja, ich mache dann einfach von einem Patentik dort dickt.

Ja, okay, perfekt.

Johannes

Und Jochen macht Name-Tube.

Jochen

Ja, Atris, ja, eher.

Johannes

From Jochen Imports.

Die eigene Implementierung, ja.

Jochen

Aber genau, kann man sich auf jeden Fall auch mal angucken.

Jochen

Das lohnt sich.

Dominik

Sie haben doch Pics gemacht.

Jochen

Da haben wir doch welche gemacht.

Jochen

Ja, gut.

Ging schnell.

Ging schnell.

Dominik

Ja, dann bleibt uns gebogen.

Dominik

Hörst du uns immer, wo ihr uns hören wollt.

Dominik

Und eine schöne Zeit.

Dominik

Und bis zum nächsten Mal.

Nächstes Mal.

Genau.

Bis zum nächsten Mal.

Tschüss.