For Beginners - Mein erstes Programm

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
skaterdomi
User
Beiträge: 12
Registriert: Dienstag 7. Dezember 2004, 16:48

ich habe ein KLEINES python-zeichenprogramm entwickelt.
es ist für die leute gedacht, die wie ich gerade erst mit er pythonprogrammierung begonnen haben.

es ist ziemlich lang,weil nicht viele definitionen vorkommen, aber es ist ja auch mein 1. progi.

Code: Alles auswählen

from turtle import *
from random import randrange

def quadrat():
    forward(80)
    left(90)
    forward(80)
    left(90)
    forward(80)
    left(90)
    forward(80)
    left(90)

def dreieck():
    forward(80)
    left(120)
    forward(80)
    left(120)
    forward(80)
    left(120)

def rechteck():
    forward(80)
    left(90)
    forward(30)
    left(90)
    forward(80)
    left(90)
    forward(30)
    left(90)

def muster():
    forward(randrange(10,100))
    left(randrange(10,100))
    forward(randrange(10,100))
    left(randrange(10,100))
    forward(randrange(10,100))
    left(randrange(10,100))
    forward(randrange(10,100))
    left(randrange(10,100))
    forward(randrange(10,100))
    left(randrange(10,100))
    forward(randrange(10,100))
    left(randrange(10,100))
    forward(randrange(10,100))
    left(randrange(10,100))
    forward(randrange(10,100))

def achteck():
    forward(50)
    left(45)
    forward(50)
    left(45)
    forward(50)
    left(45)
    forward(50)
    left(45)
    forward(50)
    left(45)
    forward(50)
    left(45)
    forward(50)
    left(45)
    forward(50)
    left(45)

print "DAS IST MEIN KLEINES ZEICHENPROGRAMM!!!"
print "---------------------------------------"
print "---------------------------------------\n"

user = raw_input("Wie heisst du?\n")
print "Hallo %s!" %user
print ""

frage1 = raw_input("Willst du etwas zeichnen? ja/nein?\n")
print ""
def spiel():
    if frage1 != "ja":
        print "OK!\nAuf Wiedersehen!"

    if frage1 == "ja":
        print "In welcher Farbe möchtest du zeichnen?"
        print "Für blau gib 1 ein."
        print "Für rot gib 2 ein."
        print "Für grün gib 3 ein."
        print "Für gelb gib 4 ein."
        frage2 = raw_input()
        if frage2 == "1":
            color("blue")
            print "Du hast die Farbe BLAU gewählt.\n"
        if frage2 == "2":
            color("red")
            print "Du hast die Farbe ROT gewählt.\n"
        if frage2 == "3":
            color("green")
            print "Du hast die Farbe GRÜN gewählt.\n"
        if frage2 == "4":
            color("yellow")
            print "Du hast die Farbe GELB gewählt.\n"

    if frage1 == "ja":
        print "Mit welcher Dicke möchtest du malen?"
        print "Für DÜNN gib 1 ein."
        print "Für DICK gib 2 ein."
        print "Für SEHR DICK gib 3 ein."
        frage3 = raw_input()
        if frage3 == "1":
            width(5)
            print "Du hast die Dicke DÜNN gewählt.\n"
        if frage3 == "2":
            width(10)
            print "Du hast die Dicke DICK gewählt.\n"
        if frage3 == "3":
            width(30)
            print "Du hast die Dicke SEHR DICK gewählt.\n"

    if frage1 == "ja":
        print "Wie schnell möchtest du malen?"
        print "Für LANGSAM gib 1 ein."
        print "Für SCHNELL gib 2 ein."
        frage5 = raw_input()
        if frage5 == "2":
            tracer(0)
            print "Du möchtest SCHNELL zeichnen.\n"
        if frage5 == "1":
            tracer(1)
            print "Du möchtest LANGSAM zeichen.\n"

    if frage1 == "ja":
        print "Was möchtest du zeichnen?"
        print "Für ein Quadrat gib 1 ein."
        print "Für ein Dreieck gib 2 ein."
        print "Für ein Rechteck gib 3 ein."
        print "Für ein seltsames Muster gib 4 ein."
        print "Für ein Achteck gib 5 ein."
        frage4 = raw_input()
        if frage4 == "1":
            quadrat()
            print "Das ist aber ein schönes Quadrat, %s.\n" %user
        if frage4 == "2":
            dreieck()
            print "Das ist aber ein schönes Dreieck, %s.\n" %user
        if frage4 == "3":
            rechteck()
            print "Das ist aber ein schönes Rechteck, %s.\n" %user
        if frage4 == "4":
            muster()
            print "Das ist aber ein schönes Muster, %s.\n" %user
        if frage4 == "5":
            achteck()
            print "Das ist aber ein schönes Achteck,%s.\n" %user

    if frage1 == "ja":
        print "Möchtest du deine bisherige Zeichnung löschen? ja/nein?"
        frage7 = raw_input()
        if frage7 == "ja":
            reset()
            print "Die Zeichnung wurde gelöscht."

    if frage1 == "ja":
        print "Möchtest du noch etwas zeichnen? ja/nein?"
        frage6 = raw_input()
        if frage6 == "ja":
            spiel()
        if frage6 != "ja":
            print "OK!\nAuf Wiedersehen."
            
spiel()
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Nicht schlecht. Mein erstes Programm war nicht so lange :wink:
Während Du Python lernst, kannst Du es ja nach und nach verbessern.
Viel Spaß!

Gruß, mawe
skaterdomi
User
Beiträge: 12
Registriert: Dienstag 7. Dezember 2004, 16:48

eine gute idee!!
dann kann ich immer mehr sachen einbauen!

