tips gällande kod som innehåller ”finn”
Hej! Har följande uppgift och skrivit denna koden men känner mig inte helt säker. Har löst första uppgiften men de två sista är inte lösta och de jag behöver hjälp med. Jag tänker såhär:
import numpy as np
def finn(ivl, y):
v = np.array(ivl)
ivl = np.array(y)
p = np.logical_and(ivl[0] < v, v < ivl[1])
y = np.where(p)
return y
# Testa funktionen
y = np.array([4, 10])
ivl = np.array([2, 6, 3, 9, 2, 2, 1, 9, 2])
print(finn(ivl, y))
och då får jag svaret på andra frågan ”return y” och på tredje [2, 5, 6, 8], vad tycker ni?
Första har du löst och din definition av funktionen ser rimlig ut:
def finn(ivl, y):
Nästa fråga var vad sista raden i funktionen är. Jag tycker din kod är OK och jag har provkört den.
Du har dock svarat:
return index
Det är inte vad du kodat och visat här, så varför svara något annat?
Sedan skall sista frågan inte vara några problem.
Bara kör din kod. Den är OK! Tjusigt!
Överkurs:
Sedan kan jag som erfaren utvecklare ha synpunkter på att funktionen tar ett argument y, använder det och sedan sätter om innehållet till något annat. Python är som det är och det fungerar fint, men i andra språk som java och C# skulle detta ha väldigt oönskade sidoeffekter. Nu var uppgiften definierad som så; ta detta som överkurs läs på om du vill. Det påverkar inte din lösning. Konkret: Om jag skickar in y i en funktion finn() så förväntar jag mig inte att y har modifierats när jag får resultatet från funktionen. Just i python händer inte det, men i många andra språk du kommer i kontakt med om du börjar koda.
Det är lite som att jag ger dig en kortlek och ber dig räkna hur många kungar det finns i den. Du räknar, svarar 4, men medan du räknar så sätter du ett stort kryss på varje kung. Då har du modifierat det jag gav dig, utan att jag rimligen kunde förvänta mig det. Det är en sidoeffekt.
sictransit skrev:Första har du löst och din definition av funktionen ser rimlig ut:
def finn(ivl, y):
Nästa fråga var vad sista raden i funktionen är. Jag tycker din kod är OK och jag har provkört den.
Du har dock svarat:
return index
Det är inte vad du kodat och visat här, så varför svara något annat?
Sedan skall sista frågan inte vara några problem.
Bara kör din kod. Den är OK! Tjusigt!
Överkurs:
Sedan kan jag som erfaren utvecklare ha synpunkter på att funktionen tar ett argument y, använder det och sedan sätter om innehållet till något annat. Python är som det är och det fungerar fint, men i andra språk som java och C# skulle detta ha väldigt oönskade sidoeffekter. Nu var uppgiften definierad som så; ta detta som överkurs läs på om du vill. Det påverkar inte din lösning. Konkret: Om jag skickar in y i en funktion finn() så förväntar jag mig inte att y har modifierats när jag får resultatet från funktionen. Just i python händer inte det, men i många andra språk du kommer i kontakt med om du börjar koda.
Det är lite som att jag ger dig en kortlek och ber dig räkna hur många kungar det finns i den. Du räknar, svarar 4, men medan du räknar så sätter du ett stort kryss på varje kung. Då har du modifierat det jag gav dig, utan att jag rimligen kunde förvänta mig det. Det är en sidoeffekt.
Jättebra feedback tack så jättemycket!
Sebbesilva skrev:
Fick följande feedback i ett annat forum, men förstår inte riktigt vad personen menar, någon här som hade kunnat förklara?
Jo, den som svarat har en poäng.
I uppgiften står faktiskt att funktionen bara består av de två givna raderna, plus den tredje "return ..." som du förväntas skriva.
Kusinen som testkör har dock lite märkliga variabelnamn, där vektorn heter 'Ivl' och intervallet heter 'y'. Det är lätt att låta sig luras. Du hade dock fixat det med två extra rader kod i funktionen, men det är nog tänkt att man skall kasta om argumenten i definitionen istället.
Kika på det här:
import numpy as np
# Eftersom vi vet att funktionen anropats med argumenten omkastade, så får vi kasta om dem i deklarationen.
def finn(v, Ivl):
# För varje värde i vektorn 'v', testa om det det ligger inom min < v < max.
p = np.logical_and(Ivl[0] < v, v < Ivl[1])
y = np.where(p)
return y
# Det här känns som ett intervall, men variabeln heter 'y'.
y = np.array([4, 10])
# Det här är talen som vi skall testa mot intervallet. Ett bra namn vore 'v', men definitivt inte 'Ivl'.
Ivl = np.array([2, 6, 3, 9, 2, 2, 1, 9, 2])
# Returnerar: (array([1, 3, 7]),)
print(finn(Ivl, y))
Jättebra feedback, tack för hjälpen!
Så om jag skulle applicera denna nya kod i min uppgift så blir svaret på andra frågan fortfarande "return y" och på tredje frågan blir svaret "[1,3,7]" eller har jag missförstått koden?
Det verkar rimligt, men kör din kod. När man programmerar kör man sin kod om och om igen tills man är nöjd med och förstår resultatet. vad är annars vitsen? Man skriver kod för att lösa en uppgift.