Seite 1 von 1

Matrix, Uhr und Totto

Verfasst: Montag 10. April 2006, 11:39
von Yeti Master
Hallo ich bin neu,
bin ein Python Anfänger (seit ca. 1 Monat)
habe schon ein paar Programme programiert wollte eure Meinung hören!

Code: Alles auswählen

from random import*

def matrix():
    o = "0"
    m = "1"
    x = 0
    while x == 0:
        a = randrange(1,5)
        b = randrange(1,5)
        c = randrange(1,5)
        d = randrange(1,5)
        e = randrange(1,5)
        f = randrange(1,5)
        g = randrange(1,5)
        h = randrange(1,5)
        i = randrange(1,5)
        j = randrange(1,5)
        k = randrange(1,5)
        l = randrange(1,5)
        print a*o+b*m+c*o+d*m+e*o+f*m+g*o+h*m+i*o+j*m+k*m+l*o+a*m+b*o+c*m+d*o+e*m+f*o+g*o+h*m+i*o+j*o+k*m+l*m
        time.sleep(0.035)
Diese Programm schreibt einfach unendlich lang 0 und 1 in unterschiedlichen Abständen.
Man kann es mit Str+C stoppen

Totto:
Der PC rechnet aus wie viel das Match zwischen den beiden Vereinen ausgeht. Ich habe:Fußball, Football, Eiskockey, Basketball, Volleyball und Handball programmiert.

Code: Alles auswählen

from random import*

def totto():
    print "Fußball, Football, Eishockey, Basketball, Volleyball und Handball"
    u = raw_input("Sportart: ")
    x = raw_input("Heimmannschaft: ")
    y = raw_input("Gastmannschaft: ")
    a=0
    b=0
    if u == "fußball" or u == "Fußball":
        a = randrange(0,6)
        b = randrange(0,5)
        if a > b:
            print x,"gewinnt",a,":",b,
        if a < b:
            print y,"gewinnt",b,":",a,
        if a == b:
            print x,"und",y,"spielen unentschieden",a,":",b,
    elif u =="football" or u == "Football":
        c = randrange(0,9)
        d = randrange(0,8)
        f = randrange(0,4)
        g = randrange(0,3)
        a = c*7+f*3
        b = d*7+g*3
        if a > b:
            print x,"gewinnen",a,":",b,
        if a < b:
            print y,"gewinnen",b,":",a,
        if a == b:
            print x,"und",y,"spielen unentschieden",a,":",b,
    elif u == "handball" or u== "Handball":
        a = randrange(20,38)
        b = randrange(18,35)
        if a > b:
            print x,"gewinnt",a,":",b,
        if a < b:
            print y,"gewinnt",b,":",a,
        if a == b:
            print x,"und",y,"spielen unentschieden",a,":",b,
    elif u == "volleyball" or u== "Volleyball":
        a = randrange(0,4)
        b = randrange(0,4)
        while not a == 3 or b == 3:
            a = randrange(0,4)
            b = randrange(0,4)
        if a == b:
            while a == b:
                a = randrange(0,4)
                b = randrange(0,4)
        if a > b:
            print x,"gewinnt",a,":",b,
        if a < b:
            print y,"gewinnt",b,":",a,
    elif u == "basketball" or u== "Basketball":
        a = randrange(84,100)
        b = randrange(80,95)
        if a > b:
            print x,"gewinnt",a,":",b,
        if a < b:
            print y,"gewinnt",b,":",a,
    elif u == "eishockey" or u== "Eishockey":
        a = randrange(0,10)
        b = randrange(0,8)
        if a == b:
            c = randrange(0,6)
            d = randrange(0,6)
            while c == d:
                c = randrange(0,6)
                d = randrange(0,6)
            if c < d:
                print x,"gewinnt im Penaltyschießen",c,":",d,"(",a,":",b,")"
            if c > d:
                print y,"gewinnt im Penaltyschießen",d,":",c,"(",b,":",a,")"
        if a > b:
            print x,"gewinnt",a,":",b,
        if a < b:
            print y,"gewinnt",b,":",a,
    else:
        print "Die Sportart ist nich programmiert"