und wenn ich dann erst mal die gui-programmierung beherrsche, dann gibt es ja unendlich verbesserungen!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi skaterdomi,

schönes erstes Programm :)


Ich hätte da gleich einen Verbesserungsvorschlag. Bei den Geometrischen Figuren, hast Du immer Wiederhohlungen von gleichen Sequenzen von Befehlen. Das lässt sich sehr schön mit Schleifen verkürzen.

z.B. könnte man aus:

Code: Alles auswählen

def quadrat():
    forward(80)
    left(90)
    forward(80)
    left(90)
    forward(80)
    left(90)
    forward(80)
    left(90) 

Code: Alles auswählen

def quadrat():
    for i in xrange(4):
        forward(80)
        left(90)
machen.

Du könntest dann auch noch z.B. mit Argumenten die Grösse des Quadrats angeben:

Code: Alles auswählen

def quadrat(size=80):
    for i in xrange(4):
        forward(size)
        left(90)

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
skaterdomi
User
Beiträge: 12
Registriert: Dienstag 7. Dezember 2004, 16:48

danke für den tipp!
werde ich gleich mal machen!!!!!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

@Dookie:
War zwar nur ein kleiner Verbesserungsvorschlag, aber lass skaterdomi doch selbst tüfteln :wink:

Gruß, mawe
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi mawe,

wollte skaterdomi nur mal etwas anstupsen und 4x die gleiche Anweisungsfolge kann ich einfach nicht unkommentiert stehen lassen ;)


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Ich warte jetzt schon auf den Dookie-Einzeiler, der skaterdomis Programm vollständig ersetzt ;)

fs111
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

fs111 hat geschrieben:Ich warte jetzt schon auf den Dookie-Einzeiler, der skaterdomis Programm vollständig ersetzt ;)
Natürlich mit lambda, LCs, Generator Expressions usw 8)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Leonidas hat geschrieben:
fs111 hat geschrieben:Ich warte jetzt schon auf den Dookie-Einzeiler, der skaterdomis Programm vollständig ersetzt ;)
Natürlich mit lambda, LCs, Generator Expressions usw 8)
Das versteht sich ja wohl von selber.

:D

fs111
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Na gut, dann steuere ich noch etwas mehr oder weniger sinnvolles bei:
Ich vermeide sowas wie from Modul import *, denn das überscheibt ohne zu murren auch builtins. Ich nutze fast immer import Modul, dann habe ich auch noch eine schöne Namespace-Ordnung und kann mit dir() erkennen was wo dazugehört.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Leonidas hat geschrieben:Na gut, dann steuere ich noch etwas mehr oder weniger sinnvolles bei:
Ich vermeide sowas wie from Modul import *, denn das überscheibt ohne zu murren auch builtins. Ich nutze fast immer import Modul, dann habe ich auch noch eine schöne Namespace-Ordnung und kann mit dir() erkennen was wo dazugehört.
Das ist eigentlich eine richtiger Ansatz, nur kann einen das bei manchen Modulen, wie z.B. den xml-Moulen ganz schön Wahnsinnig machen, vorallem, wenn man dann noch mit xpath-Ausdrücken hantiert, wird das sehr schnell sehr unhandlich. Ich denke man sollte da nicht generalisieren.

fs111
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi Leonidas!

Das hat skaterdomi bei random eh gemacht. Bei turtle ist die Gefahr die Du angesprochen hast wohl sehr gering :D

Gruß, mawe
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mawe hat geschrieben:Das hat skaterdomi bei random eh gemacht. Bei turtle ist die Gefahr die Du angesprochen hast wohl sehr gering :D
Stimmt, das schon. Aber sowas ist irgendwie... schwach: from wxPython import * (oder um es noch lustiger zu gestallten: from wx import *)
Aber so zu schätzen kann schon mal danebengehn, und dann wundert man sich warum open() nicht das tut was man will ;)

Besonders lustig finde ich die Möglichkeit das Programm time.py zu nennen, und ein import time machen und sich wundern warum es nicht geht :D
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Leonidas spricht da aus eigener Erfahrung ;)
Es ginge aber auch ein

Code: Alles auswählen

import turtle as Schildkroete
aber bei ein oder zwei Modulen, deren Exporte bekannt sind darf man ruhig ein from modul import * verwenden, Besonders wenn der Modulname recht lang ist oder man ohnehin fasst alle importierten Klassen, Funktionen und sonstiges verwendet. Das Modul math oder das Modul operator sind dafür gute Beispiele.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dookie hat geschrieben:Leonidas spricht da aus eigener Erfahrung ;)
Naja, bei open() kann das gut sein, aber das mit time habe ich in der Mailingliste gelesen, ich habe vorher gar nicht gewusst, dass sowas geht. Man lernt eben immer dazu :)

Wofür kann man operator verwenden? Dort sind doch lauter Funktionen die normalerweise anders genutzt werden, mehr Pythonic, denn sub() aufzurufen scheint mir etwas unpraktisch zu sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

operator kann oft ein lambda ersetzen z.B. bei Reduce:

Code: Alles auswählen

from operator import *
fak = lambda n: reduce(mul, xrange(2,n),n)
müsste sonst folgendermassen geschrieben werden:

Code: Alles auswählen

fak = lambda n: reduce(lambda a, b: a * b, xrange(2,n),n)
was 1. nicht so elegant ist und 2. auch noch deutlich langsamer in der Ausführung.
Auch kann man die Funktionen aus Operator z.B. für ein Dictionary mit Rechenoperatoren verwenden:

Code: Alles auswählen

from operator import *
op_dict = {"+" : add, "-" : sub, "*" : mul, "/" : div}
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten