Tunier, Begegnungen ermitteln

Code-Stücke können hier veröffentlicht werden.
Antworten
marlene
User
Beiträge: 26
Registriert: Montag 13. September 2010, 12:11

Hallo,

ich habe ein kleines Programm erstellt, mit dem man Gruppen erstellen kann, Manschaften in die Gruppe einfügen und
Spielpaarungen generiert werden.

Über Kritik, und Verbesserungen bin ich wie immer dankbar.

Code: Alles auswählen

from random import shuffle

class Gruppen(object):
    def __init__(self):
        self.team_liste =[]
        self.graph =[]
        self.paarungs_liste =[]

#teams erstellen
    def teams_anlegen(self, team_anz):
        self.team_anz = team_anz
        for i in range (self.team_anz):
            self.name = raw_input('Team anlegen: ')
            self.team_liste.append(self.name)
        print self.team_liste

#Graphen erstellen                    
    def graph_erstellen(self):
        self.teams = len(self.team_liste)
        self.j = 0
        for i in range(self.teams):
            self.graph.append([])
            for i in range(len(self.graph)):
                self.graph[self.j].append(0)
            while len(self.graph[self.j]) <= self.teams-1:
                self.graph[self.j].append(1)
            self.j += 1
        print self.graph

#Paarungen erstellen
    def paarungsliste_erstellen(self):
        for i in range(len(self.graph[0])):
            for j in range(len(self.graph)):
                if self.graph[i][j] == 1:
                    self.paarungs_liste.append(self.team_liste[i] + ' : ' + self.team_liste[j])
        print self.paarungs_liste

#Paarungen werden gemischt
    def paarungen_mischen(self):
        shuffle(self.paarungs_liste)
        for paarung in (self.paarungs_liste):
            print paarung
BlackJack

@marlene: Der erste Eindruck ist, dass es sich um ein paar Funktionen handelt, die in einer `Gruppen`-Klasse zusammengefasst sind und letztendlich über "globale" Variablen kommunizieren. Ich sehe da keinen Grund für eine Klasse -- das kann man auch mit ein paar Funktionen und ordentlicher Argumentübergabe lösen.

Programmlogik und Benutzerinteraktion sind vermischt. Man kann den Code zum Beispiel nicht so einfach wiederverwenden wenn die Daten aus einer Datei, Datenbank oder GUI kommen.

Der konkrete Typ eines Objekts sollte möglichst nicht im Namen auftauchen. Sonst kann man später den Typ nicht mehr ändern ohne auch alle Vorkommen des Namens anzupassen oder mit falschen, irreführenden Namen zu leben. Bei Exemplaren von Containertypen kann man zum Beispiel einfach die Mehrzahl beim Namen verwenden, also `teams` statt `team_liste` oder `paarungen` statt `paarungs_liste`.

Alle Attribute sollten in der `__init__()`-Methode erstellt werden und ein Objekt sollte von aussen gesehen jederzeit in einem konsistenten und benutzbaren Zustand sein.

In `graph_erstellen()` erstellst Du zwei neue Attribute, die allerdings gar nicht wirklich auf dem Objekt verfügbar sein müssten. `teams` und `j` werden doch nur lokal verwendet!? Ausserdem hat `i` immer den gleichen Wert wie `self.j`, also ist eines von beiden überflüssig.

Da 0 und 1 hier als Wahrheitswerte verwendet werden, wäre `True` und `False` deutlicher.

Letztendlich ist das aber auch alles ein wenig zu kompliziert. Das lässt sich auch so schreiben:

Code: Alles auswählen

import random
from functools import partial


def iter_pairs(teams):
    for i, team_a in enumerate(teams):
        for j, team_b in enumerate(teams):
            if i < j:
                yield (team_a, team_b)


def main():
    teams = list(iter(partial(raw_input, 'Team anlegen: '), ''))
    pairs = list(iter_pairs(teams))
    random.shuffle(pairs)
    for pair in pairs:
        print '%s : %s' % pair


if __name__ == '__main__':
    main()
Die Eingabe der Teams wird mit einer Leereingabe beendet.
marlene
User
Beiträge: 26
Registriert: Montag 13. September 2010, 12:11

@BlackJack, ja so wies aussieht hab ich noch viel, viel, viel zu lernen und üben, besonders auch über Klassen und Programme mit der richtigen Logik aufzubauen.

functools und enumerate kann ich bis jetzt noch nicht, ich bin Stunden dagessen und hab dieses "Programm" geschrieben, ich denk mal du hast dafür 5min. gebraucht, und ein brauchbares Ergegnis gehabt. :cry:

Ich wollte das alles in OOP machen, weil das irgendwann weiterführen will mit Ergebnissen, Achtl- oder Viertelfinale usw. und dem ganzen dann eine GUI geben.

Merci
BlackJack

@marlene: Das alles in Klassen zu stecken nur um es in "OOP" zu machen ist keine gute Idee. OOP ist kein Selbstzweck. Wenn etwas einfach mit Funktionen lösbar ist, bekommt man nicht automatisch einen *echten* OOP-Entwurf, in dem man die Funktionen in Klassen steckt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

vielleicht ist Dir das ja nützlich:
http://python-forum.de/viewtopic.php?f= ... ound+robin
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
marlene
User
Beiträge: 26
Registriert: Montag 13. September 2010, 12:11

@Hyperion, ja danke is nützlich, ich werd mal schauen und mein script immer wieter ausbauen, wenn ichs schaff :)
Antworten