Von VS zu Python. Welche IDE ?

Gute Links und Tutorials könnt ihr hier posten.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

aviable hat geschrieben:Ein Witz: ich kann den Hexcode vom 64 besser lesen, als mancher die Tageszeitung.
Du kannst also besser Russisch lernen, indem du es nicht aus einem Lehrbuch lernst, weil du schon Französisch kannst?

Hier mal ein paar Beispiele, die zeigen, warum das die falsche Einstellung sein könnte:

Mein Lieblings-Prolog-Programm:

Code: Alles auswählen

append_dl(A - B, B - C, A - C).
Das verkettet zwei Listen. Ja, wirklich (sofern es Differenzlisten sind).

Und die zentrale Stelle in meinem in Python geschriebenen Prolog-Interpreter:

Code: Alles auswählen

    def _resolve(self, *, db, choice_points, yes, no, prune):

        choice_point = self.choice_point(db)
        choice_points.append(choice_point)
        here = len(choice_points)

        @tco
        def prune_here():
            while here <= len(choice_points):
                choice_points.pop().close()
            return no()

        @tco
        def try_next():
            for goal in choice_point:
                break
            else:
                return prune() if is_cut(self) else no()
            if goal is None:
                return yes(try_next)
            else:
                return goal.ref._resolve(
                    db=db,
                    choice_points=choice_points,
                    yes=yes,
                    no=try_next,
                    prune=prune_here,
                )

        return try_next()
Mit Continuation Passing und selbstgebastelter Tail Call Optimization.

Das Problem, siehst du, ist, dass Python-Code oft auf einem viel höheren Abstraktionsniveau lebt, als Assembler-, C- oder Basic-Code. EInige Abstraktionen sind in die Sprache schon einegebaut, wie zB. Iteratoren, Coroutinen, Dekoratoren (via First Class Functions) und Metaklassen, und man kann diese wiederum verwenden, um eigene Abstraktionen zu bauen. Python kennt keine Tail Calls? Kein Problem:

Code: Alles auswählen

import functools

def trampoline(bouncing, *args, **kwargs):
    while bouncing:
        bouncing, result, args, kwargs = bouncing(*args, **kwargs)
        yield from result

def land(*args, **kwargs):
    return None, (), args, kwargs

def throw(cont, *args, _=None, **kwargs):
    return cont, [_], args, kwargs

def bounce(cont, *args, **kwargs):
    return cont, (), args, kwargs

def tco(function):
    return functools.partial(bounce, function)
Jetzt kennt es sie.

Manche dieser Abstraktionen führen zu komplett unterschiedlichen Herangehensweisen an ein Problem. Bei deinem Beispielprogramm in Basic muss die For-Schleife wissen, bis zu welcher Zahl sie zählen muss. In Python würde man einen Generator schreiben:

Code: Alles auswählen

from itertools import islice
from somewhere import plot

def benzol(x, y, a, b, c):
    while True:
        yield x, y
        x, y = ... y ..., ... x ....  # aus den alten x und y neue x und y berechnen

def main():
    for x, y in islice(benzol(1, 1, -100, 1, 100), 20000):
        plot(350 + x, 240 + y)
yield liefert einen Wert zurück und unterbricht den Ablauf einer Funktion, bis der nächste Wert angefordert wird, woraufhin die Funktion von dort, wo sie unterbrochen wurde weiterläuft bis zum nächsten yield, oder bis zum Ende der Funktion, woraufhin der Ablauf beendet wird. Oder man fordert einfach irgendwann keinen nächsten Wert mehr an, dann wird die Generator-Funktion auch nicht mehr weiterlaufen. In dem Beispiel oben mache ich das mit islice(). Das saugt die erste 20000 Werte und liefert sie nacheinander. Würde in der for-Schleife irgendwann ein break stehen, würde auch islice() unterbrochen. Man kann so die Kontrolle, wieviele Werte erzeugt werden sollen, komplett an den Aufrufer übergeben.

Nebenbei, die Werte zweier Variablen swappen geht in Python so:

Code: Alles auswählen

x, y = y, x
Es wird keine temporäre Variable benötigt. Wie das genau funktioniert, und warum Python-Funktionen - auch wenn es anders aussieht - immer nur einen einzigen Rückgabewert haben, steht in jedem guten Tutorial.

Ansonsten empfehle ich Learn Python The Hard Way.
In specifications, Murphy's Law supersedes Ohm's.
aviable
User
Beiträge: 19
Registriert: Montag 16. März 2015, 18:41

Post #1
aviable hat geschrieben: Hier mal ein Beispiel. in GFA-Basic

