Liste mit Absätzen wieder geben!

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
Antek_png
User
Beiträge: 1
Registriert: Donnerstag 17. November 2016, 00:05

Hallo Leute,
Nach dem ich vor einiger Weile am programmieren Lernen
Verzweifelt bin, habe ich mich dazu entschlossen es mit Python wieder auf zu nehmen!
Da ich noch die meisten Grundlagen aus meinem Buch im Kopf hatte, versuche ich mich momentan an einem eigenen Programm. Nun möchte ich eine Inventar funktion einbauen. So das ich nach dem "Inventar" eingegeben worden ist ein kleiner Text auftaucht, der soll in etwa so aus sehen:
×[Inventar von ~Name~]×
| Geld : 0
#Soweit klappt alles noch einfach da ich Geld als normal Variable ein bauen kann doch jetzt möchte ich die Items angeben die ich zu vor in einer Liste festgelegt hatte. Ich hoffe ihr versteht soweit wie ich mir das vorstelle :( Nun möchte ich einfach nur das die Items hinter einander aufgelistet werden, von mir aus auch zu erst ohne jegliche Deko. Doch mein nächstes Problem wäre dann wohl dahinter auch noch die Anzahl der Items unter zu bringen.
Am liebsten würde ich das mit einer Funktion machen.

Jedoch bin ich jeder art von Lösungsansatz dankbar.
Nett wäre es wenn man mir das mit der Listeund den Dazugehörigen input-codes sendet.

Danke
Ante.png
BlackJack

@Antek_png: Offenbar sind doch nicht die nötigen Grundlagen im Kopf geblieben, denn der Umgang mit Listen, Zeichenketten, Schleifen, und das Definieren von Funktionen sind eigentlich elementar.

Zumal die Beschreibung in dem Beitrag, zumindest mir, keine Vorstellung davon verschafft, was Du da eigentlich *genau* machen willst, und wo es denn nun ganz *konkret* hakt‽
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

Du kannst es so machen wie in
viewtopic.php?f=1&t=39357#p300905.

Dann passende Namen wählen:
Token --> Gegenstand mit Name, Anzahl, Beschreibung, Wert, .... (statt id und text)
TokenListe --> Inventar

Dann in der Klasse Inventar eine Funktion 'schoen_ausgeben' programmieren,
die alles schön ausgibt.

Code: Alles auswählen

class Inventar(list):
    def schoen_ausgeben(self):
        for gegenstand in self:
            print("Name: {0}\n  Geld: {1}".format(gegenstand.name, gegenstand.geld))
BlackJack

Und auch hier wieder die Anmerkung von mir: Ich würde nicht von `list` erben. Denn dann muss man sich auch über alle Methoden/Operationen von `list` Gedanken machen ob die hier Sinn machen so wie sie funktionieren und sie gegebenenfalls so implementieren wie der Benutzer das erwartet. Das ist ein schneller Hack der auf den ersten Blick praktisch aussehen mag, der aber später Probleme machen kann. Ich denke Komposition gegenüber Vererbung zu bevorzugen ist mittlerweile „best practise“ in der objektorientierten Programmierung. Und hier sehe ich noch nicht einmal den Sinn einer Methode gegenüber einer einfachen Funktion.

Und spätestens wenn das Programm umfangreicher wird, möchte man ja nicht einmal die Programmlogik mit der Benutzerinteraktion vermischen, dann also erst recht nicht die grundlegenden Datenstrukturen.
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

Komposition ist zu schwierig für Anfänger
außer du machst ein kleines Beispiel.
Dann sehen die Anfänger den Unterschied.
BlackJack

@heiner88: Nö, das stimmt nicht! So lernt man normalerweise OOP. Normalerweise fängt man ja nicht mit Vererbung an sondern mit Klassen die von nichts (ausser vielleicht `object`) abgeleitet sind und die aus mehreren Bestandteilen zusammengesetzt sind → Komposition. Die typischen Beispiele 2D-Punkt/Ortsvektor, Auto, Bankkonto, …. Erst wenn man das verstanden hat, geht es zu Vererbung weiter.

Das Argument „zu schwierig für Anfänger“ trifft auch auf Deine Lösung zu, denn das kann man wie gesagt ganz ohne OOP mit einer einfachen Funktion ausdrücken. Anderseits ist es ein unsinniges Argument, denn *alles* ist zu schwierig bis man es denn mal gelernt hat. Ansonsten könnte man auch Funktionen weg lassen, oder ”Funktionen” ohne Argumente und Rückgabewerte und viel ``global`` verwenden und Wörterbücher weg lassen, weil Anfänger lieber ”dynamische Variablennamen” haben wollen. Wie gut das es `eval()` und `exec()` gibt. Sollte man jedem Anfänger wärmstens empfehlen. :twisted:

Ich finde halt man sollte Anfängern keine Hacks andrehen die negative Folgen haben können, und schon gar nicht wenn es sauberere Lösungen gibt die nur geringfügig komplexer sind, oder wie in diesem Fall sogar *weniger* komplex.

Edit: Als einfache Funktion:

Code: Alles auswählen

def inventar_ausgeben(inventar):
    for gegenstand in inventar:
        print("Name: {0}\n  Geld: {1}".format(gegenstand.name, gegenstand.geld))
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

Du hast Komposition vorgeschlagen.
BlackJack

@heiner88: Nein. Nicht für diesen Fall. Allgemein. Für diesen Fall habe ich den Sinn einer Klasse insgesamt in Frage gestellt. Darum kann ich hier jetzt auch kein sinnvolles Beispiel für diesen Fall bringen weil ob nun Komposition oder Vererbung, beides ist eine unnötig aufgeplusterte Funktion.
Antworten