PythonAnfänger und sein erstes Prog - welches ned funzt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Hallo zusammen,

ich bin grad daebi Python zu lernen und habe deshalb mal ein Prog erstellt, aber leider funzt es nicht. Bitte sagt mir mal was hier das Prob ist, würde mich freuen.

Danke im Voraus

MfG
J.

Code: Alles auswählen

#!/usr/bin/python

import random
random.seed()

print("Dies ist ein kleines Kopfrechenprogramm welches mit Zahln von 1 bis 1000 rechnet und Addition und Subtraktion anbietet.")
print ("Bitte gebe hier ein + für das Rechnen mit Addition und ein - für Subtraktion ein.")

x = input()

while x == "+":
    a = random.randint(1.1000)
    b = random.randint(1.1000)
    print("Die Zahlen zum Addieren sind:". a. b)
    c = a + b
    if c == int(input()):
        print("Das ist richtig, auf ein Neues")
        continue
    else:
        print("Das ist leider nicht richtíg, nehmen wir eine neue Aufgabe")
        continue
else:
    a = random.randint(1.1000)
    b = random.randint(1.1000)
    print("Die Zahlen zum Subtrahieren sind:". a. b)
    c = a - b
    if c == int(input()):
        print("Das ist richtig, auf ein Neues")
        continue
    else:
        print("Das ist leider nicht richtíg, nehmen wir eine neue Aufgabe") 
        continue
und das Prob wird angezeigt:

Traceback (most recent call last):
File "/home/phil/Arbeitsfläche/Python3.2/Python_Project/Calcone.py", line 23, in <module>
a = random.randint(1.1000)
TypeError: randint() takes exactly 3 arguments (2 given)
Zuletzt geändert von Faerelis am Sonntag 20. November 2011, 17:25, insgesamt 3-mal geändert.
BlackJack

@Faerelis: Da gibt es mehr als ein Problem. Du hast offensichtlich nicht verstanden was eine ``while``-Schleife macht. Du vermischst da irgendwie ``if`` und ``while`` miteinander. Der ``else``-Zweig enthält ``continue``-Anweisungen, die nur innerhalb eines Schleifenblocks erlaubt sind. Selbst dann wären alle ``continue``-Anweisungen in dem Quelltext total überflüssig.

Wenn Du schreibst es gibt ein Problem, dann solltest Du auch das Problem beschreiben. Zum Beispiel die Fehlermeldung zeigen. Und zwar 1:1 inklusive Traceback. Dir mag das nichts sagen, aber anderen hilft es den Fehler zu verstehen. Aber es kann auch gar nicht sein, dass das Problem in *der* Zeile kommt, denn da sind schon vorher Fehler die zu Fehlermeldungen führen.

Ich weiss nicht wie man so viel Programmtext schreiben kann ohne dass das schon vorher mal aufgefallen ist. Du solltest das Programm noch einmal von vorne entwickeln. Und zwar nicht alles runterschreiben und dann erst ausprobieren, sondern wirklich *entwickeln* und jeden Zwischenschritt laufen lassen und erst weiter machen wenn das bis dahin entwickelte auch wirklich läuft.

Man bekommt hier so ein bisschen den Eindruck als wäre der Quelltext durch manuelles abschreiben oder kopieren eines OCR-Scans und kopieren und einfügen entstanden. Und dass Du nichts davon wirklich verstanden hast.

Den Aufruf von `random.seed()` solltest Du aus dem Programm nehmen. Der ist unnötig und in bestimmten Fällen sogar kontraproduktiv.
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Danke für deine schnelle Antwort.

Ich hab das schon selbst geschrieben, und kopiert habe ich das nur von mir selbst.

Ich bin da wohl etwas voreilig, anschauen tu ich das dann wohl jtz nochmal, danke für den Hinweis.


MfG
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

add...

Ich arbeite, u.a., mit dem Buch von Johannes Ernesti "Python 3 das umfassende Handbuch"

da steht, dass man while...und if... miteinander verbinden kann, oder hab ich da was falsch verstanden.
Ist denn wenigstens der Sinn des Programms verständlich?
BlackJack

@Faerelis: Dass das abgeschrieben oder schlechte OCR ist vermute ich (immer noch!) weil dabei gerne mal Punkt und Komma verwechselt werden. Und die Fehler die Du dabei gemacht hast, würde wohl niemand machen der die Syntax von Funktionsaufrufen verstanden hat.

Die Buchvariante für Python 2 war nicht besonders toll. Ich weiss nicht ob die Überarbeitung für Python 3 besser geworden ist. Falls das mit dem `random.seed()` aus dem Buch ist, wäre das ein Zeichen dagegen.

Syntaktisch sind ``while`` und ``if`` verschiedene, eigenständige Konstrukte. Natürlich kann man die „verbinden“, aber nur jeweils eigenstängig syntaktisch korrekte ``if``\s und ``while``\s.

Den Sinn kann man als Mensch recht problemlos erraten, aber für einen Computer muss man es eindeutig und nach den Regeln der vorgegebenen Sprache machen.

Die Fehlermeldung kommt ja in einer anderen Zeile als die, welche ursprünglich mal im Quelltext im ersten Beitrag markiert war. Sie ist zugegebenermassen etwas irreführend wenn man nicht weiss, dass `randint()` eine Methode ist. Verallgemeinern wir das also mal auf: Es wird die falsche Anzahl von Argumenten übergeben. Wie viele Argumente übergibst Du denn da? Und von welchem Typ sind die jeweils, und welchen Wert haben sie?
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

:shock:

Ich werde wohl noch eine ganze Menge an Literatur mir einverleiben müssen. Ist das Buch von dem ich geschrieben habe io, oder so von Fehlern behaftet, dass man damit nicht lernen kann? Python ist eine echt tolle Sprache daher will ich unbedingt diese auch lernen, kannst du mir ein Buch sagen wo ich das gut her bekomme??
BlackJack

@Faerelis: Also zumindest zum Theme objektorientierte Programmierung kann ich die Variante des Buchs zu Python 2.x nicht empfehlen. Die Autoren scheinen dort viel Wissen von anderen Programmiersprachen 1:1 unreflektiert auf Python übertragen zu haben — was nicht besonders gut funktioniert hat.

Es ist vielleicht weniger die Menge an Literatur als die Qualität und vor allem auch, dass man nicht nur liest, sondern auch nachvollzieht und ausprobiert.

Erster kostenloser Einstiegspunkt könnte zum Beispiel das Tutorial in der Python-Dokumentation sein.
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

OK danke erstmal, ich werd mal erstmal etwas weniger machen und dann schauen dass ich das wenigstens hinbekomme.
Danke für den Tipp, das wars dann erstmal von mir

MfG
J.
0x1cedd1ce
User
Beiträge: 31
Registriert: Sonntag 3. Oktober 2010, 12:21

Du hast konsequent Punkte mit Kommata verwechselt. z.B. random.randint(1.1000) anstatt random.randint(1, 1000) und print("Die Zahlen...". a. b) anstatt print("Die Zahlen...", a, b) Daher die Fehlermeldung
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

Salü zusammen
Ich kamm nicht drumrum, als anfänger. eine verbesserung zu probieren...
Es hat einen Syntax Fehler und evtl. sowieso noch andere, aber ich komme nicht drauf, wo er sich versteckt, also was ich evtl. falsch gemacht habe.

File "mathe.py", line 19
if tip == summe:
^
SyntaxError: invalid syntax

edit: boeh ich idiot..... Die Kack klammern.... ;)
trotzdem bitte ich um reichlich kritik zu dem code ;)

edith edit: :)
so umgeschrieben, abes es geht immer noch nicht, ich kann z.b. die 3 auswählen aber es pasiert nix, nur das Term promp kommt wieder.

Code: Alles auswählen

import random
import sys

summand1 = random.randint(1, 100)
summand2 = random.randint(1, 100)

def main():
    print("""Hallo zum Kopfrechnen:
       1 = Addition
       2 = Subtraktion
       3 = Multiplikation
       4 = Division
       q = Quit""")  
    auswahl = (input("Auswahl :"))
    if auswahl == 1:
        plus()
    if auswahl == 2:
        minus()
    if auswahl == 3:
        multi()
    if auswahl == 4:
        durch()
    if auswahl in ("q" or "Q"):
        sys.exit()

def plus():
    print("Ihre Aufgabe: ", summand1 + summand2)
    summe = summand1 + summand2
    tip = int(input("= "))
    if tip == summe:
        print("Richtig !")
    else:
        print("Falsch, es ist: ", summe)

def minus():
    print("Ihre Aufgabe: ", summand1 - summand2)
    summe = summand1 - summand2
    tip = int(input("= "))
    if tip == summe:
        print("Richtig !")
    else:
        print("Falsch, es ist: ", summe)

def multi():
    print("Ihre Aufgabe: ", summand1 * summand2)
    summe = summand1 * summand2
    tip = int(input("= "))
    if tip == summe:
        print("Richtig !")
    else:
        print("Falsch, es ist: ", summe)