Code: Alles auswählen

'
' benzol
'
x = 1
y = 1
num = 20000
zoom = 1
xver = 350
yver = 240
a = -100
b = 1
c = 100
'
For i = 1 To num
  Plot xver + x / zoom, yver + y / zoom
  xx = y - Sgn(x) * (b + x - c) ^ 1 / 8 + (b + x + c)
  yy = a - x
  x = xx
  y = yy
Next i
Mhh, falsches Beispiel
Zeit ist zwar relativ. Trotzdem dauert es.
Es ist wesentlich einfacher, die Sachen zu machen, die man kann, als die die Sachen zu tun, die man lernt.
BlackJack

@aviable: Wieso falsches Beispiel?
aviable
User
Beiträge: 19
Registriert: Montag 16. März 2015, 18:41

Nochmals: @ funktioniert nicht, weil das Forum völlig veraltet ist.
... und der vorherige post plottet mir nicht die Benzol-Kette als Graphik aus.
in python
pillmuncher hat geschrieben:Mein Lieblings-Prolog-Programm:
Hier mal ein paar Beispiele, die zeigen, warum das die falsche Einstellung sein könnte:
Was hat das denn nu mit python zu tun ?
Prolog ist auch eine Programmiersprache. Wie ada.

pillmuncher: Villeicht tu ich dir ja auch unrecht und du wolltest mir helfen.

P.S.: mit <print ("Hello World")> geht es in den IDE's
Zuletzt geändert von aviable am Montag 16. März 2015, 21:12, insgesamt 1-mal geändert.
Zeit ist zwar relativ. Trotzdem dauert es.
Es ist wesentlich einfacher, die Sachen zu machen, die man kann, als die die Sachen zu tun, die man lernt.
BlackJack

@aviable: Doch @ funktioniert. Es ist ein Hinweis für den Leser an wen der darauf folgende Text gerichtet ist. Und das funktioniert. Denn wenn man das weglassen würde kommt es schnell zu Missverständnissen weil sich falsche Gesprächsteilnehmer angesprochen fühlen können, insbesondere wenn es zwischendurch noch ein paar Beiträge gibt die entstanden sind während man seinen Beitrag geschrieben hat.

Der entsprechende Quelltext aus pillmuncher's letztem Beitrag plottet sehr wohl das was Dein BASIC-Programm plottet wenn man `somewhere.plot()` implementiert und die Ausdrücke für `x` und `y` in den Code einsetzt.
aviable
User
Beiträge: 19
Registriert: Montag 16. März 2015, 18:41

BlackJack hat geschrieben: Der entsprechende Quelltext aus pillmuncher's letztem Beitrag plottet sehr wohl das was Dein BASIC-Programm plottet wenn man `somewhere.plot()` implementiert und die Ausdrücke für `x` und `y` in den Code einsetzt.
Das ist genau das, was ein Anfänger versteht. /ironic:off
Das ist doch kein funktionsfähiges programm, das sind snipsel.
BlackJack hat geschrieben:@aviable: Doch @ funktioniert. Es ist ein Hinweis für den Leser an wen der darauf folgende Text gerichtet ist. Und das funktioniert. Denn wenn man das weglassen würde kommt es schnell zu Missverständnissen weil sich falsche Gesprächsteilnehmer angesprochen fühlen können, insbesondere wenn es zwischendurch noch ein paar Beiträge gibt die entstanden sind während man seinen Beitrag geschrieben hat.
Nur mal so zum ForumUpdate: Heutzutage bedeutet im Forum @Name das da auch ne neue Mitteilung in <Neue Nachrichten> landet.
Innerhalb eines Themas reicht auch <Name>
Du hast 25.000 posts. Und wenn ich dich ganz persönlich brauche, nämlich dich....
nehm ich das @. Dann hast du eine PM von mir. Ich hab dich in <dem und dem Thema> erwähnt.

Nix für ungut.
Zeit ist zwar relativ. Trotzdem dauert es.
Es ist wesentlich einfacher, die Sachen zu machen, die man kann, als die die Sachen zu tun, die man lernt.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

aviable hat geschrieben:
pillmuncher hat geschrieben:Mein Lieblings-Prolog-Programm:
Hier mal ein paar Beispiele, die zeigen, warum das die falsche Einstellung sein könnte:
Was hat das denn nu mit python zu tun ?
Prolog ist auch eine Programmiersprache. Wie ada.