und das letzte ist einfach eine Uhr die dir die Zeit in Stunden:Minuten:Sekunden ansagt. Sie macht auch ein TicTac Geräusch!
sie läuft unendlich lang und kann mit Str+C gestoppt werden

Code: Alles auswählen

import time
import winsound

def uhr():
    s =500
    x = 0
    while not x == 1:
        a = time.strftime("%H:%M:%S")
        print a
        winsound.Beep(s,2)
        time.sleep(1)
[EDIT]Rechtschreibfehler verbessert!

Verfasst: Montag 10. April 2006, 11:58
von Python 47
Hallo,

schön das du dich entschlossen hast, Python zu lernen!

Also beim ersten Programm Verweise ich mal auf:
[wiki=Lange_Zeilen_im_Sourcecode]Lange Zeilen im Sourcecode[/wiki]

Auserdem verweise ich bei Programm 1 und 2 auf:
[wiki=Modul_Import]Warum sollte man nicht from ... import * benutzen[/wiki]

Auserdem benzutzt du im 1. Programm time.sleep, obwohl du das time Modul gar nicht importierst!

Im 1. Programm würde ich anstatt

Code: Alles auswählen

x=0
while x==0:
folgendes schreiben:

Code: Alles auswählen

while True
Im Programm 3 würde ich auch anstatt

Code: Alles auswählen

x = 0
    while not x == 1: 
folgendes schreiben:

Code: Alles auswählen

while True
Bin im Moment zu faul mir Programm 2 durchzuschauen!
Ich hoffe es hat dir erstmal geholfen!

Verfasst: Montag 10. April 2006, 12:14
von jens
Hier mal meine Variante vom ersten Programm:

Code: Alles auswählen

import time, random

def matrix(minCount, maxCount, delay):
    while True:
        line = []
        for i in xrange(random.randrange(minCount, maxCount)):
            line.append(random.randint(0,1))

        print "".join([str(i) for i in line])

        time.sleep(delay)

matrix(1, 79, 0.035)
Zum zweiten Programm... Nimm nicht einfach nur einen Buchstaben für Variablen... Das wird schnell unübersichtlich. Was war nochmal u???

Sowas hier

Code: Alles auswählen

if u == "fußball" or u == "Fußball":
geht einfacher:

Code: Alles auswählen

if u.lower() == "fußball":
Außerdem würde ich ehr eine Liste anbieten, mit Zahlen zum wählen ;)

Ich sehe auf die schnelle auch keine unterschiede zwischen den Sportarten, bis auf das Penaltyschießen beim Eishockey... Nur die Anzahl der Tore variiert...
Also haben fast alle Sportarten doch mehr oder weniger viel gemeinsam. Du könntest also ehr einen Datensatz aufbauen, in dem ein Regelsatz festlegt, wie viele Tore typisch fallen...

Verfasst: Montag 10. April 2006, 12:55
von Yeti Master
Danke für die Tipps
Habs ausgebessert

Habe noch ein paar andere Programme programmiert

Verfasst: Montag 10. April 2006, 13:14
von Python 47
Poste am besten nochmal die verbesserten Programme!

Verfasst: Montag 10. April 2006, 13:44
von Yeti Master
Hier:

Code: Alles auswählen

from random import  randrange
import time
import winsound

def uhr():
    s =500
    while True:
        a = time.strftime("%H:%M:%S")
        print a
        winsound.Beep(s,2)
        time.sleep(1)

def matrix():
    o = "0"
    m = "1"
    while True:
        a = randrange(1,5)
        b = randrange(1,5)
        c = randrange(1,5)
        d = randrange(1,5)
        e = randrange(1,5)
        f = randrange(1,5)
        g = randrange(1,5)
        h = randrange(1,5)
        i = randrange(1,5)
        j = randrange(1,5)
        k = randrange(1,5)
        l = randrange(1,5)
        print a*o+b*m+c*o+d*m+e*o+f*m+g*o+h*m+i*o+j*m+k*m+l*o+a*m+b*o+c*m+d*o+e*m+f*o+g*o+h*m+i*o+j*o+k*m+l*m
        time.sleep(0.035)
und bei totto hab ich u durch "art" (Sportart) getauscht

andere Frage:
Kann man ein Python programm auf einen html - text auf eine Webside übertragen?

PS: Ist es schlimm wenn man mehrer Programme in einem "Fenster" hat?

