7 svar
71 visningar
maialk 195
Postad: 8 dec 16:41

funktioner

hej 

jag behöver hjälp med funktioner i python när det gäller globala och lokala funktioner. sen vad som ska bytas innen i funktionen om man tar den här exempel: 

man ska skriva funktionen: 

 

jag har gjort den men det jag har fortfarande svårt med är huvudprogrammet och hur ska man byta allt inne i fnktionen. jag kan inte se fortfarande någon mönster. 

Bedinsis 2998
Postad: 8 dec 17:06

Då du skriver

year= intInput("ange ett år :")

så kommer du anropa funktionen intInput med värdet på variabeln text satt till "ange ett år :". Denna text kommer därmed aldrig ha någon betydelse i programmet eftersom att det är i funktionen intInput som användaren faktiskt ombeds fylla i någonting som har betydelse. Om du vill ha det på det viset, dvs. att intInput hanterar indatan så borde du istället skriva

year= intInput()

samt ta bort "text" som inparameter till intInput. Om du föredrar att ha datahanteringen utanför funktionen (vilket jag rekommenderar) föreslår jag att du istället skriver

def intInput(text):

       year= int(text).strip())

       return year

[---]

indata= input("ange ett år :")

year= intInput(indata)


Då du sedan kommer till läget att det visar sig att användaren angivet ett icke-skottår så anropar du isLeapYear ånyo med den nya inparametern "ange ett år :". "ange ett år :" är det som programmet tror är ett årtal. Du bör ersätta din "elif" med en "else".


Sedan bör isLeapYear alltid returnera ett returnvärde; i den formulering du har gör den bara så om året är jämnt delbart på 4 men inte 400 eller 100. Ta bort en tab på sista raden i funktionen.


Det väsentliga är att funktionerna ska vara väl definierade i vad de gör, och intInput skall väl omvandla en given sträng av bokstäver till motsvarande heltalsvärde, så då bör man inte ha några nya input in i den funktionen; och isLeapyear skall ange om ett givet årtal är ett skottår, så den skall sätta ett värde på isleap efter vad som y är och sedan returnera isleap som returvärde.

Det är som i matematiken. Om f(x) = 3*x+2 så vill vi bara veta om vad ett visst y-värde blir för ett visst x-värde, så det skulle i Pythonform bli något i stil med

def f(x):

      return 3*x+2

Jag är osäker på vad du menar med "byta allt inne i funktionen" så om jag inte besvarat din fråga bara skriv.

maialk 195
Postad: 8 dec 17:12
Bedinsis skrev:

Då du skriver

year= intInput("ange ett år :")

så kommer du anropa funktionen intInput med värdet på variabeln text satt till "ange ett år :". Denna text kommer därmed aldrig ha någon betydelse i programmet eftersom att det är i funktionen intInput som användaren faktiskt ombeds fylla i någonting som har betydelse. Om du vill ha det på det viset, dvs. att intInput hanterar indatan så borde du istället skriva

year= intInput()

samt ta bort "text" som inparameter till intInput. Om du föredrar att ha datahanteringen utanför funktionen (vilket jag rekommenderar) föreslår jag att du istället skriver

def intInput(text):

       year= int(text).strip())

       return year

[---]

indata= input("ange ett år :")

year= intInput(indata)


Då du sedan kommer till läget att det visar sig att användaren angivet ett icke-skottår så anropar du isLeapYear ånyo med den nya inparametern "ange ett år :". "ange ett år :" är det som programmet tror är ett årtal. Du bör ersätta din "elif" med en "else".


Sedan bör isLeapYear alltid returnera ett returnvärde; i den formulering du har gör den bara så om året är jämnt delbart på 4 men inte 400 eller 100. Ta bort en tab på sista raden i funktionen.


Det väsentliga är att funktionerna ska vara väl definierade i vad de gör, och intInput skall väl omvandla en given sträng av bokstäver till motsvarande heltalsvärde, så då bör man inte ha några nya input in i den funktionen; och isLeapyear skall ange om ett givet årtal är ett skottår, så den skall sätta ett värde på isleap efter vad som y är och sedan returnera isleap som returvärde.

Det är som i matematiken. Om f(x) = 3*x+2 så vill vi bara veta om vad ett visst y-värde blir för ett visst x-värde, så det skulle i Pythonform bli något i stil med

def f(x):

      return 3*x+2