pillmuncher: Villeicht tu ich dir ja auch unrecht und du wolltest mir helfen.
Dann schreibe ich es nochmal etwas expliziter: Wenn man Kenntnisse in Programmiersprachen hat, die letztlich alle dasselbe Rechenmodell repräsentieren, wird man mit deiner Methode - einfache Programme in der neuen Programmiersprache anschauen - nicht weit kommen, wenn diese neue Programmiersprache ein anderes Rechenmodell repräsentiert. Python ist zwar im Gundsatz imperativ, genauso wie Assembler, C und Basic, aber eben auch objektorientiert und funktional. Aus der Perspektive des imperativen Paradigmas wird man alles in Python als einfach ansehen, was dem nahekommt, was man schon kennt, dh. Programmabläufen wie diesem:

Code: Alles auswählen

xs = [1, 2, 3, 4, 5]
ys = []
for i in range(len(xs)):
    y = xs[i] * 3
    ys.append(y)
print(ys)
(Variante 0)
In Python würde man sowas aber nicht programmieren, sondern sowas:

Code: Alles auswählen

xs = [1, 2, 3, 4, 5]
ys = [x * 3 for x in xs]
print(ys)
(Variante 1)
Man verwendet Variablen nicht als "Datentöpfchen" wo man Sachen für später ablegt, sondern man betrachtet sie als Namen von Werten zu gewissen Zeitpunkten. Oft werden Variablen nur einmal mit einem Wert initialisiert, den sie dann für ihre gesamte Lebenszeit behalten. Da Python hat viel mehr Verwandtschaft mit Lisp als mit C oder Basic. Genau wie in Lisp sind Funktionen in Python auch nur Werte, die herumgereicht werden können. Ich hätte das Programm auch so schreiben können:

Code: Alles auswählen

def mul3(n):
    return n * 3
