Def funktioner med flera parametrar
Hej!
Jag vill att utskriften ska se ut som jag skrev men facit svarar istället D) [ 0 1 ] [1] 1 2 fastän jag tänkte mig något svar som G) [0 1] ,[1 2] 2,4. Jag förstår inte, körs inte koden def funktioner innan def main? Den anropas ju?
Har du möjlighet att klippa in koden som programmeringskod (knappen {;}) istället för ett foto? Jag blir snurrig av att försöka köra den i huvudet. :-)
Vad menar du med det här? "körs inte koden def funktioner innan def main?"
Skriv ut v2_copy också så blir kanske nånting klarare.
Laguna skrev:Skriv ut v2_copy också så blir kanske nånting klarare.
Jag tror jag förstår varför d) är svaret eftersom de anropar v2_copy men i print så står det vara v2 som är [1] under def main funktionen.
sictransit skrev:Har du möjlighet att klippa in koden som programmeringskod (knappen {;}) istället för ett foto? Jag blir snurrig av att försöka köra den i huvudet. :-)
def f(v1,v2,i1,i2):
v1.append(1)
v2.append(2)
i1=i1+1 #denna körs inte?
i2=i2+2 #denna körs inte heller ?
def main():
v1=[0]
v2=[1]
v2_copy=v2[:]
i1=1
i2=2
f(v1,v2_copy,i1,i2)
print(v1,v2,i1,i2)
main()
Jodå!
De rader du kommenterat körs visst. Läs på om reference och value types. Dina integers är value types så de i1/i2 du har inne i funktionen f() kommer att räknas upp, men det påverkar inte de du har i main().
Jag petade in en print() för att visa.
v2_copy i main kommer också att innehålla ytterligare ett element, men det påverkar inte vad som finns i v2.
def f(v1,v2,i1,i2):
v1.append(1)
v2.append(2)
i1=i1+1 #denna körs inte?
i2=i2+2 #denna körs inte heller ?
print ("inne i f(): ", v1, v2, i1, i2)
def main():
v1=[0]
v2=[1]
v2_copy=v2[:]
i1=1
i2=2
f(v1,v2_copy,i1,i2)
print("tillbaka i main innehåller v2_copy: ", v2_copy)
print(v1,v2,i1,i2)
main()
inne i f(): [0, 1] [1, 2] 2 4
tillbaka i main innehåller v2_copy: [1, 2]
[0, 1] [1] 1 2
** Process exited - Return Code: 0 **
Press Enter to exit terminal
sictransit skrev:Jodå!
De rader du kommenterat körs visst. Läs på om reference och value types. Dina integers är value types så de i1/i2 du har inne i funktionen f() kommer att räknas upp, men det påverkar inte de du har i main().
Jag petade in en print() för att visa.
v2_copy i main kommer också att innehålla ytterligare ett element, men det påverkar inte vad som finns i v2.
def f(v1,v2,i1,i2): v1.append(1) v2.append(2) i1=i1+1 #denna körs inte? i2=i2+2 #denna körs inte heller ? print ("inne i f(): ", v1, v2, i1, i2) def main(): v1=[0] v2=[1] v2_copy=v2[:] i1=1 i2=2 f(v1,v2_copy,i1,i2) print("tillbaka i main innehåller v2_copy: ", v2_copy) print(v1,v2,i1,i2) main() inne i f(): [0, 1] [1, 2] 2 4 tillbaka i main innehåller v2_copy: [1, 2] [0, 1] [1] 1 2 ** Process exited - Return Code: 0 ** Press Enter to exit terminal
Okej så det enda som ska skrivas ut är sakerna som finns i main? Jag förstår inte varför ändringarna i v2, i1 och i2 från f funktionen inte påverkas i main? V1 blir ju exakt som v1.append(1) när vi ska skriva ut den
destiny99 skrev:Okej så det enda som ska skrivas ut är sakerna som finns i main? Jag förstår inte varför ändringarna i v2, i1 och i2 från f funktionen inte påverkas i main? V1 blir ju exakt som v1.append(1) när vi ska skriva ut den
Har du koll på skillnaden mellan reference och value types? Annars är det svårt att förstå vad som händer. Du fick en länk lite tidigare, men det finns förstås en massa info därute på nätet.
Jag har bytt namn på dina argument till funktionen f(), för att man inte skall blanda ihop dem med vad som finns i main().
def f(list1,list2,int1,int2):
list1.append(1) # adderar element till det som referensen list1 pekar på
list2.append(2) ) # adderar element till det som referensen list2 pekar på
int1=int1+1 # räknar upp int1, men inte i1 i main
int2=int2+2 # räknar upp int2, men inte i2 i main
def main():
v1=[0]
v2=[1]
v2_copy=v2[:] # kopiera innehållet i v2 till en ny lista v2_copy
i1=1
i2=2
f(v1,v2_copy,i1,i2)
print(v1,v2,i1,i2)
main()
In i funktionen f() skickar du referenser till v1 och v2_copy, samt värdena i1 och i2. Notera skillnaden!
v1 och v2_copy i main() kommer att uppdateras av f() eftersom du skickar referenser till list-objekten.
i1 och i2 i main() kommer inte att uppdateras av f() eftersom du skickar en kopia av (innehållet i) variablerna.
sictransit skrev:destiny99 skrev:Okej så det enda som ska skrivas ut är sakerna som finns i main? Jag förstår inte varför ändringarna i v2, i1 och i2 från f funktionen inte påverkas i main? V1 blir ju exakt som v1.append(1) när vi ska skriva ut den
Har du koll på skillnaden mellan reference och value types? Annars är det svårt att förstå vad som händer. Du fick en länk lite tidigare, men det finns förstås en massa info därute på nätet.
Jag har bytt namn på dina argument till funktionen f(), för att man inte skall blanda ihop dem med vad som finns i main().
def f(list1,list2,int1,int2): list1.append(1) # adderar element till det som referensen list1 pekar på list2.append(2) ) # adderar element till det som referensen list2 pekar på int1=int1+1 # räknar upp int1, men inte i1 i main int2=int2+2 # räknar upp int2, men inte i2 i main def main(): v1=[0] v2=[1] v2_copy=v2[:] # kopiera innehållet i v2 till en ny lista v2_copy i1=1 i2=2 f(v1,v2_copy,i1,i2) print(v1,v2,i1,i2) main()
In i funktionen f() skickar du referenser till v1 och v2_copy, samt värdena i1 och i2. Notera skillnaden!
v1 och v2_copy i main() kommer att uppdateras av f() eftersom du skickar referenser till list-objekten.
i1 och i2 i main() kommer inte att uppdateras av f() eftersom du skickar en kopia av (innehållet i) variablerna.
Jag är inte helt med riktigt. Det såg rörigare ut än vad jag tänkte mig. Jag söker upp reference och value types på youtube så får vi hoppas de går igenom en liknande kod med två def funktioner.
Har du nån lärobok?
Laguna skrev:Har du nån lärobok?
Nej men jag såg på detta klipp som förklarar att listor är föränderliga men inte int, string, float osv.
https://youtu.be/kjSWIriDe9A?si=XGp7xuTPFBux_Cg1
Vad står det i kursbeskrivningen? Rekommenderas det nån informationskälla, eller ska ni försöka lära er allt på egen hand?
Laguna skrev:Vad står det i kursbeskrivningen? Rekommenderas det nån informationskälla, eller ska ni försöka lära er allt på egen hand?
Ingen aning. Jag tror det finns kurslitteratur men det finns ju youtube man kan kolla också.
Det är inte konstigt att du är förvirrad om du inte har någon vettig informationskälla.
"Ingen aning" är i alla fall inte rätt svar. Ta reda på vad kursen kräver av dig och vad det rekommenderas att du ska läsa.
Laguna skrev:Det är inte konstigt att du är förvirrad om du inte har någon vettig informationskälla.
"Ingen aning" är i alla fall inte rätt svar. Ta reda på vad kursen kräver av dig och vad det rekommenderas att du ska läsa.
Jag är bara över koden eftersom det har inte nämnts om sådant. Men nu har jag kollat på den där youtube klippet där de nämner reference and passing values så jag förstår någorlunda.
Vad betyder "Jag är bara över koden"?
Laguna skrev:Vad betyder "Jag är bara över koden"?
jag menar jag var förvirrad över hur svår denna kod såg ut, men när sictansit sa om reference och passing values så nämner de på youtube om detta. Kurslitteratur är valfritt och inget man måste skaffa sig så vitt jag vet.
Väntar du dig att du ska kunna lösa uppgifterna utan att först lära dig något?
Har du en länk till kursbeskrivningen?
Laguna skrev:Väntar du dig att du ska kunna lösa uppgifterna utan att först lära dig något?
Har du en länk till kursbeskrivningen?
Jag tänker man får försöka lösa uppgifterna utifrån de områden man lärt sig enligt kursplanering och sen om man får fel lär man sig och sen söker upp vad det handlar om.
Pass by reference/value är inte mycket svårare än så här:
Listor är reference types.
Integers är value types.
Allt typer i python (och de flesta andra språk) är antingen det ena eller det andra. Typiskt är "enkla" datatyper value types, som en int.
När du skickar in en lista, så skickar du in en referens till listan. Typ, lägg ytterligare ett element i den låda som jag pekar på. Det finns bara en enda låda.
När du skickar in en integer, så skickar du in värdet av den. Typ, jag visar dig en lapp som det står 1 på. Om du skriver 2 på din lapp, så står det fortfarande 1 på min lapp.
destiny99 skrev:Kurslitteratur är valfritt och inget man måste skaffa sig så vitt jag vet.
Asså du behöver ju inte skaffa kurslitteraturen om du inte vill men i framtida kurser kommer det vara ganska många inlämningsuppgifter som är formulerade och skapade på ett sätt där de utgår från väldigt liknande exempel som finns i böckerna så jag hade verkligen rekommenderat att skaffa de. De kanske inte behövs i ettan på TF men i tvåan när man läser t.ex Vektoranalys och Fysmatten så är det bra att ha fått in en vana att använda kurslitteraturen och slå upp relevanta saker. Annars skulle jag säga att det blir onödigt svårt att lösa uppgifterna.
teknikomatte skrev:destiny99 skrev:Kurslitteratur är valfritt och inget man måste skaffa sig så vitt jag vet.
Asså du behöver ju inte skaffa kurslitteraturen om du inte vill men i framtida kurser kommer det vara ganska många inlämningsuppgifter som är formulerade och skapade på ett sätt där de utgår från väldigt liknande exempel som finns i böckerna så jag hade verkligen rekommenderat att skaffa de. De kanske inte behövs i ettan på TF men i tvåan när man läser t.ex Vektoranalys och Fysmatten så är det bra att ha fått in en vana att använda kurslitteraturen och slå upp relevanta saker. Annars skulle jag säga att det blir onödigt svårt att lösa uppgifterna.
I programmeringen har jag bara fått höra av äldre tfysare att man inte behöver skaffa sig litteratur som tex matte och fysik kurserna. Men vad bra, ska ha det i åtanke inför högre årskurser. Tack för att du delade med dig!
sictransit skrev:Pass by reference/value är inte mycket svårare än så här:
Listor är reference types.
Integers är value types.Allt typer i python (och de flesta andra språk) är antingen det ena eller det andra. Typiskt är "enkla" datatyper value types, som en int.
När du skickar in en lista, så skickar du in en referens till listan. Typ, lägg ytterligare ett element i den låda som jag pekar på. Det finns bara en enda låda.
När du skickar in en integer, så skickar du in värdet av den. Typ, jag visar dig en lapp som det står 1 på. Om du skriver 2 på din lapp, så står det fortfarande 1 på min lapp.
"När du skickar in en lista, så skickar du in en referens till listan. Typ, lägg ytterligare ett element i den låda som jag pekar på. Det finns bara en enda låda."
Menar du att referensen pekar på samma objekt som elementet läggs till eller hur man nu säger det?
"När du skickar in en integer, så skickar du in värdet av den. Typ, jag visar dig en lapp som det står 1 på. Om du skriver 2 på din lapp, så står det fortfarande 1 på min lapp."
Ja juste för din etta på din lapp ändras inte ? Jag tänker på exemplet nedan.
Tex
Def num(x):
return x
a=14
num(a)
print(a)