Hunger geht in Minus, Health bleibt gleich?!

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.
Benutzeravatar
BlackJack
Moderator
Beiträge: 32218
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon BlackJack » Donnerstag 20. April 2017, 14:40

@andr0meda55: Aber warum sollte das passieren, statt das die `updateHunger()`-Methode mit den Argumenten 500 und der Methode selbst aufgerufen wird? Das sagst Du Python soll passieren. Also macht Python das auch. Oder versucht es zumindest.

Merke: Programmiersprachen machen machen das was Du sagst, und zwar *genau* das, und nicht auf magische Weise das was Du eigentlich meinst. :-)
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. — Brian W. Kernighan
andr0meda55
User
Beiträge: 16
Registriert: Montag 10. April 2017, 20:48

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon andr0meda55 » Freitag 21. April 2017, 12:40

Okay, jetzt hast du mich aber überfordert :D
Soll ich jetzt eine isHungry Methode machen? Und was soll die tun? Wie soll die checken das das Tamapython hungrig ist? mit einer if-Abfrage?
Benutzeravatar
BlackJack
Moderator
Beiträge: 32218
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon BlackJack » Freitag 21. April 2017, 13:11

@andr0meda55: Wenn Du ausserhalb der Klasse ausgeben möchtest ob das Tamapython hungrig ist oder nicht, dann musst Du das ja vorher prüfen. Und nach Möglichkeit ohne von aussen wissen zu müssen wie man das prüft. Also braucht man da eine Methode für die einem verrät ob das Tamapython hungrig ist oder nicht. Ja oder Nein wird normalerweise als `True` und `False` kodiert, also müsste eine `is_hungry()`-Methode `True` liefern wenn das Tamapython hungrig ist, und `False` wenn nicht. Methoden die `is_*()` oder `has_*()` heissen, geben in der Regel einen Wahrheitswert als Ergebnis zurück.

Ein ``if`` braucht man *in* der Methode nicht, nur einen Ausdruck der entsprechend zu `True` oder `False` ausgewertet wird. Das ``if`` steht eher beim Aufrufer der Methode wenn der Entscheiden muss ob er etwas ausgibt oder nicht.

Übrigens `is_hungry()` und nicht `isHungry()`. `updateHunger()` sollte auch `update_hunger()` heissen. Schau Dir bei Gelegenheit mal den Style Guide for Python Code an.
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. — Brian W. Kernighan
andr0meda55
User
Beiträge: 16
Registriert: Montag 10. April 2017, 20:48

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon andr0meda55 » Freitag 21. April 2017, 13:28

Also ich habe es mir jetzt so mal vorgestellt (grob geschrieben):
  1. class Tamapython(object):
  2.     def __init__(self):
  3.         self.name = 'name'
  4.         self.hunger = 100
  5.         self.photo = '(づ。◕‿‿◕。)づ'
  6.         self.is_hungry = False
  7. # ------------------------------------------------- #
  8.     def feed(self):
  9.         if self.hunger <= 50:
  10.             self.hunger += 20
  11.         else:
  12.             print(self.name + " hat keinen Hunger!")
  13. # ------------------------------------------------- #
  14.     def update_hunger(self):
  15.         while self.hunger == 100:
  16.             self.hunger -= 20
  17.             print(self.hunger)
  18. # ------------------------------------------------- #
  19. def main():
  20.     new_tama = Tamapython()
  21.     print(new_tama.photo)
  22.     print("Hey! Das ist dein neues Haustier! Behandle es gut!")
  23.     print("Ach übrigens... es heißt: " + new_tama.name)
  24.     if new_tama.is_hungry == True:
  25.         new_tama.feed()
  26.     print(new_tama.hunger)
  27. # ------------------------------------------------- #
  28. if __name__ == '__main__':
  29.     main()
  30. # ------------------------------------------------- #
  31.  
  32. def is_hungry(self):
  33.     if self.hunger <= 50:
  34.         self.is_hungry == True
  35.        

Ist das jetzt so korrekt? :D
Benutzeravatar
kbr
User
Beiträge: 579
Registriert: Mittwoch 15. Oktober 2008, 09:27
Wohnort: Düsseldorf

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon kbr » Freitag 21. April 2017, 13:42

andr0meda55 hat geschrieben:Ist das jetzt so korrekt?

Leider nein. Mal abgesehen von den Kommentarstrichen, die eher stören, was hast Du Dir bei den Zeilen 32 bis 34 gedacht? Versuche einmal zu erklären, was dort passiert und warum.
andr0meda55
User
Beiträge: 16
Registriert: Montag 10. April 2017, 20:48

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon andr0meda55 » Freitag 21. April 2017, 13:49