xs = [1, 2, 3, 4,5]
ys = list(map(mul3, xs)
(Variante 2)
Oder so:

Code: Alles auswählen

from functools import partial
from operator import mul
mul3 = partial(mul, 3)
xs = [1, 2, 3, 4,5]
ys = list(map(mul3, xs)
(Variante 3)
Als erfahrener Pythonista würde man zwar beides in diesem Fall nicht machen, weil die Variante 1 viel einfacher ist, aber es gibt Anwendungsfälle, wo man mit Varianten 2 und 3 vergleichbaren Code verwenden würde. Nämlich dann, wenn sie für ein bestimmtes Problem die richtige Abstraktion darstellen. Wenn man allerdings nur Code kennenlernt, den man selbst als einfach ansieht (also solchem, der dem nahekommt, was man schon kennt), dann wird man manche Dinge wesentlich komplizierter lösen, als es sein müsste (oder gar nicht, weil zu komplex), weil einem die vereinfachenden Abstraktionen unbekannt bleiben.
Ein gutes Tutorial liefert mehr, als bloß zu zeigen, wie die Namen der basalen Operationen und Datenstrukturen sind, sondern zeigt auch, welche Abstraktionen in eine Sprache eingebaut sind und wie und unter welchen Bedingungen man sie verwenden sollte.

Das Prolog-Beipiel sollte übrigens genau das illustrieren. Einfach durch die Anwendung des Wissens, das man über Assembler/C/Basic/Python/... hat, wird man nie verstehen, wie dieses Programm funktioniert. Als ich Prolog gelernt habe, habe ich dieses Programm - ich erinnere mich genau, weil darauf eines meiner größten Erleuchtungserlebnisse folgte - zwei Stunden angestarrt. Es stand in einem der besten Computerbücher überhaupt, The Art of Prolog, von Sterling und Shapiro. Es besitzt dieselbe geistige Reinigungskraft wie The Structure and Interpretation of Computer Programs von Abelson und Sussman. Vielleicht irritiert mich dein Ansatz auch deswegen so sehr, weil ich Bücher liebe und nicht verstehen kann, warum jemand nicht lesen mag. Wenn sich der Autor doch bereits die Mühe gemacht hat, alles wichtige hinzuschreiben, und wenn das Buch gut ist, sogar auf lehrreiche und interessante Weise.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@aviable: Es mag nicht lauffähig sein aber es reicht um zu zeigen dass es in Python anders aussieht als in dem gezeigten BASIC-Dialekt. Insbesondere das einem BASIC, Assembler, und C++-Kenntnisse nicht weiterhelfen wenn das Python-Programm Sachen verwendet die in diesen Sprachen nicht existieren, wie Generatorfunktionen und alles mögliche an Werkzeugen das eher aus der funktionalen Ecke kommt.

Hier mit plotten. Keine Ahnung ob da die richtige Grafik heraus kommt.

Code: Alles auswählen

from __future__ import absolute_import, division, print_function
try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk
from itertools import islice


def sgn(x):
    if x == 0:
        return x
    return -1 if x < 0 else 1


def calculate(x, y, a, b, c):
    while True:
        yield x, y
        x, y = y - sgn(x) * (b + x - c) / 8 + (b + x + c), a - x


def plot(image, coordinates, zoom):
    x_offset = image.width() / 2
    y_offset = image.height() / 2
    for x, y in coordinates:
        image.put('black', (int(x_offset + x / zoom), int(y_offset + y / zoom)))


def main():
    root = tk.Tk()
    image = tk.PhotoImage(width=700, height=480)
    tk.Label(image=image, background='white').pack()
    plot(image, islice(calculate(1, 1, -100, 1, 100), 20000), 1.5)
    root.mainloop()


if __name__ == '__main__':
    main()
Bezüglich des @: Welches Forum macht das denn so? Kann es sein dass Du hier Foren mit Socialmedia-Plattformen verwechselst? phpBB ist eine recht verbreitete Forensoftware. Ich kenne die @-Adressierung jedenfalls aus mehreren Foren, auch auf Basis anderer Software als phpBB, und keines davon verschickt daraufhin private Nachrichten oder E-Mails. Das kenne ich nur von Twitter und Co.
Zuletzt geändert von BlackJack am Dienstag 17. März 2015, 11:05, insgesamt 1-mal geändert.
Grund: Korrektur der Formel.
aviable
User
Beiträge: 19
Registriert: Montag 16. März 2015, 18:41

pillmuncher hat geschrieben:
aviable hat geschrieben:Ein Witz: ich kann den Hexcode vom 64 besser lesen, als mancher die Tageszeitung.
Du kannst also besser Russisch lernen, indem du es nicht aus einem Lehrbuch lernst, weil du schon Französisch kannst?
OMG, nachdem ich mein 1. richtiges Programm in Python gelesen habe, kann ich euch verstehen.
Das ist ja wirklich ganz anders.
Trotzdem bleibe ich weiterhin der Meinung, guten Code zu lesen hilft mehr als 100 Seiten Tutorial.

BlackJack:
- irgendwie ist das ganz schön OT. Vielleicht sollte der Titel zu < Von VS zu Python. Mein 1. Programm > geändert werden
- auch dein letztes update ist nicht lauffähig. Das liegt natürlich allerdings daran, das ich davon noch gar nichts verstehe.
Danke, für eure Geduld mit einem Anfänger.
- Das letzte Jahr war ich hauptsächlich in 2 Foren unterwegs. In dem einen weis ich; wir haben 1 Developer und 1 SuperMod ( Sourceforge )
Da passiert ganr nichts.
Und das andere, (mußte ich auch erstmal raussuchen) ist sowas hier. Die machen das. Deshalb war ich wegen dem @ etwas irritiert, ohne PM

Und wegen dem hard way: Die wollen $. Isch hab aber nur €.
Zeit ist zwar relativ. Trotzdem dauert das. ATM, Kapitel 1.3 Schlangengerangel und das.
Zeit ist zwar relativ. Trotzdem dauert es.
Es ist wesentlich einfacher, die Sachen zu machen, die man kann, als die die Sachen zu tun, die man lernt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

aviable hat geschrieben:Trotzdem bleibe ich weiterhin der Meinung, guten Code zu lesen hilft mehr als 100 Seiten Tutorial.
Das ist doch Unfug. Natürlich ist Code Lesen hilfreich, aber erst wenn man den Code versteht. Oder mal bei dem Russischbeispiel zu bleiben. Du fängst doch auch nicht an russische Bücher zu lesen (oder gar zu schreiben), bevor die Grundlagen gelernt hast. Du scheinst so ein typischer Fall von "ich will das können, aber nichts dafür machen" zu sein.
aviable hat geschrieben:Und wegen dem hard way: Die wollen $. Isch hab aber nur €.
Es gibt eine kostenlose HTML-Version. Mit jeder Kreditkarte kannst du auch in Dollar zahlen. Und: Es ist ja nicht so, als wenn es bei Amazon das Buch nicht geben würde...
Das Leben ist wie ein Tennisball.
BlackJack

@aviable: Das Programm läuft bei mir, sowohl mit Python 2.7 als auch 3.3 ausprobiert. Wenn Du jetzt sagst das ist nicht lauffähig, müsstest Du schon eine konkrete Fehlermeldung liefern.
aviable
User
Beiträge: 19
Registriert: Montag 16. März 2015, 18:41

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Program Files (x86)\ActiveState Komodo IDE 8.5\lib\support\dbgp\bin\py3_dbgp.py", line 310, in <module>
    sys.exit( main(sys.argv) )
  File "C:\Program Files (x86)\ActiveState Komodo IDE 8.5\lib\support\dbgp\bin\py3_dbgp.py", line 284, in main
    dbgp.client.runWithoutDebug(args, interactive, host, port, idekey, logLevel)
  File "C:\Program Files (x86)\ActiveState Komodo IDE 8.5\lib\support\dbgp\python3lib\dbgp\client.py", line 4016, in runWithoutDebug
    h_execfile(debug_args[0], debug_args, module=main)
  File "C:\Program Files (x86)\ActiveState Komodo IDE 8.5\lib\support\dbgp\python3lib\dbgp\client.py", line 675, in __init__
    exec(contents, globals, locals)
  File "<string>", line 1
     from __future__ import absolute_import, division, print_function
     ^
 IndentationError: unexpected indent
Weil ich i.M. plan- und ziellos alles was mit Python zu tun hat installiert habe, werde ich mein System nochmal neu ansetzten.
Frage: Sollte 2.7 mit auf mein neues System, oder reicht 3.4 ?
Als IDE werde ich: PyCharm, Komodo, Ninja und eric6 installieren.
Muß QT5 mitinstalliert werden, oder ist das in den Installern drin ?
PS: In IDLE:commandline habe ich das Programm nicht probiert.
-----------------
EyDu hat geschrieben:Es gibt eine kostenlose HTML-Version.
Berliner Schnauze, dat Herz am rechten Fleck ....doch nischt dahinter. Wo ist der Link ?
Zeit ist zwar relativ. Trotzdem dauert es.
Es ist wesentlich einfacher, die Sachen zu machen, die man kann, als die die Sachen zu tun, die man lernt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

``IdentationError`` - was mag das bedeuten? ;-)

Tipp: Bei Python gehören Enrückungen zur Syntax und können oft *nicht* beliebig gewählt werden - im Gegensatz zu anderen Sprachen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@aviable: Und vor allem ist dort in meinem Code gar keine Einrückung, die muss bei Dir da irgendwie reingekommen sein.

Den Link zur kostenlosen HTML-Version hat pillmuncher doch schon angegeben‽
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:``IdentationError`` - was mag das bedeuten? ;-)