Verfasst: Montag 10. April 2006, 15:07
von Python 47
1.Man könnte das noch kürzer fassen
2.Warum hast du nicht meinen Tipp mit den Langen Zeilen im Source Code berücksichtigt?

Code: Alles auswählen

from random import  randrange
import time, winsound

def uhr():
    while True:
        print time.strftime("%H:%M:%S")
        winsound.Beep(500,2)
        time.sleep(1)

def matrix():
    o,m ='0', '1'
    while True:
        a = randrange(1,5)
        b = randrange(1,5)
        c = randrange(1,5)
        d = randrange(1,5)
        e = randrange(1,5)
        f = randrange(1,5)
        g = randrange(1,5)
        h = randrange(1,5)
        i = randrange(1,5)
        j = randrange(1,5)
        k = randrange(1,5)
        l = randrange(1,5) 
        print (
	          a*o+b*m+c*o+d*m+e*o+f*m+g*o+h*m+i*o+j*m+k*m
              +l*o+a*m+b*o+c*m+d*o+e*m+f*o+g*o+h*m+i*o+j*o+k*m+l*m           
        )
        time.sleep(0.035) 

Verfasst: Montag 10. April 2006, 15:33
von modelnine
matrix geht noch kürzer:

Code: Alles auswählen

from time import sleep
from random import randrange

def matrix(min=1,max=5,reps=6):
    while True:
        print "".join([a+b for a, b in zip(["0"*randrange(min,max) for i in range(reps)],["1"*randrange(min,max) for i in range(reps)])])
        sleep(0.035)
Wobei man wirklich überlegen sollte ob das Konstrukt noch so "durchschaubar" ist... ;-)

PS: Ich weiß dass das eine überlange Zeile ist, aber ich weigere mich die im Forum umzubrechen, weil eine Proportionalfont als Darstellung für die Edit-Box genutzt wird...

Verfasst: Montag 10. April 2006, 16:17
von modelnine
Noch ein kleines abschreckendes Lehrstück in Code-Komprimierung:

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-

from random import randrange

SPORTARTEN = {"fußball":(((0,6),(0,5)),),
              "football":(((0,9),(0,8)),((0,4),(0,3)),(7,3)),
              "handball":(((20,38),(18,35)),),
              "volleyball":(((0,4),(0,4),lambda a,b: 3 in (a,b) and a <> b),),
              "basketball":(((84,100),(80,95)),),
              "eishockey":(((0,10),(0,8),lambda a,b: a==b),
                           ((0,6),(0,6),lambda a,b: a<>b))}

def calc(count1,count2=None,weight=None):
    while True:
        a, b = randrange(*count1[0]), randrange(*count1[1])
        if ( len(count1) < 3 or count2 is not None or
             ( count2 is None and count1[2](a,b) ) ):
            break
    if count2 is not None and ( len(count1) < 3 or count1[2](a,b) ):
        while True:
            c, d = randrange(*count2[0]), randrange(*count2[1])
            if len(count2) < 3 or count2[2](c,d):
                break
        if weight is not None:
            a = a*weight[0] + c*weight[1]
            b = b*weight[0] + d*weight[1]
            return a, b
        return (a, c), (b, d)
    return a, b

for name, data in SPORTARTEN.iteritems():
    print "%s: Heimmannschaft: %s, Gastmannschaft: %s" % ((name,)+calc(*data))
Die ganze Logik der Spiele ist in einer Datenstruktur verpackt, und im Endeffekt muß nur diese Datenstruktur angepasst werden um andere Spiele zu implementieren.

Verfasst: Montag 10. April 2006, 16:19
von Leonidas
Yeti Master hat geschrieben:Kann man ein Python programm auf einen html - text auf eine Webside übertragen?
Wie meinst du das? Das könnte man jetzt auf zig Arten verstehen, also schreib bitte etwas genauer. Aber allgemein: ja, möglich ist es schon.

Verfasst: Dienstag 11. April 2006, 07:16
von Yeti Master
@Leonidas
Ich meine das so:
Ich programmiere ein Programm zB. Totto
Das will ich auf meine Homepage geben dh.
eine Eingabefläche, wo man die Sportart eingibt
und zwei Eingabeflächen für die Mannschaften
und dann soll das Ergebnis geschrieben werden.