wenn Hunger <= 50 geht, soll is_hungry auf True schalten.
Und ich habe vor, das wenn is_hungry auf True ist, das er feed aufrufen soll, was jedoch noch nicht wirklich angepasst ist.
Diese Kommentarstriche habe ich dazu gemacht, damit ich mein Code lesbarer machen kann, aber wenn sie stören, kann ich sie auch wieder weg machen :D
Benutzeravatar
BlackJack
Moderator
Beiträge: 32218
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon BlackJack » Freitag 21. April 2017, 14:30

@andr0meda55: `is_hungry` wird aber nirgends geändert. Ausserdem ist das ein Datenattribut und nicht wie vorgeschlagen eine Methode. Man sollte keine redundanten Daten speichern. Wenn die Bedingung für `is_hungry` ist das `hunger` kleiner 50 ist, dann sollte man das prüfen und nicht parallel noch einen Wert überall verwalten müssen wo `hunger` geändert werden könnte.

Ups, ich sehen gerade erst die ”Methode” `is_hungry()`. Woher soll Python denn wissen das die zur `Tamapython`-Klasse gehört? Das musst Du schon *in* die Klasse schreiben. Und dann darf die Methode nicht `is_hungry` heissen, oder das Datenattribut darf nicht so heissen. Ein Attribut kann immer nur an *einen* Wert gebunden werden. Wie soll denn sonst bei ``new_tama.is_hungry`` entschieden werden ob da nun der Wahrheitswert oder die Methode gemeint ist?

Aber wie gesagt, es sollte sowieso nur die Methode geben. Und wie auch schon gesagt, solche Testmethoden geben einen Wert zurück und verändern nicht den Zustand des Objekts. Das ist *sehr* unerwartet.

Wahrheitswerte vergleicht man übrigens nicht mit literalen Wahrheitswerten. Bei dem Vergleich kommt ja nur wieder ein Wahrheitswert heraus, aber den hatte man vorher ja schon, das macht also keinen Sinn. Statt ``if condition == True:`` schreibt man einfach nur ``if condition:``. Und falls man das Gegenteil prüfen möchte, gibt es die Negation mit ``not``: ``if not condition:``.

Die Methode würde so aussehen:
  1.     def is_hungry(self):
  2.         return self.hunger <= 50


Und die Abfrage dann:
  1.     if new_tama.is_hungry():
  2.         new_tama.feed()
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. — Brian W. Kernighan
andr0meda55
User
Beiträge: 16
Registriert: Montag 10. April 2017, 20:48

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon andr0meda55 » Freitag 21. April 2017, 15:50

Traceback (most recent call last):
File "C:/Users/andr0meda55/PycharmProjects/tamapython/tamapython.py", line 38, in <module>
main()

Error: File "C:/Users/andr0meda55/PycharmProjects/tamapython/tamapython.py", line 29, in main
if new_tama.is_hungry():
TypeError: 'bool' object is not callable

Hier der Code von main():
  1. def main():
  2.     new_tama = Tamapython()
  3.     print(new_tama.photo)
  4.     print("Hey! Das ist dein neues Haustier! Behandle es gut!")
  5.     print("Ach übrigens... es heißt: " + new_tama.name)
  6.     if new_tama.is_hungry():
  7.         new_tama.feed()
  8.     else:
  9.         print(new_tama.name + " hat kein Hunger!")
  10.     print(new_tama.hunger)


/EDIT:
Habe das () bei if new_tama.is_hungry: entfernt und jetzt gehts.
Jedoch fällt mir jetzt auf, das ich nicht das erreiche, was ich will.
Sobald ich das Programm starte, sollte es so aussehen:
(づ。◕‿‿◕。)づ
Hey! Das ist dein neues Haustier! Behandle es gut!
Ach übrigens... es heißt: name
name hat kein Hunger!
100
80
60
40
60
name hat kein Hunger!

und das halt in der Dauerschleife.
Benutzeravatar
BlackJack
Moderator
Beiträge: 32218
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon BlackJack » Freitag 21. April 2017, 16:21

@andr0meda55: Natürlich kann man ein `bool` nicht aufrufen, das sollte ja aber auch gar kein `bool`-Wert sondern eine Methode sein.

Die Ausgabe passt nicht wirklich zur gezeigten `main()`, es sei denn in der `feed()`-Methode steht eine Schleife und die Ausgabe mit dem Hunger wird noch mal irgend wo anders gemacht.
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. — Brian W. Kernighan
andr0meda55
User
Beiträge: 16
Registriert: Montag 10. April 2017, 20:48

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon andr0meda55 » Freitag 21. April 2017, 16:28