Jag är osäker på vad du menar med "byta allt inne i funktionen" så om jag inte besvarat din fråga bara skriv.

ja, jag förstår lite men de anger y i den andra funktionen och den ska man lägga in istället för year. det är det som jag är osäker på att är det alltid så att man ska byta? 

Bedinsis 2998
Postad: 8 dec 17:42 Redigerad: 8 dec 17:43

Aha. En funktion skall fungera för dig självt, utan något yttre beroende. Man skall kunna kopiera-och-klistra-in funktionen i vilken python-fil som helst och den skall ändå kunna användas.

Du kan ange vilket namn på inparametern som helst och det skulle ändå fungera. Det funktionen gör är att den tar värdet  från inparametern, kallar den för det värde du angett, och utför det som funktionen nu skall göra med värdet.

Dessa funktioner är helt ekvivalenta:

def isLeapyear(year):
	isleap = False
	if year % 400 == 0:
		isleap= True
	elif year % 100 ==  0:
		isleap= False
	elif year % 4 == 0:
		isleap= True
	return isleap

def isLeapyear(aar):
	isleap = False
	if aar % 400 == 0:
		isleap= True
	elif aar % 100 ==  0:
		isleap= False
	elif aar % 4 == 0:
		isleap= True
	return isleap

def isLeapyear(y):
	isleap = False
	if y % 400 == 0:
		isleap= True
	elif y % 100 ==  0:
		isleap= False
	elif y % 4 == 0:
		isleap= True
	return isleap

Vad man väljer att ha för namn på sina parametrar bör hjälpa någon som läser koden (vilket oftast är en själv) att förstå vad som koden egentligen gör för något.

I uppgiften har de dock specificerat att de vill att variabeln skall heta "y", så du får rätta dig därefter.

maialk 195
Postad: 8 dec 17:53
Bedinsis skrev:

Aha. En funktion skall fungera för dig självt, utan något yttre beroende. Man skall kunna kopiera-och-klistra-in funktionen i vilken python-fil som helst och den skall ändå kunna användas.

Du kan ange vilket namn på inparametern som helst och det skulle ändå fungera. Det funktionen gör är att den tar värdet  från inparametern, kallar den för det värde du angett, och utför det som funktionen nu skall göra med värdet.

Dessa funktioner är helt ekvivalenta:

def isLeapyear(year):
	isleap = False
	if year % 400 == 0:
		isleap= True
	elif year % 100 ==  0:
		isleap= False
	elif year % 4 == 0:
		isleap= True
	return isleap

def isLeapyear(aar):
	isleap = False
	if aar % 400 == 0:
		isleap= True
	elif aar % 100 ==  0:
		isleap= False
	elif aar % 4 == 0:
		isleap= True
	return isleap

def isLeapyear(y):
	isleap = False
	if y % 400 == 0:
		isleap= True
	elif y % 100 ==  0:
		isleap= False
	elif y % 4 == 0:
		isleap= True
	return isleap

Vad man väljer att ha för namn på sina parametrar bör hjälpa någon som läser koden (vilket oftast är en själv) att förstå vad som koden egentligen gör för något.

I uppgiften har de dock specificerat att de vill att variabeln skall heta "y", så du får rätta dig därefter.

sen på huvudprogrammet när man ska anropa funktionen vad ska man tänka där? alltså vad som är regel? vilka man ska alltid anropa?

Bedinsis 2998
Postad: 8 dec 18:00

Du skall anropa med de inparametrar som funktionerna kräver. Vad du döpt de variablerna till bör vara namn som indikerar vad de har för värde.

maialk 195
Postad: 8 dec 20:21
Bedinsis skrev:

Du skall anropa med de inparametrar som funktionerna kräver. Vad du döpt de variablerna till bör vara namn som indikerar vad de har för värde.

jag föstår inte riktigt kan du ge exempel eller kolla om jag har gjort rätt?

thedifference 409
Postad: 9 dec 07:35

Denna gif diggar jag för att förklara funktioner:

Angående din kod i första inlägget så behöver du tänka på indenteringen i isLeapyear. Ditt return kommer bara hända på ditt sista elif, annars kommer det bli Pythons osynliga return None.

Sen i den nedersta snutten, behöver du ett elif? Antingen är det skottår eller inte. Det finns inget tredje fall. Ditt första funktionsanrop har svarat på den frågan.

Svara
Close