Danke für die Antwort

@Python Master 47
ich hab mir den Tipp mit den Langen Zeilen im Source Code angeschaut, nur ging das bei mir nicht weil ich irgentwas falsch gemacht hab, frag mich nicht was, ich werde den Fehler schon finden

Irgentwie hab ich das Gefühl ihr wollt alles so kurz wie möglich anschreiben, hat das einen Vorteil (Außer, dass man weniger Platz braucht)?

Danke für die vielen Verbesserungsvorschläge

Verfasst: Dienstag 11. April 2006, 07:37
von modelnine
Irgentwie hab ich das Gefühl ihr wollt alles so kurz wie möglich anschreiben, hat das einen Vorteil (Außer, dass man weniger Platz braucht)?
Ja, und nein. Der Code den Du bisher schreibst hat sehr viele Repetierungen, deswegen ist er unschön/unsauber (bitte nicht persönlich nehmen, das ist einfach nur eine ganz allgemeine Feststellung über Code-Qualität, und keine Feststellung zu Deiner Person! bevor Du's falsch verstehst...). Diese Repetierungen führen auf jeden Fall dazu, dass wenn man an einer Stelle eine Veränderung macht, man die selbe Veränderung an einer anderen Stelle auch noch mal machen muß, und man somit erstens nicht modular (sprich in einem Sinn dass man Code den man einmal schreibt auch noch für andere Dinge wiederverwenden kann), und zweitens auch fehleranfällig programmiert, da wenn man an Stelle X eine Korrektur macht, aber die an Stelle Y vergisst, man über kurz oder lang nicht mehr weiß wie's richtig ausschaut.

Siehe zum Beispiel mein matrix-Beispiel: Die Erstellung der Zufallsvariablen hab ich in eine (wenn auch halbversteckte) Schleife über die List-Comprehension gepackt; das hat schlicht und ergreifend den Vorteil dass es erstens viel einfacher ist die Anzahl der Zufallsvariablen zu variieren, und zum anderen, dass auch kein Code dupliziert wird (a = randrange(1,5), b = randrange(1,5) ... ist so eine Duplikation). Ob man dann mit funktionalen Mitteln wie zip et al. arbeiten muß um daraus einen String zu machen: darüber kann man streiten; das verkürzt den Code nicht unerheblich, es ist aber nicht umbedingt schöner als wenn man daraus eine explizite Schleife baut. Nur, dass die Generierung der Zufallsvariablen in einer Schleife erfolgen soll, das ist definitiv schönerer Code, und in diesem Fall auch kürzer.

Jetzt wieder zurück zu Deiner Frage: Code der von Anfang an so ausgelegt ist dass man ihn wiederverwenden kann ist meißtens kürzer als Code den man per Copy-Paste erzeugt, da man durch Konstrukte wie Schleifen und dadurch dass man Logik in Daten und nicht in Methoden packt man eine sehr viel komprimiertere Form der Darstellung der Programmlogik hat, die zum anderen auch einfacher erweiterbar ist. Und wie man diese Einschätzung macht, und zu wissen bis wohin man geht (ich hab das bei dem Toto-Beispiel definitiv übertrieben, aber es ging mir darum zu zeigen dass man eben auch Logik anderweitig darstellen kann), das unterscheidet einen guten Programmierer von einem schlechten. Der sehr gute (oder auch der außerordentliche) Programmierer unterscheiden sich vom guten Programmierer dadurch dass sie Algorithmen für Ihre Zwecke anpassen können, und eben nicht nur stumpf Algorithmen produzieren.

Das vorstehende kann man nicht lernen, das kann man nur üben, und zwar indem man viel programmiert, und vor allen Dingen indem man auf andere hört wenn sie einem sagen dass der Code den man schreibt schlecht (oder suboptimal) ist. Und zu guter letzt: es ist noch kein Programmier-Guru vom Himmel gefallen. Alle haben klein angefangen, und alle haben durch ganz viel Übung gelernt. Und diejenigen, die wirklich gut geworden sind haben sich durch Kritik anderer nicht abschrecken lassen, sondern weitergemacht, und probiert den Stil der anderen in den eigenen einfließen zu lassen.