Tipp: Bei Python gehören Enrückungen zur Syntax und können oft *nicht* beliebig gewählt werden - im Gegensatz zu anderen Sprachen.
Damit der Punkt auch garantiert ankommt: Das ist ein Grundbestandteil von Python als Sprache. Ohne Einfuehrung in die Sprache kann man die Sprache aber natuerlich nicht verstehen. Das ist wie das Leerzeichen zwischen Woertern, nicht alle Sprachen haben das, aber im Deutschen kommt sonst nichts lesbares heraus.
aviable
User
Beiträge: 19
Registriert: Montag 16. März 2015, 18:41

BlackJack hat geschrieben:@aviable: Und vor allem ist dort in meinem Code gar keine Einrückung, die muss bei Dir da irgendwie reingekommen sein.
Edit: War mit copy und paste. Lag wohl daran. Und das letzte Bild( irgendwo hab ich noch einen Scrennshot davon ) sieht schon ganz gut aus.
Nur zugucken, wie es sich aufbaut... das war der Trick an der Sache.
Dar Atari hat damals 35 Min. gebraucht. Hab dann mal mit einigen (Modern)Basicen ( also, verschiedene Basic-Dialekte unter Win ) getestet. Dauerte 35 sec.
Natürlich ist meine Neugier als Anfänger jetzt ziemlich groß. Wie schnell macht das Python ?
Habe noch ein paar Routinen mit schöneren Bildern. Ist alles Atari-GFA und müßte erst konvertiert werden.

Den Link zur kostenlosen HTML-Version hat pillmuncher doch schon angegeben?
Wer lesen kann, ist klar im Vorteil. :)
cofi hat geschrieben: Das ist wie das Leerzeichen zwischen Woertern, nicht alle Sprachen haben das, aber im Deutschen kommt sonst nichts lesbares heraus.
OhHa, Python in https://de.wikipedia.org/wiki/Whitespac ... sprache%29 könnte lustig werden.
Zeit ist zwar relativ. Trotzdem dauert es.
Es ist wesentlich einfacher, die Sachen zu machen, die man kann, als die die Sachen zu tun, die man lernt.
Antworten