Permalänk
Medlem

Hjälp, Python-programmering

Hej!

Jag ska göra ett program som hanterar premier league, dock ska bara 4 olika lag finnas. Tabellserien ska vara sparad på en separat .txt fil. Det ska finnas en huvudmeny där man kan välja tre olika val. Det ena valet är att "mata in resultat" då får man skriva in hemma resp. bortalag och mata in matchresultatet.

Jag har skapat en klass lag med alla nödvändiga attribut. Skrivit huvudmenyn samt .txt filen
Har dock fastnat när jag skriver funktionen för att mata in resultat. Då hemmalag resp. bortalag måste kontrolleras så att man inte kan skriva lag som inte finns i tabellen.

Själva text filen ser ut såhär:
Arsenal 000000
Manchester United 000000
Liverpool 000000
Newcastle 000000

Samt funktionen för att mata in resultat ser ut såhär:

def mata_in_resultat(): print("Välkommen till resultatinmataren för Premier League") tabell = open("serietabell.txt", "r") laglista = tabell.readlines() lista = [] for namn in laglista: lista.append(lag(namn, spelade_matcher, vinster, oavgjort, förluster, gjorda, insläppta, poäng)) hemmalag = input("Vilket lag är hemmalag?") for namn in laglista: if lag.namn == hemmalag: hemmalag = lag else: print("Laget du angav spelar inte i Premier League, var god försök igen") bortalag = input("Vilet lag är bortalag?") for namn in laglista: if lag.namn == bortalag: bortalag = lag else: print("Laget du angav spelar inte i Premier League, var god försök igen")

Jag tänkte att lagen läggs till i en lista då min lärare sa att det är bättre än att ständigt behöva kalla på filen.
Antar att det är något fel när jag gör listan eller där programmet ska kolla igenom listan om laget man angivet är giltigt.
Någon som förstår sig på detta och är villig att hjälpa mig?

Permalänk
Medlem

Humm, varifrån kommer spelade_matcher, vinster, oavgjort osv? Som det är nu försöker du skapa ett lag och skicka in dom argumenten, men jag ser inte att du själv skapat dom nånstans?

Vet ej hur mycket du kodat i python, men två tips jag har är att använda pickle för att spara/läsa upp filen. Då slipper du själv fundera på den biten, eftersom man kan skicka in valfritt objekt till pickle. Ett annat tips är att lägga lagen i en dicitonary, då kan du hitta dom lätt. Iof kanske det blir lite överkurs..

teams = {} teams["Arsenal"] = {spelade_matcher: 3, vinster:4} teams["Liverpool"] = {spelade_matcher: 2, vinster:0} file = open("tbl.txt", "w") pickle.dump(teams, file) .. .. file = open("tbl.txt", "r") teams = pickle.load(file) teams["Arsenal"]["spelade_matcher"] += 1

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem

Ber om ursäkt för ett långsamt svar!
Men i alla fall, det är attribut i min class Lag.

class Lag():
def __init__(self, namn, spelade_matcher, vinster, oavgjort, förluster, gjorda, insläppta, poäng)
self.namn = namn
self.spelade_matcher = int(spelade_matcher)
self.vinster = int(vinster)
self.oavgjort = int(oavgjort)
self.förluster = int(förluster)
self.gjorda = int(gjorda)
self.insläppta = int(insläppta)
self.poäng = int(poäng)

# Tabellen med lagen och deras statistik
def __str__(self):
return self.namn + "S" + self.spelade_matcher + "V" + self.vinster + "O" + self.oavgjort + "F" + self.förluster + "M" + self.målskillnad + "P" + self.poäng

med mera... (metoderna)

Jag har definierat en class lag som du ser, och den ska funka för alla mina fyra premier league lag bara att attributen kommer att skilja beroende på lag.

Jag har aldrig hört talas om pickle i den undervisning jag fått så tror ej att vi ska behöva använda det. Dictonary har jag hållit på med en del, läraren föreslog lista så valde att köra på det. Nu skickar jag ju med class lag med alla attribut, det borde vell funka?

Har verkligen fastnat :s

Permalänk
Medlem

Det fina med pickle är att du slipper fundera på hur du ska läsa in/spara ner textfilen, eftersom pickle kan spara alla sorters python objekt (så länge man inte gör något speciellt/komplicerat). Men du måste givetvis inte använda den, är säkert mer lärorikt o göra på det jobbiga sättet när du väl fått det o funka