Woah, jetzt, sobald ich das Programm starte, geht es innerhalb Millisekunden in den Millionen Bereich, im Minus wohlbemerkt und meine CPU hat so einiges am arbeiten :shock:
  1. class Tamapython(object):
  2.     def __init__(self):
  3.         self.name = 'name'
  4.         self.hunger = 100
  5.         self.photo = '(づ。◕‿‿◕。)づ'
  6.         self.is_hungry = False
  7.         self.is_alive = True
  8.  
  9.         def is_hungry(self):
  10.             return self.hunger <= 50
  11.  
  12.         def is_alive(self):
  13.             return self.hunger <= 1
  14.  
  15.  
  16.     # ------------------------------------------------- #
  17.     def feed(self):
  18.         while self.is_hungry == True:
  19.             self.hunger += 20
  20.  
  21.  
  22.  
  23.     # ------------------------------------------------- #
  24.     def updateHunger(self):
  25.         while self.is_alive == True:
  26.             self.hunger -= 20
  27.             print(self.hunger)
  28.  
  29.  
  30.  
  31.  
  32. def main():
  33.     new_tama = Tamapython()
  34.     print(new_tama.photo)
  35.     print("Hey! Das ist dein neues Haustier! Behandle es gut!")
  36.     print("Ach übrigens... es heißt: " + new_tama.name)
  37.     if new_tama.is_hungry:
  38.         new_tama.feed()
  39.     else:
  40.         print(new_tama.name + " hat kein Hunger!")
  41.     print(new_tama.hunger)
  42.     new_tama.updateHunger()
  43.  
  44.  
  45. if __name__ == '__main__':
  46.     main()
  47.  
  48.  


Hier ein kleiner Ausschnitt der Konsole:
Programm startet

-18040180
-18040200
-18040220
-18040240
-18040260
-18040280
-18040300
-18040320
-18040340
-18040360
...and it goes on :D
bb1898
User
Beiträge: 117
Registriert: Mittwoch 12. Juli 2006, 14:28

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon bb1898 » Freitag 21. April 2017, 16:31

BlackJack hat geschrieben:@andr0meda55: Natürlich kann man ein `bool` nicht aufrufen, das sollte ja aber auch gar kein `bool`-Wert sondern eine Methode sein.

Die Ausgabe passt nicht wirklich zur gezeigten `main()`, es sei denn in der `feed()`-Methode steht eine Schleife und die Ausgabe mit dem Hunger wird noch mal irgend wo anders gemacht.

Es ist ja auch die _gewünschte_ Ausgabe und nicht die, die wirklich kommt (wie die jetzt aussieht, steht nicht im Beitrag).
bb1898
User
Beiträge: 117
Registriert: Mittwoch 12. Juli 2006, 14:28

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon bb1898 » Freitag 21. April 2017, 16:47

andr0meda55 hat geschrieben:Woah, jetzt, sobald ich das Programm starte, geht es innerhalb Millisekunden in den Millionen Bereich, im Minus wohlbemerkt und meine CPU hat so einiges am arbeiten :shock:
  1. class Tamapython(object):
  2.     def __init__(self):
  3.         self.name = 'name'
  4.         self.hunger = 100
  5.         self.photo = '(づ。◕‿‿◕。)づ'
  6.         self.is_hungry = False
  7.         self.is_alive = True
  8.  
  9.         def is_hungry(self):
  10.             return self.hunger <= 50
  11.  
  12.         def is_alive(self):
  13.             return self.hunger <= 1
  14.  
  15.  
  16.     # ------------------------------------------------- #
  17.     def feed(self):
  18.         while self.is_hungry == True:
  19.             self.hunger += 20
  20.  
  21.  
  22.  
  23.     # ------------------------------------------------- #
  24.     def updateHunger(self):
  25.         while self.is_alive == True:
  26.             self.hunger -= 20
  27.             print(self.hunger)
  28.  
  29.  
  30.  
  31.  
  32. def main():
  33.     new_tama = Tamapython()
  34.     print(new_tama.photo)
  35.     print("Hey! Das ist dein neues Haustier! Behandle es gut!")
  36.     print("Ach übrigens... es heißt: " + new_tama.name)
  37.     if new_tama.is_hungry:
  38.         new_tama.feed()
  39.     else:
  40.         print(new_tama.name + " hat kein Hunger!")
  41.     print(new_tama.hunger)
  42.     new_tama.updateHunger()
  43.  
  44.  
  45. if __name__ == '__main__':
  46.     main()
  47.  
  48.  


Hier ein kleiner Ausschnitt der Konsole:
Programm startet

-18040180
-18040200
-18040220
-18040240
-18040260
-18040280
-18040300
-18040320
-18040340
-18040360
...and it goes on :D


Kein Wunder. Du hast immer noch gleich benannte Methoden und Datenattribute, jetzt sogar zwei davon (is_hungry und is_alive). Die Methoden hast Du in Deine __init__-Methode hineingeschachtelt, ich weiß nicht, ob das Deine Absicht war oder nicht (wohl eher nicht). Du rufst sie jedenfalls nicht auf, sondern fragst das Datenattribut is_hungry in einer Endlosschleife ab, ohne dass es je geändert würde. Und die sinnlosen Vergleiche "== True" sind auch noch immer da.