def durch():
    print("Ihre Aufgabe: ", summand1 / summand2)
    summe = summand1 / summand2
    tip = int(input("= "))
    if tip == summe:
        print("Richtig !")
    else:
        print("Falsch, es ist: ", summe)

if __name__ == "__main__":
    main()


Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Hast du dein Programm mal ausgeführt? Ganz offensichtlich macht es nicht was es soll.
Das Leben ist wie ein Tennisball.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

smodo hat geschrieben:ich kann z.b. die 3 auswählen aber es pasiert nix, nur das Term promp kommt wieder.
``input`` liefert dir einen String, bei 3 handelt es sich um einen Integer. Wenn du die beiden Werte vergleichst, dann kommt natürlich immer ``False`` dabei raus.
Das Leben ist wie ein Tennisball.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

so, es kommt langsam, aber wie ich finde, sehr unschön.. "selbstkritik" :)

aber, ab jetzt, kann ich in ruhe, alles verbessern und auch schöner gestalten.
Es soll einmal richtig ausgereift sein und auch nutzbar ;)

edit: Der fehler "q und Q" ist mir bekannt und im original schon drausen ;)

Code: Alles auswählen

import random
import sys

summand1 = random.randint(1, 100)
summand2 = random.randint(1, 100)

def plus():
    print("Ihre Aufgabe: ", summand1, "+", summand2)
    summe = summand1 + summand2
    tip = int(input(" "))
    if tip == summe:
        print("Richtig !")
        main()
    else:
        print("Falsch, es ist: ", summe)
        main()

def minus():
    print("Ihre Aufgabe: ", summand1, "-", summand2)
    summe = summand1 - summand2
    tip = int(input(" "))
    if tip == summe:
        print("Richtig !")
        main()
    else:
        print("Falsch, es ist: ", summe)
        main()

def multi():
    print("Ihre Aufgabe: ", summand1, "*", summand2)
    summe = summand1 * summand2
    tip = int(input(" "))
    if tip == summe:
        print("Richtig !")
        main()
    else:
        print("Falsch, es ist: ", summe)
        main()
def durch():
    print("Ihre Aufgabe: ", summand1, "/", summand2)
    summe = summand1 / summand2
    tip = int(input(" "))
    if tip == summe:
        print("Richtig !")
        main()
    else:
        print("Falsch, es ist: ", summe)
        main()
        
def main():
    print("""Hallo zum Kopfrechnen:
       1 = Addition
       2 = Subtraktion
       3 = Multiplikation
       4 = Division
       q = Quit""")  
    auswahl = int(input())
    if auswahl == 1:
        plus()
    if auswahl == 2:
        minus()
    if auswahl == 3:
        multi()
    if auswahl == 4:
        durch()
    if auswahl in ("q" or "Q"):
        sys.exit()

if __name__ == "__main__":
    main()
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

smodo hat geschrieben:so, es kommt langsam, aber wie ich finde, sehr unschön.. "selbstkritik"

aber, ab jetzt, kann ich in ruhe, alles verbessern und auch schöner gestalten.
Es soll einmal richtig ausgereift sein und auch nutzbar ;)

edit: Der fehler "q und Q" ist mir bekannt und im original schon drausen.
edit2: hahaha so geil, hab grad in sachen "int" gemerkt, das es nicht aufgeht, wen z.b. die aufgabe wie eben kommt: 88 / 21.... ;) da geht int nicht so auf.
edit: hehe jaja habs gemerkt, einmal gestartet, sind es immer die gleichen zahlen. :)

Code: Alles auswählen

import random
import sys

summand1 = random.randint(1, 100)
summand2 = random.randint(1, 100)

def plus():
    print("Ihre Aufgabe: ", summand1, "+", summand2)
    summe = summand1 + summand2
    tip = int(input(" "))
    if tip == summe:
        print("Richtig !")
        main()
    else:
        print("Falsch, es ist: ", summe)
        main()

def minus():
    print("Ihre Aufgabe: ", summand1, "-", summand2)
    summe = summand1 - summand2
    tip = int(input(" "))
    if tip == summe:
        print("Richtig !")
        main()
    else:
        print("Falsch, es ist: ", summe)
        main()

def multi():
    print("Ihre Aufgabe: ", summand1, "*", summand2)
    summe = summand1 * summand2
    tip = int(input(" "))
    if tip == summe:
        print("Richtig !")
        main()
    else:
        print("Falsch, es ist: ", summe)
        main()
def durch():
    print("Ihre Aufgabe: ", summand1, "/", summand2)
    summe = summand1 / summand2
    tip = int(input(" "))
    if tip == summe:
        print("Richtig !")
        main()
    else:
        print("Falsch, es ist: ", summe)
        main()
        
