Variablennamen auf str und int zusammensetzen

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__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sofasurfer0815: Ja schon, der `Spieler` wird dann an die Liste `result` angehängt. Und das war es dann aber auch schon. Wo steht denn das `result` an den Aufrufer der Funktion zurückgegeben werden soll? Das ist einfach eine lokale Liste.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sofasurfer0815
User
Beiträge: 14
Registriert: Sonntag 22. Juli 2018, 11:06

OK - verstanden.
Ich habe die Zeile "Spieler(result)" angefügt.
Damit sollte mir z.B. der Spieler "Hans" mit Kontostand 0 angelegt werden, aber:

(1) Namen eingeben - (2) Spiel eingeben - (3) Spielstand anzeigen
1
Eingabe Spielernamen:
=====================
Spieler 1:a
Traceback (most recent call last):
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 162, in <module>
main()
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 97, in main
players = Spieler.input_players(4)
File "C:/Users/julian/PycharmProjects/Schafkopfrechner/Schafkopfrechner.py", line 18, in input_players
Spieler(result)
TypeError: __init__() missing 1 required positional argument: 'konto'

Konto "0" ist doch in result drin.
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sofasurfer0815: Was soll die Zeile denn bewirken? Wenn Du `Spieler` aufrufst, erstellst Du *ein* Spieler-Objekt. Und der Aufruf erwartet einen Namen und einen Kontostand als Argumente. Du übergibst keinen Kontostand und als Namen eine Liste mit Spieler-Objekten. Das macht keinen Sinn. Die Funktion muss das Ergebnis an den Aufrufer zurückgeben. Das steht da nicht in der Funktion. In der `spielwert_berechnen()`-Funktion wird ja ein Wert an den Aufrufer zurückgegeben. Du weisst also wie das geht. Du musst es nur machen. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

sofasurfer0815 hat geschrieben: Sonntag 22. Juli 2018, 14:16 OK - verstanden.
Nein, nicht wirklich.
Die Liste result muss am Ende der Funktion an den 'Caller' zurück gegeben werden
Wenn du das nicht explizit machst, gibt die Funktion None zurück.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@sofasurfer0815: Dein Programmcode ist Dir, gemessen an Deinen Einsteigerwissen, über den Kopf gewachsen. Das ist ein häufiger Fehler. Auch hast Du nicht bemerkt, dass in Deinem Code Typeannotations drin waren, weil Du annahmst, diese Syntax mache etwas anderes. Auch der Hinweis auf den @staticmethod-Dekorator wird Dich nicht weiter bringen.

Am besten Du fängst noch einmal von vorne an mit dem Beispiel von Sirius3 und versuchst dessen Code zu verstehen. Z.B. warum 'input_players' keine Methode auf 'Spieler' ist. Warum sollte auch ein Spieler dafür zuständig sein, sich selbst und weitere anzulegen? Und wo landet dann die Spielerliste? Das sind Designfehler, die Dir das Verständnis Deines eigenen Codes erschweren und diesen auch umständlich und fehlerträchtig machen.
Zuletzt geändert von kbr am Sonntag 22. Juli 2018, 14:39, insgesamt 1-mal geändert.
sofasurfer0815
User
Beiträge: 14
Registriert: Sonntag 22. Juli 2018, 11:06

Ich möchte aber nicht mit "return result" die Liste an diese Stelle zurückliefern:

Code: Alles auswählen

        if auswahl == "1":  # Eingabe Spielernamen
            print("Eingabe Spielernamen:")
            print("=====================")
            players = Spieler.input_players(4)
Stattdessen will ich daraus eher folgendes "stricken":

s1 = Spieler ("julian", 0)
s2 = Spieler ("__blackjack__", 0)
usw.

Ich glaub, ich sitz auf dem Schlauch ... Schonmal danke für die Geduld mit mir!
sofasurfer0815
User
Beiträge: 14
Registriert: Sonntag 22. Juli 2018, 11:06

@ kbr

Ich fürchte, du hast recht!
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sofasurfer0815: Doch Du möchtest an der Stelle die Liste mit ``return`` zurück geben und Du möchtest *nicht* einzelne Namen nach dem Muster `s1`, `s2`, usw. haben. Statt dieser einzelnen Namen nimmt man eine Liste. Wenn Du anfängst Namen zu nummerieren, machst Du etwas falsch. Und alles viel komplizierter als es sein müsste. Um zum Beispiel alle Spieler in der Liste auszugeben, egal wie viele das sind, reicht folgender Code:

Code: Alles auswählen

for player in players:
    print(player)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sofasurfer0815
User
Beiträge: 14
Registriert: Sonntag 22. Juli 2018, 11:06

Danke. Jetzt hab ich's kapiert.
Ich arbeite mir der Liste, die ich in "result" habe. Ich hab das jetzt eingebaut und es funktioniert.

Aber mein Code überfordert mich:
Ich lege jetzt eine Liste mit Spielern an und kann mit dieser in main() arbeiten; aber benötige ich dann überhaupt die Klasse Spieler?
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sofasurfer0815: Was hat denn das eine mit dem anderen zu tun? Also wie sollte eine Liste in die Du `Spieler`-Exemplare steckst, `Spieler` als Datentyp unnötig machen? Die Klasse `Spieler` beschreibt Daten und Verhalten von *einem* Spieler. Und die Liste fasst mehrere konkrete Spieler-Werte zusammen. Jeder einzelne davon hat/braucht ja immer noch die Daten und das Verhalten das einen Spieler ausmacht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sofasurfer0815
User
Beiträge: 14
Registriert: Sonntag 22. Juli 2018, 11:06

OK. Ich muss Spieler als "Datentyp" sehen, und nicht als Container, in den ich Daten reinstecke.
Danke, das hab ich ursprünglich falsch verstanden.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Doch, doch: Klassen (bzw. Instanzen davon) sind schon eine Art Container, in die Du Daten reinstecken kannst. Diese werden dann zu den Attributen. Klassen sind aber auch Datentypen in der Hinsicht, dass Du zusätzlich noch Methoden anlegen kannst, die dann z.B. gegen diese Attribute arbeiten.
Antworten