Wenn Du die beiden Datenattribute ersatzlos streichst, statt dessen die entsprechenden Methoden herausrückst und damit zu eigenständigen Methoden der Klasse machst, und im Hauptprogramm die Methode is_hungry aufrufst, dann sollte eigentlich passieren, was Du Dir vorstellst.

Dass das Tierchen hungrig wird, wenn sein Hunger-Wert _unter_ eine vorgegebene Grenze fällt, ist zwar seltsam, dem Computer aber gleichgültig.
andr0meda55
User
Beiträge: 16
Registriert: Montag 10. April 2017, 20:48

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon andr0meda55 » Freitag 21. April 2017, 17:25

Und inwiefern soll ich jetzt == True ersetzen?
z.B zu:
  1.  def updateHunger(self):
  2.         while self.is_alive:
  3.             self.hunger -= 20
  4.             print(self.hunger)

?
Benutzeravatar
BlackJack
Moderator
Beiträge: 32218
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon BlackJack » Freitag 21. April 2017, 17:34

@andr0meda55: Die ``while``-Schleifen gehören nicht in die Methoden und die gezeigte ist ziemlich offensichtlich einen Endlosschleife weil sich die Werte für die Bedingung niemals ändern. Falls ``self.is_alive`` an einen Wahrheitswert gebunden ist, dann sehe ich da innerhalb der Schleife keinen Code der das jemals ändert, und falls ``self.is_alive`` eine Methode ist, dann ist die als Wahrheitswert betrachtet immer ”wahr”. Es macht aber keinen Sinn eine Methode als Wahrheitswert zu betrachten. Die sollte man *aufrufen* und damit ihren *Rückgabewert* als Bedingung verwenden. Dann macht das schon eher Sinn.
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. — Brian W. Kernighan
andr0meda55
User
Beiträge: 16
Registriert: Montag 10. April 2017, 20:48

Re: Hunger geht in Minus, Health bleibt gleich?!

Beitragvon andr0meda55 » Samstag 22. April 2017, 10:03

Ich hab jetzt noch ein bisschen getüftelt..
Jetzt wenn ich das Programm starte, funktioniert es so:
(づ。◕‿‿◕。)づ
Traceback (most recent call last):
Hey! Das ist dein neues Haustier! Behandle es gut!
Ach übrigens... es heißt: name
File "C:/Users/andr0meda55/PycharmProjects/tamapython/tamapython.py", line 46, in <module>
80
80
main()
File "C:/Users/andr0meda55/PycharmProjects/tamapython/tamapython.py", line 41, in main
new_tama.is_hungry()
AttributeError: 'Tamapython' object has no attribute 'is_hungry'

Process finished with exit code 1


Der Code:
  1. class Tamapython(object):
  2.     def __init__(self):
  3.         self.name = 'name'
  4.         self.hunger = 100
  5.         self.photo = '(づ。◕‿‿◕。)づ'
  6.         self.is_alive = True
  7.  
  8.         def is_hungry(self):
  9.             return self.hunger <= 50
  10.  
  11.         def is_alive(self):
  12.             return self.hunger <= 0
  13.  
  14.  
  15.  
  16.     # ------------------------------------------------- #
  17.     def feed(self):
  18.         while self.is_hungry == True:
  19.             self.hunger += 20
  20.  
  21.  
  22.  
  23.     # ------------------------------------------------- #
  24.     def updateHunger(self):
  25.             self.hunger -= 20
  26.             print(self.hunger)
  27.  
  28.  
  29.  
  30.  
  31. def main():
  32.     new_tama = Tamapython()
  33.     print(new_tama.photo)
  34.     print("Hey! Das ist dein neues Haustier! Behandle es gut!")
  35.     print("Ach übrigens... es heißt: " + new_tama.name)
  36.     if new_tama.is_alive:
  37.         new_tama.updateHunger()
  38.     else:
  39.         print(new_tama.name + " hat kein Hunger!")
  40.     print(new_tama.hunger)
  41.     new_tama.is_hungry()
  42.     new_tama.updateHunger()
  43.  
  44.  
  45. if __name__ == '__main__':
  46.     main()
  47.  
  48.  



//EDIT: Habe jetzt den Attribut "is_hungry = False" zur Klasse hinzugefügt und jetzt gehts etwa so:
(づ。◕‿‿◕。)づ
Hey! Das ist dein neues Haustier! Behandle es gut!
Ach übrigens... es heißt: name
80
80
60
Process finished with exit code 0

Zurück zu „Allgemeine Fragen“

Wer ist online?

Mitglieder in diesem Forum: CoderGirl