Ett tydligt problem du har är att klassen Lag har stort L, medan när du skapar den i lista.append( så skriver du med liten bokstav (lag). Ett annat är varifrån du får tex spelade_matcher på samma rad? Jag tror att du egentligen vill läsa upp den siffran från filen, men det gör du aldrig? Det enda du gör är att läsa upp en hel rad från filen och sätta namn till hela raden.

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem

Har för mig att stora och små bokstäver inte gör någon skillnad i den nyare pythonversionen. Men ändrade allt till små nu iaf.
Jag vill ju egentligen lägga till alla rader till listan, med lagens statistik dvs. Sedan vill jag att for satsen ska kolla om laget man angett är korrekt. Dvs den ska bara kolla attributet namn. Antar att jag borde ändra till for rad så att hela raderna läses in men att bara namn kollas? Får i alla fall syntax error.

def mata_in_resultat():
print("Välkommen till resultatinmataren för Premier League")
tabell = open("serietabell.txt", "r")
laglista = tabell.readlines()
lista = []
for rad in laglista:
lista.append(lag(namn, spelade_matcher, vinster, oavgjort, förluster, gjorda, insläppta, poäng))
hemmalag = input("Vilket lag är hemmalag?")
for namn in laglista:
if lag.namn == hemmalag:
hemmalag = lag
else:
print("Laget du angav spelar inte i Premier League, var god försök igen")
bortalag = input("Vilet lag är bortalag?")
for namn in laglista:
if lag.namn == bortalag:
bortalag = lag
else:
print("Laget du angav spelar inte i Premier League, var god försök igen")

Permalänk
Medlem

Du måste lägga din kod i [code]-taggar som du gjorde i första inlägget, annars blir det oläsligt. Det är enklare o ge dig hjälp om du dessutom klipper in eventuella felmsg du får, dom brukar beskriva precis vad som är fel. Dom flesta som läser på swec orkar nog inte starta python osv, men kan ibland hjälpa till ändå och då hjälper det o veta precis vad som går fel.

Iaf, det kanske går upp ett ljus för dig om du funderar över varifrån alla variablarna kommer ifrån i den här raden:
lista.append(lag(namn, spelade_matcher, vinster, oavgjort, förluster, gjorda, insläppta, poäng))
Hur kan programmet veta vad spelade_matcher är för något tex? Försök fundera över det lite.

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem

Jo vet, blev fel när jag klistra in där men självklart har jag [code]-taggarna kvar i mitt program.

Nej det är inte meningen att någon ska behöva starta upp python utan jag tänkte mer att om man har erfarenhet av programmering och främst python då (vet ej hur mycket det skiljer från andra språk) så kan man nog snabbt se vad som är fel i det jag skrev.

Skrev att jag fick syntax error.

Fick hjälp av en lärare idag och det berodde på att jag inte hade angett vart programmet skulle börja samt glömt ett kolon... Så det var ingen bigg deal bara brist på erfarenhet från min sida!

Det är sant det du skriver och har funderat lite på det. Tänkte lösa det genom att lägga in / i min .txt fil mellan lagnamnet och resten av attributen. Sedan tillsätta split(/) vid inläsning till listan. Låter det rimligt?

Tack för hjälpen, det uppskattas verkligen!

Permalänk
Medlem
Skrivet av misr:

Jo vet, blev fel när jag klistra in där men självklart har jag [code]-taggarna kvar i mitt program.

Nej det är inte meningen att någon ska behöva starta upp python utan jag tänkte mer att om man har erfarenhet av programmering och främst python då (vet ej hur mycket det skiljer från andra språk) så kan man nog snabbt se vad som är fel i det jag skrev.

Skrev att jag fick syntax error.

Fick hjälp av en lärare idag och det berodde på att jag inte hade angett vart programmet skulle börja samt glömt ett kolon... Så det var ingen bigg deal bara brist på erfarenhet från min sida!

Det är sant det du skriver och har funderat lite på det. Tänkte lösa det genom att lägga in / i min .txt fil mellan lagnamnet och resten av attributen. Sedan tillsätta split(/) vid inläsning till listan. Låter det rimligt?

Tack för hjälpen, det uppskattas verkligen!

Ah, men att bara skriva att du får syntax error hjälper inte hela vägen. Om du klippt in hela felmeddelandet är jag ganska säker på att det tex hade stått vilken rad som felet fanns på. Dessutom var det ju inte fel i koden du klippte in, och det hade oxå hjälpt att få se vad som blev fel eftersom felmeddelandet hade pekat ut kod som du inte hade visat.

I koden som den såg ut nu fanns bara ett fel vad jag kan se, och det är att du försökte använda variabler som inte skapats ännu. Fast det verkar mest bero på att du antingen definierat dom utanför koden du klippte in eller att koden du först klippte in inte är samma som den som nu funkar

Ang att splitta ut svaret, så absolut. Ser inget direkt fel i det. Även om det skulle vara lite enklare med pickle
Ett annat lite lurigt alternativ jag använt ett par gånger är att spara mina settings (tex en level) i .py-filer. Då är det bara o köra import på dom så kommer dom in i programmet (gäller bara att se till att skriva ut korrekt python när man sparar). Fast det är nog ingen bra metod att rekommendera för dom vanliga tillfällena, är ganska fult även om det är praktiskt

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon