Mit der Bitte um Hilfe: FRACTAL.BAS in Python?

  • Da mein 10 aehriger Sohn dies Jahr Python n der Schule gelert bekommt, habe ich mir mal folgendes 3 Stunden Einfuehrungsvideo angesehen.


    Ermutigt durch die ersten Erfolge ;) dachte ich, dass ich das Mandelbrot FRACTAL.BAS umsetzen koennte - es ist ja nicht so lang.

    Nur komme ich mit den GOTOs und Schleifen unter Python ins straucheln :(


    Kann da evtl. mal ein Python-kundiger draufschauen, wo mein "Knoten" in den Gedanken ist?


    Bei der Ausgabe wird einfach nur der ASCII-Wert raufgezaehlt und die Zeile ist viel zu lang (beim .BAS unter 80 Zeichen)


    Also hier das .BAS


    und mein klaeglicher Python-Versuch aus der Windows-Thonny-IDE:


  • Von Python habe ich wenig Ahnung, aber in C++ würde ich das ungefähr so machen:


  • probier mal das


    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • range (-38,22) x


    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Von Python habe ich wenig Ahnung, aber in C++ würde ich das ungefähr so machen

    flowerking Vielen Dank :) Das hat schon mal SEHR geholfen! ;)


    Die Anzeige / Zahlen / Buchstaben sind zwar noch nicht ganz wie bei der BASIC-Variante,
    aber nun laesst sich scon mal was erkennen vom FRACTAL / Mandelbrot:



    Hier mein -jetzt- aktueller Paython-Code, nach dem einfuegen Deiner Vorschlaege.


  • Ich würde es so machen:

  • probier mal das

    Deine print-syntax mag mein Python 3.10.6 irgendwie nicht :(

    Aber mit leichten Anpassungen klappt es ;)
    Die Buchstaben/Zahlen kommen nun schon naeher dran, aber sind noch nicht 100% die gleichen.

    Sind das evtl. sowas wie Rundungsfehler? :)


  • Ich würde es so machen:

    Danke dass sind die richtigen Buchstaben/Zahlen ;)


    Lag wohl am ca=x*0.0458 (bei Dir) und ich hatte woander falsch uebernommen die ca=x*0.0448



  • Hübsch. Die Variante von MJGraf ist natürlich schon irgendwie "eleganter". Gerade so Sachen wie zhz() sind ja eigentlich dann schon bißchen albern. Das print läßt sich ja nun wirklich einfach so reinschreiben in main(). Allerdings wäre es natürlich noch hübsch, wenn man dieses InnerLoop Flag noch wegbekäme. Aber das Thema hatten wir, glaub ich, bei der BASIC Variante schonmal irgendwann.


    Ist immer wieder erstaunlich wie wenig Formel das ist - für das Riesen-Tam-Tam (also das Aufsehen und die Erregung), den dieser Apfelmann so gemacht hat. Und was die Leute vor ihren Rechnern gewartet haben, bis es dann mal fertig war (hochauflösend, versteht sich).



    Mußt Du eigentlich diese Typwandlungen wirklich jedesmal machen ? Das sieht irgendwie seltsam aus - und kostet evtl. sogar Zeit. Die ganzen float() Sachen sind gemeint. Python, weiß das doch eh beim Zuweisen. Bei flowerking ist es lustigerweise genau andersherum, da sind sogar die int echte floats.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Ich habe versucht, möglichst dicht am Original zu bleiben. Lediglich in zwei Punkten bin ich von der Vorlage abgewichen: den auch in Basic schon uneleganten Sprung aus der Schleife habe ich durch break und das innerLoopCompleted-Flag ersetzt, und die ein-Zeichen-Prints durch den Zusammenbau des line-Strings.

    "Pythonesquer" hätte man die Iteration selbst und das Mapping der Anzahl der Iterationen auf das auszugebende Zeichen jeweils in eine Funktion kapseln können, und vielleicht auch noch die Koordinatentransformation etwas flexibler gestalten.


    Die Typumwandlungen sind eigentlich komplett überflüssig: Da x und y (Integer) mit Float-Konstanten multipliziert werden, sind ca und cb automatisch Floats, damit auch a, b und t.

  • Ha, hab ichs doch gewußt. ;) Und da die Sachen in der Schleife jedesmal mitlaufen, wird das auch bißchen merklich sein. Gerade, wo doch der Guidol nicht drumherum kommen wird, das auch mal auf einem seiner vielen kleinen Rechnerchen auszumessen.


    Ich glaube der Niklaus Wirth, würde diese automatische Typwandlung unmöglich finden. Kann man sicherlich auch irgendwo ein schönes Statement finden. Die Herren vom großen C sicherlich auch (Ritchie, Thompson). Ist schon ein bißchen abenteuerlich, daß man das machen kann - aber nicht muß. Das schöne an Python ist dafür aber, daß es eben gefühlt dadurch ein schöner Basic Nachfolger ist; auch wenn das sicher nicht die Absicht war.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Gerade so Sachen wie zhz() sind ja eigentlich dann schon bißchen albern. Das print läßt sich ja nun wirklich einfach so reinschreiben in main().


    Mußt Du eigentlich diese Typwandlungen wirklich jedesmal machen ? Das sieht irgendwie seltsam aus - und kostet evtl. sogar Zeit. Die ganzen float() Sachen sind gemeint. Python, weiß das doch eh beim Zuweisen. Bei flowerking ist es lustigerweise genau andersherum, da sind sogar die int echte floats.

    Im Nachhinein ist es natuerlich ein wenig albern ;)
    Es war - mit den Funktionen - ein erster Versuch (nach dem Python-Crashkurs) die GOTOs der BASIC Version nachzubilden/umgehen. Ausserdem war es eine Moeglichkeit das gelernte vom Kurs anzuwenden/ zu nutzen und ein Gefuehl fuer Funktionen zu bekommen, da ich doch eher aus der alten GW-BASIC Ecke komme (und davon einige Sachen bei MBASIC unter CP/M vermisse).


    Zum Schluss habe ich dann auch im Code die Inhalte der Funktionen wieder in main() uebernommen.


    Die Definition der ganzen floats, war ein Versuch raus zu finden, ob die falsche Ausgabe evtl. daran scheitert, weil ich nicht wusst was Python selbst erkennt oder konvertiert (und es in der .PAS (Turbo Pascal) Version auch definiert wurde - weil man es da eher musste).

  • Gerade, wo doch der Guidol nicht drumherum kommen wird, das auch mal auf einem seiner vielen kleinen Rechnerchen auszumessen.


    Das schöne an Python ist dafür aber, daß es eben gefühlt dadurch ein schöner Basic Nachfolger ist; auch wenn das sicher nicht die Absicht war.

    Ach - ich glaube bei der .py-Version spare ich mir den Vergleich, da echtes Python nur auf "groesseren" Systemen laeuft und fuer MicoPython gibt es nicht ganz so viel Hardware, dass sich ein Vergleich lohnt ;)

    Mit Thonny auf Windows kann man Python noch beim zeichnen des Apfelmaennchens zusehen....starte ich das ganze auf einem kleinen SCB (NanoPi 64) dann ist nach dem laden von python3 das Apfelmaennchen unterhalb einer Sekunde auf dem Bildschirm.


    Bis jetzt hatte ich mir Python nur am Rande mal kurz angesehen, weil es mir etwas "komisch" erschien nur durch Einrueckungen Code-Bloecke zu trennen und nicht durch begrenzende End-Anweisungen.


    Aber da die Schulen anstatt BASIC oder Turbo Pascal den kleinen Schuelern jetzt eher Python beibringen, wollte ich fuer meinen Sohn wenistens etwas hilfreich sein, wenn er mal fragt.


    Die automatische Konvertierung der Variablen kommt mir als BASIC-Programmierer natuerlich zuvor :)

  • Ach - ich glaube bei der .py-Version spare ich mir den Vergleich, da echtes Python nur auf "groesseren" Systemen laeuft und fuer MicoPython gibt es nicht ganz so viel Hardware, dass sich ein Vergleich lohnt ;)

    Mit Thonny auf Windows kann man Python noch beim zeichnen des Apfelmaennchens zusehen....starte ich das ganze auf einem kleinen SCB (NanoPi 64) dann ist nach dem laden von python3 das Apfelmaennchen unterhalb einer Sekunde auf dem Bildschirm.


    Na, ich wollte das auch nicht "einfordern". Aber wie man sieht ist es ja schon passiert. :)


    MicroPhyton wollte ich ja auch mal ansehen, aber da es immer mehr wird, was man sich "mal ansehen" wollte, fällt das sicherlich auch durchs Raster.




    Bis jetzt hatte ich mir Python nur am Rande mal kurz angesehen, weil es mir etwas "komisch" erschien nur durch Einrueckungen Code-Bloecke zu trennen und nicht durch begrenzende End-Anweisungen.


    Aber da die Schulen anstatt BASIC oder Turbo Pascal den kleinen Schuelern jetzt eher Python beibringen, wollte ich fuer meinen Sohn wenistens etwas hilfreich sein, wenn er mal fragt.


    Ja, das mit dem Formatieren ist ein wenig seltsam. Es wird dann auch irgendwie uneindeutig, wenn man da eine reine Textwüste draus macht, z.B. bei echtem Kopaktieren durch Leerzeichenentfernen oder so. Ist halt nicht mehr vorgesehen.

    Es gibt aber auch schöne Sachen, wie z.B. das Komma am Print für "es kommt noch was". Das ist irgendwie natürlicher als das Basic Semikolon für die gleiche Funktion. Letztlich ist es aber eh egal und nur eine "Stilfrage".


    Daß Schulen heute Python machen ist absolut RICHTIG. Das andere ist einfach durch und kommt auf keinem modernen System mit. Letztlich ist Python sowas, was Modula oder Oberon hätten werden können, wenn die nicht so verkopft und "stringent" wären. Und funktional kann Python auch alles, was diese beiden können. Und dazu gibt es wirklich riesige Standardbibliotheken für alle Mögliche und Unmögliche.



    Vielleicht solltest Du Dir einfach ein gutes Buch holen ?

    Oder Du läßt Dir immer zeigen, was im Informatikunterricht dran war. Das hat für beide einen Effekt. Du lernst mithin eine neue Sprache über ca. 1 Jahr und es gibt außerdem die Möglichkeit, daß er Dir was zeigen kann. Man muß als "dann Schüler" natürlich darauf verzichten können können, alles besser wissen zu wollen, weil man es mit Turbo Pascal oder GW ja anders gemacht hat.

    Die prinzipiellen Sachen ändern sich aber durch die Sprache eher nicht - soll heißen: Suchalgorithmen werden immer noch ähnlich gemacht und Grafikspielereien oder Mathesachen (Zahlenreihen, MonteCarlo Zufall, Apfelmännchen etc.).



    Die automatische Konvertierung der Variablen kommt mir als BASIC-Programmierer natuerlich zuvor :)


    Genau das ist ja das Problem. :)

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Achso, mach mal ein Upgrade. Das mit den komischen Klammern bei print etc. ist möglicherweise einfach mal geändert worden. Es gibt da bei Python so einen ziemlichen Versionssprung, zwischen ?? und ??, wo die Sprache nochmal bißchen umdefiniert worden ist. Es macht j anun vmtl gar keinen Sinn, mit Zeug von 2010 oder so anzufangen, wenn man weiß, daß es aktuell anders benutzt wird. Bibliotheken und sowas sind mittlerweile wahrscheinlich ALLE umgebaut. Das geht in dem Universum da immer sehr schnell, aufgrund von vorhandener Menschenmasse, die das nutzt (kann man von TP und Logo heute nicht mehr so sagen; und auch Modula-2 hat wohl in letzter Zeit einiges an Nutzern verloren).



    Im Anhang mal was zum Reinschauen. Gibt da aber auch Anderes und Übersichtlicheres. Python for Dummies oder sowas aus einem "richtigen" Verlag.

  • Vielleicht solltest Du Dir einfach ein gutes Buch holen ?
    Im Anhang mal was zum Reinschauen. Gibt da aber auch Anderes und Übersichtlicheres. Python for Dummies oder sowas aus einem "richtigen" Verlag.

    Das habe ich vorher schon mal getan - allerdings sind viele Buecher (auch fuer Anfaenger beschriebene) doch weit ueber dem, was wir frueher an BASIC-Buechern hatten - leider auch bei der Wortwahl und den Zielen.
    Deshalb fand ich den YT-3.5-Stunden-Kurs nicht schlecht, dass war im wahrsten Sinne die "BASICs" ;)
    Als .PDF habe ich 6 Buecher gefunden, die mir vom Stil eher zusagten:


    Zitat von ThoralfAsmussen

    Achso, mach mal ein Upgrade. Das mit den komischen Klammern bei print etc. ist möglicherweise einfach mal geändert worden. Es gibt da bei Python so einen ziemlichen Versionssprung, zwischen ?? und ??, wo die Sprache nochmal bißchen umdefiniert worden ist.

    Dein .PDF-Buch nutzt aber auch bei PRINT noch die Klammern.

    Ausserdem Upgrade? Meine Thonny-IDE kommt mit python 3.10.6 und aktuell auf python.org ist 3.10.7

    Also wohl im gruenen Bereich.


    Mit dem grossen Versionsspring meinst Du evtl. vom alten v2.x auf das neue v3.x

    Selbst in den Linux/armbian Distributionen haben die nun auf v3.x umgestellt, dehalb kann man meist python nicht mehr mit python aufrufen, denn das war die v2.x - sondern muss nun python3 aufruegen fuer die v3.x

    (ausser man setzt sich einen symolic link : ln -s /usr/bin/python3 /usr/bin/python :) )


    Schoen waere, wenn man nachlesen koennte was nun aktuell ist.

    Mein v3.x mochte jedenfalls das Komma nicht, dafuer aber ,end="" in der Klammer um das default Ende-Zeichen zu erstetzen.

  • Learn Python in One Day ... klingt doch angenehm. :)


    Bei https://docs.python.org/3.8/tutorial/ gibt es auch ein offizielles Buch.


    Ich habe mir mal die kleine Kurzanleitung "Python - kurz und gut" besorgt. Die ist für vieles schonmal sehr hilfreich, setzt aber voraus, daß man schonmal was anderes benutzt hat. Als absolute Beginner Text taugt das so gar nicht.


    Mit den YT Kursen kann ich immer nicht soviel anfangen. Aber das ist wahrscheinlich das, was Leute um die 15 heute vmtl. als Erstes mal anschauen würden. Da gibt es ja wohl auch Einiges an Auswahl.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Ich habe mir mal die kleine Kurzanleitung "Python - kurz und gut" besorgt. Die ist für vieles schonmal sehr hilfreich, setzt aber voraus, daß man schonmal was anderes benutzt hat. Als absolute Beginner Text taugt das so gar nicht.

    In "Python - kurz und gut" habe ich mal bei einer Vorschau reingesehen - und wie Du schreibst ist dies nicht fuer mich als Beginner :(


    Aber - da sehen wir, dass Dein PRINT noch 2.x Syntax ist und die runden Klammern bei 3.x dazu gekommen ist:


    o'Reilly hat aber auch einen ca. 1600 Seiten dicken Klopper "Learning Python" , da werden dann auch mal einige Beispiele zu den Befehlen gezeigt - und dies sogar im Vergleich x2.x und v3.x :)

  • Das ist in dem Fall dann eigentlich eine "Verschlimmbesserung". Fand das eigentlich immer ganz angenehm ohne Klammern. Ist ein 2.7.9 ; da muß wohl ich upgraden. Ist aber eher so fürs Rumbasteln drauf.



    Ich finde das ja immer bißchen ungeschickt, wenn man Sprachen im Nachhinein nochmal an solchen Stellen umbaut. Dort scheint es aber zumindest die Leute nicht verschreckt zu haben. Erfreut sich immer noch hoher Beliebtheit.



    Ich wüßte ehrlich gesagt auch nicht, was man heute für eine Schule als Sprache wirklich empfehlen sollte. Python ist aber sicherlich ganz auf den vorderen Plätzen dabei.

    Habe mal in einem podcast die Empfehlung zu JavaScript gehört. Letztlich ist es aber vielleicht einfach auch egal. Es gibt da aber Einiges, mittlerweile.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Ich wüßte ehrlich gesagt auch nicht, was man heute für eine Schule als Sprache wirklich empfehlen sollte. Python ist aber sicherlich ganz auf den vorderen Plätzen dabei.

    Habe mal in einem podcast die Empfehlung zu JavaScript gehört. Letztlich ist es aber vielleicht einfach auch egal. Es gibt da aber Einiges, mittlerweile.

    Was spricht gegen Java? Das ist immer noch eine der am häufigsten verwendeten Sprachen.

    Wenn das so weitergeht mit Javascript und Python, dann sind wir wohl bald wieder auf Niveau von BASIC. Wozu braucht dem Deklaration? Was früher der Compiler schon angemeckert hat, das fixen wir jetzt alles in tagelangen Debugsessions. ;)

    • i-Telex 7822222 dege d

    • technikum29 in Kelkheim bei Frankfurt

    • Marburger Stammtisch

    Douglas Adams: "Everything, that is invented and exists at the time of your birth, is natural. Everything that is invented until you´re 35 is interesting, exciting and you can possibly make a career in it. Everything that is invented after you´re 35 is against the law of nature. Apply this list to movies, rock music, word processors and mobile phones to work out how old you are."

  • Genau dazu gibt es von dem Dijkstra ein lustiges Statement. Sinngemäß, und wenn ich mich recht erinnere, geht das so, daß man mit einer unklaren, aber auhc mit einer hochdefinierten, Sprache allerlei Sachen bauen kann, die auch funktionieren, bis sie mal nicht mehr gehen, quasi grundlos in dem Moment. Und die heutige Lösung dafür wäre, daß man Fehlerüberwachungen und Tests mit einbaut; aber daß man auch mit beliebig vielen und komplexen Tests niemals(!) ein beweisbares Funktionieren sicherstellt.


    Kam auf jeden Fall ganz schön granitg rüber und ist schon durchaus was älter.

    Von Scrum und Co war da noch lange keine Rede.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Ich wollte noch bemerken, dass ich floats für die äusseren Schleifen benutzt habe, weil mit diesen mit diesen Werten gerechnet wird und ich die vielen Typumwandlungen vermeiden wollte. Eigentlich müssten die konstanten Werte im Quelltext auch als float gekennzeichnet werden. Z.B. ist 12.0 eigentlich eine double-Konstante, 12.0f wäre dann die float-Konstante. Ich hätte alles in double machen können, aber ich glaube, das hat in diesem Fall keinen Mehrwert.

    Ich war am Wochenende auf der DoReCo und habe dass nur mal "schnell" zwischendurch gemacht. Zum Glück hat da das WLAN funktioniert. ;)

  • Ich hab mal den code von RE: Mit der Bitte um Hilfe: FRACTAL.BAS in Python? durchgekaut und raus gekommen ist das:


    Kommt dann das raus:


  • Das ist aber nicht wirklich Mandelbrot mit der Abfrage "z > zoom", wenn zoom nicht genau 4 ist...

    Die eigentliche Frage beim Mandelbrot-Set ist, ob die Folge divergent ist oder nicht.

    Ist a² + b² irgendwann einmal > 2.0, dann ist die Folge sicher divergent und die Untersuchung kann abgebrochen werden.

    Die Anzahl der Iterationen ergibt dann die "Farbe".

    Ansonsten kann die Untersuchung ewig dauen und man macht daher eine Begrenzung der Iterationsstufen. Die dann genommende Farbe ist üblicherweise eine, welche bei den Iterationsabbrüchen nicht verwendet wird. Diese Punkte könnten dann zum Mandelbrot Set gehören, dies ist aber nicht sicher.