Klass och metod
"Ni ska i denna uppgift läsa in några data om (europeiska) länder från en fil där denna informationen är nationens namn, dess folkmängd och yta. Strukturen ska lagras som en lista av objekt där varje objekt innehåller följande instansvariabler för (ni väljer namn själva): nationens namn, folkmängden, ytan.
När datastrukturen ovan har lästs in ska befolkningstätheten beräknas och lagras som en ny instansvariabel och detta ska ske m h a en metod. "
Jag förstår mig inte riktigt på det där med klass och metod, ska värdena för respektive objekt läggas till i en lista under metoden __init__ eftersom de inte beror av någon variabel? Varje funktion jag försöker räkna ut folktätheten med känner inte igen argumenten som jag definierat under __init__ och programmet kraschar. De här 4 raderna lyckas iallafall printa ut listan:
with open(r'C:\Users\Downloads\europa.txt') as fil:
lista = [line.split() for line in fil]
for x in range (50):
print(' '.join(lista[0+x]))
Är detta en bra början?
class info:
def __init__(self, land, yta, folkmängd):
self.land = land
self.yta = yta
self.folkmängd = folkmängd
i = info()
Det ser vettigt ut, men du måste ange de tre värdena när du skapar objektet.
Sedan, hur räknar du ut befolkningstäthet?
Om du skapar en ny metod och vill referera till värderna du sätter i konstruktorn måste metoden ta emot argumentet self.
On det inte är det du menar får du visa vad du menar med kod och en förklaring.
Laguna skrev:Det ser vettigt ut, men du måste ange de tre värdena när du skapar objektet.
Sedan, hur räknar du ut befolkningstäthet?
Filen vi fick består av tre kolumner med information. Många av ländernas namn är skilda med mellanslag, ex San Marino, och då hamnar San i kolumn 1 och Marino i kolumn 2 om man använder denna kod. Vet inte hur jag ska ange en viss kolumn som ett värde.
[line.split()[0] for line in fil]
Befolkningstätheten räknar jag såhär precis under __init__ men den säger att folktätheten inte är definerad.
def folktäthet(self):
return self.folkmängd / self.yta
f = folktäthet()
Är det möjligen tab-tecken som skiljer kolumnerna åt? Då kan du göra split('\t').
folktäthet är en metod (eller ska vara om du har gjort rätt) i klassen info, och då behöver du en instans av info.
T.ex.
i = info("Pingvinön", 1, 2000)
i.folktäthet()
Laguna skrev:Är det möjligen tab-tecken som skiljer kolumnerna åt? Då kan du göra split('\t').
folktäthet är en metod (eller ska vara om du har gjort rätt) i klassen info, och då behöver du en instans av info.
T.ex.
i = info("Pingvinön", 1, 2000)
i.folktäthet()
Så här ser några rader ut i filen:
Vatican City, 0.44, 900
Malta, 316, 397499
San Marino, 61, 27730
I det här fallet ( i = info("Pingvinön", 1, 2000) ) har man trevliga värden men den info jag sätter inom parentesen måste väl vara hela kolumner från filen för att slippa skapa en info() variabel för alla värden? Den verkar inte kunna ta en list som argument.
Tydligen är det kommatecken som är separator.
Varje rad blir en info-instans.
Laguna skrev:Tydligen är det kommatecken som är separator.
Varje rad blir en info-instans.
Så hur får jag länderna i en kolumn , sep=vadå ? Var det såhär du menade?
class info:
def __init__(self, land, yta, population):
self.land = land
self.yta = yta
self.population = population
def nation(self):
with open(r'C:\Users\Downloads\europa.txt') as fil:
return [line.split()[0] for line in fil]
def area(self):
with open(r'C:\Users\Downloads\europa.txt') as fil:
return [line.split()[1] for line in fil]
def befolkning(self):
with open(r'C:\Users\Downloads\europa.txt') as fil:
return [line.split()[2] for line in fil]
def folktäthet(self):
return befolkning/area ???
Nej. Läs in en rad i taget från filen. Dela upp raden med split. Gör en info-instans av det som står på raden.
info-instanserna får du samla i en lista.
Laguna skrev:Nej. Läs in en rad i taget från filen. Dela upp raden med split. Gör en info-instans av det som står på raden.
info-instanserna får du samla i en lista.
fil = open(r'C:\Users\Downloads\europa.txt')
read = fil.readlines()
Såhär? Den går inte att använda split() på och .readline() lagrar bara första raden.
Du får använda en loop.
Laguna skrev:Du får använda en loop.
Ungefär som jag skrev i början?
with open(r'C:\Users\Downloads\europa.txt') as fil:
lista = [line.split() for line in fil]
for x in range (50):
l = lista[0+x]
Ungefär, men varför anta 50?
Filen är 50 rader lång
Jag antar att du vet det för att du har räknat själv. Det är inte bra att anta sådana saker. Nästa gång programmet används kanske infilen är annorlunda.
Du kan göra så här:
for l in lista:
gör nåt med l
Eller som du på sätt och vis redan har gjort:
for line in fil:
gör nåt med line.split()