unsupported operand in funktionen

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
phönixpyton
User
Beiträge: 3
Registriert: Donnerstag 25. Dezember 2014, 12:39

Hallo leute, ich weis bei meinem code langsam nicht mehr weiter. :K :K
Habe das spiel zahlen raten um einige funktionen erweitert und
war gerade dabei ein wertesystem zu programieren und habe es getestet
da kommt die meldung "unsupported operand type(s) for -: 'NoneType' and 'int'".
Wenn ich allerdings außerhalb von diesem game mathematische operanden(+,-,oder so)
in funktionen verwende dann funktioniert alles, darum bitte ich um Hilfe.
(bin noch recht neu in python)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Willkommen im Forum.

Anscheinend wird deine Variable (mit oder von der du subtrahierst) irgendwo `None`, leider kann ich dir nicht mehr sagen, weil du deinen Code nicht gepastet hast (code tags!).
the more they change the more they stay the same
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

phönixpyton hat geschrieben:Wenn ich allerdings außerhalb von diesem game mathematische operanden(+,-,oder so)
in funktionen verwende dann funktioniert alles, darum bitte ich um Hilfe.
(bin noch recht neu in python)
Du machst außerhalb des games irgendwas aber nichts was mit dem Game zu tun hat. Irgendwo in deinem Code passiert in etwa folgendes:

Code: Alles auswählen

>>> None - 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
Aus dem kompletten Traceback sollte sich ergeben wo im Code dies passiert. Wenn dir der nicht weiterhilft, poste den kompletten Traceback und den dazugehörigen Code.
phönixpyton
User
Beiträge: 3
Registriert: Donnerstag 25. Dezember 2014, 12:39

Code: Alles auswählen

import random as r
import time as t


def verhältnis(x,t,zähler):
    test=t-x
    test+=1
    weit=zähler*100
    end=weit/test
    return(end)

def KzGz(a):
        try:
            t=int(a)
            return(t)
        except ValueError:
            return(None)

def feh():
        print("bitte nur ganze Zahlen verwenden")

def wertesys(self):
    pass
b=None

while True:
    while True:
        a=input("Kleinste Zahl: ")
        print("")
        a=KzGz(a)
        if a==None:
            feh()
            continue
        while b==None:
            b=input("Größte Zahl: ")
            print("")
            b=KzGz(b)
            if b==None:
                feh()

        if a>b:
            c=a
            d=b
            a=d
            b=c
        g=r.randint(a,b)
        b=None
        break

    print("Das Spiel beginnt!")
    zähler=0
    while True:
        versuch=input("Rate eine Zahl:\n")
        versuch=KzGz(versuch)
        if versuch==None:
            feh()
            continue
        elif versuch<g:
            print("Die Zahl ist zu klein")
        elif versuch>g:
            print("Die Zahl ist zu groß")
        zähler+=1
        break

    while g!=versuch:
        versuch = input("Rate eine Zahl:\n")
        versuch=KzGz(versuch)
        if versuch==None:
            feh()
            continue
        elif versuch<g:
            print("zu klein")
        elif versuch>g:
            print("zu groß")
        zähler+=1    
    Wert=verhältnis(a,b,zähler)
    print("Super, Du hast es in {}Versuchen geschafft.".format(zähler))
    print("du hast den Status: ",Wert,"%")
    while True:
        n=input("noch ein game(1=ja;2=Nein)?: ")
        n=KzGz(n)
        if n==None:
            feh()
            continue
        elif n<1 or n>2:
            print("bitte keine anderen Zahlen verwenden")
            continue
        elif n==1:
            break
        elif n==2:
            print("Das Spiel wird beendet")
            break
    print("")
    print("")
    if n==2:
        t.sleep(3)
        break
hier ist der code ich hoffe ihr könnt den fehler entdecken
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@phönixpyton: das hier ist keine Ostereiersuche, bei der irgendwer Fehler suchen will. Bei einem Fehler gibt es einen Traceback, wo ziemlich genau steht, wo der Fehler auftritt.

Der Code ist eine Katastrophe. Namen sind dazu da, dass man weiß, was sie bedeuten, r und t für random und time ist das genaue Gegenteil. Zumal t auch noch in vielen anderen Verwendungen vorkommt. Return ist keine Funktion, braucht also keine Klammern. Was soll den KzGz oder feh heißen?
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

phönixpyton hat geschrieben:

Code: Alles auswählen

def verhältnis(x,t,zähler):
    test=t-x
    test+=1
    weit=zähler*100
    end=weit/test
    return(end)
Ich finde es ja so handlicher.

Code: Alles auswählen

def verhältnis(x, t, zähler):
    return 100 * zähler / (t - x + 1)
Ich würde allerdings englische Begriffe verwenden und t, test und x ordentliche Namen geben
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

phönixpyton hat geschrieben:hier ist der code ich hoffe ihr könnt den fehler entdecken
Du setzt b auf None.
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dein Code ist das, was man "verhunzt" nennt. Du hast nichtssagende Bezeichnernamen, zu viele Codewiederholungen und zu wenig Struktur.

Ich habe mal kurz durchgeräumt und Folgendes daraus gemacht.

Code: Alles auswählen

import random


def input_integer(prompt='', errormessage='Bitte nur ganze Zahlen verwenden'):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            if errormessage:
                print(errormessage)


def setup():
    min_value = input_integer('Kleinste Zahl: ')
    max_value = input_integer('Größte Zahl: ')
    if min_value > max_value:
        min_value, max_value = max_value, min_value
    target_value = random.randint(min_value, max_value)
    return min_value, max_value, target_value


def play_again():
    while True:
        result = input_integer('Noch ein Spiel (1=ja, 2=nein)?: ')
        if result == 1:
            return True
        elif result == 2:
            return False
        print('Bitte nur die Zahlen 1 oder 2 verwenden')


def main():
    min_value, max_value, target_value = setup()

    guess_counter = 0
    print("Das Spiel beginnt!")
    while True:
        guess_counter += 1
        guess_value = input_integer('Rate eine Zahl :')

        if guess_value < target_value:
            print('Die Zahl ist zu klein')
        elif guess_value > target_value:
            print('Die Zahl ist zu groß')
        else:
            status = 100 * guess_counter / (max_value - min_value + 1)
            print("Super, du hast es in {} Versuchen geschafft.".format(guess_counter))
            print("Du hast den Status: {:3.2f}%".format(status))

            if not play_again():
                print('Das Spiel wird beendet')
                break

            min_value, max_value, target_value = setup()
            guess_counter = 0


if __name__ == '__main__':
    main()
Man kann da noch mehr optimieren, aber du sollst es ja noch einigermaßen wiedererkennen.

Was soll der Status eigentlich aussagen? OK, je kleiner der Wert ist, umso besser ist das Ergebnis. Aber warum wird das in Prozent angegeben?
phönixpyton
User
Beiträge: 3
Registriert: Donnerstag 25. Dezember 2014, 12:39

das mit der unübersichtlichkeit tut mir leid aber ich bin noch nicht so weit in python und KzGz ist eine abkürzung für kleinste zahl größte zahl.
das mit der prozentangabe war reinweg für mich das ich erst mal sehe obs funktioniert bevor ich den anderen kram hinzufüge
hätte ich gewusst wie sehr euch die abkürzungen(benutze sie ja auch nur weil ich schreibfaul bin) stören hätte ich sie weggelassen bzw geändert, aber leider habe ich das problem ja immer noch
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

/me hat dir doch eine gute Lösung aufgezeigt, versuche doch einfach die zu verstehen und daran weiterzuarbeiten anstatt an deinem Anfangscode festzuhalten.
the more they change the more they stay the same
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

phönixpyton hat geschrieben:hätte ich gewusst wie sehr euch die abkürzungen(benutze sie ja auch nur weil ich schreibfaul bin) stören hätte ich sie weggelassen bzw geändert, aber leider habe ich das problem ja immer noch
Die Abkürzungen und nichtssagenden Namen für Bezeichner stören nicht nur uns sondern ganz offensichtlich auch dich. Wie sonst kann es sein, dass du den Fehler in deinem eigenen Code nicht findest, obwohl dir die Lösung bereits genannt wurde ("Du setzt b auf None").

Laut PM findest du meinen Code zu schwierig (wer greift wann wie auf was zu). Vielleicht denkst du einfach zu kompliziert. Welche Verständnisschwierigkeit hast du denn beispielsweise mit der von mir skizzierten main-Funktion? Wir können das gerne zusammen durchgehen, aber dafür müssen wir erst einmal wissen womit genau du Probleme hast.
Antworten