def main():
    print("""Hallo zum Kopfrechnen:
       1 = Addition
       2 = Subtraktion
       3 = Multiplikation
       4 = Division
       q = Quit""")  
    auswahl = int(input())
    if auswahl == 1:
        plus()
    if auswahl == 2:
        minus()
    if auswahl == 3:
        multi()
    if auswahl == 4:
        durch()
    if auswahl in ("q" or "Q"):
        sys.exit()

if __name__ == "__main__":
    main()
Zuletzt geändert von smodo am Montag 21. November 2011, 19:36, insgesamt 1-mal geändert.
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Dann mal noch einige Hinweise:

- summand1 und summand2 sind sehr schlechte Namen, da es sich nich um Summanden handeln muss.
- Du solltest keine globalen Variablen, wie hier summand1 und summand2, verwenden. Übergebe Werte als Parameter an Funktionen und gebe die Ergebnisse mittels return zurück.
- Deine Funktionen sind nahezu Identisch. Die Einzigen Unterschiede bestehen im Operator. Du solltest dir also überlegen, wie du alle vier Funktionen zu einer zusammenfasst. Hinweise: schaue dir das operator-Modul an.
- Du solltest aus den Berechnungsfunktionen nicht die "main"-Aufrufen, benutze besser eine Schleife bei deiner main-Funktion. Sonst wird der Programmfluss sehr wirr und nicht mehr nachvollziehbar.
- plus, minus, multi, und durch heißen: addieren, subtrahieren, multiplizieren und dividieren, daher solltest du die Funktionen auch so nennen.
- Statt der ganzen `if` solltest du `elif` benutzen.
- Hast du mal die Eingabe "q" getestet?

Sebastian
Das Leben ist wie ein Tennisball.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

vielen lieben dank, sehr hilfreich deine antwort. :) jop wie im edit steht habe ich den q und Q fehler schon weg.
alles zu einer funktion mittels dem operator modul ist geial.. werd mich sofort daran setzten.
Ganz klar ich bin anfänger, hab aber auch gemerkt, das für so ein programm, meins viel zu viele zeilen hat.... :) "man kanns ja auch extrem schwer machen, so ein einfaches programm.
Auch das mit den namen für funktionen und variablen, werde ich in zukunft "schöner, lesbarer" gestallten und bennen.

Nochmals danke.

so erst ma kaffee holen. :)

edit:
also alle operatoren funktionen zusammen fassen natürlich, nicht total alles :)

edit2: Ich habe natürlich erst mal:
import operator
def(operator) gemacht um einen blick darauf zu werfen.

könntest du mir bitte ein kleines beispiel zum operator modul geben bitte ?
muss ehrlich sein, dachte es sei einfacher mit dem operator modul... :) also sprich operator.add oder operator.sub aber seh das nicht, oder überles ich es im kaffee-rausch? ;)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hier mal ein kurzes Beispiel:

Code: Alles auswählen

>>> import operator
>>> def evaluate(left, op, right):
...     func = {"+":operator.add, "-":operator.sub, "*":operator.mul}[op]
...     print left, op, right, "=", func(left, right)
... 
>>> evaluate(2, "+", 5)                                                                 
2 + 5 = 7                                                                               
>>> evaluate(2, "-", 5)
2 - 5 = -3                                                                              
>>> evaluate(2, "*", 5)                                                                 
2 * 5 = 10 
Am besten merkst du dir, dass Funktionen nichts anderes sind als aufrufbare Objekte. So entspricht ``operator.add`` der Funktion:

Code: Alles auswählen

def add(x, y):
    return x+y
Das Leben ist wie ein Tennisball.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

genial, vielen dank dir, sehr gut, aber ich werde mich evtl. erst morgen wieder richtig dran setzten, hab kopfweh, aber werde weiter berichten und posten. Brauche schliesslich auch sachliche kritik und tipps, wie eben z.b. von DIr.
Danke und einen schönen abend noch. :)

edith meint:
es lässt nicht los... ;) nur eine frage noch zu:

Code: Alles auswählen

func = {"+":operator.add, "-":operator.sub, "*":operator.mul}[op]
wieso diese klammern {} geht das auch in () ? weil in python3.x ist doch {1} {2} ein platzhalter oder nicht nur ?

und wiso am schluss die variable in [] klammern ?

evtl. ganz doofe fragen, aber ich habs noch nie gesehen, geschweige den sowas gelesen. hmm

boeh ich muss mehr lesen. ;)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
BlackJack

@smodo: Vielleicht solltest Du vor solch komplexeren Programmen erst einmal die Grunddatentypen von Python kennenlernen. In diesem Fall den Typ `dict`.
Antworten