förklaringtill problem i python, tack

Permalänk
Medlem

förklaringtill problem i python, tack

Jag lyckades till slut komma in på en distanskurs inom data. I denna kurs dyker det upp frågor på vägen som studenten ska klara av. Personligen tycker jag att kursmatrialet suger, då det lämnar välldigt stora luckor i förhållande till frågorna.

En fråga jag kört fast på ser ut som nedan (den ändras varje gång man går in på sidan, men problemet är typ detsamma).
- Jag ber ingen lösa uppgiften åt mig, men en förklaring eller tips om var/hur jag kan hitta lösning till detta skulle vara väldigt hjälpsamt.

"Vilket/vilka av följande kodsnuttar skriver ut alla 35 ord som finns
i listan ”namn”?

Ange de eller det alternativ som är korrekt.

m = 0 s1 = "" while m <= 35: s1 += namn[m] #indented m += 1 #indented print(s1) m = 0 while m < 35: print(namn[m], end=" ")#indented m += 1#indented m = 1 while m < 35: print(namn[m], end=" ")#indented m += 1#indented m = 0 s1 = "" while m < 35: s1 += namn[m] #indented m += 1 #indented print(s1) m = 0 while m < 35: print(namn[m], end=" ")#indented m += 1"

Mitt problem här är att jag inte tycker att något funkar :-/

Permalänk
Medlem

Den som börjar på 0, räknar till 34, slutar vid 35 och printar namn[m] varje gång.

Permalänk
Medlem

Hoj, eftersom det är python vore det glatt om du började med att lägga till "code" taggen kring det du klistrar in här på forumet så man ser indenteringen

Permalänk
Medlem

Hur gör jag det?

Permalänk
Medlem

Nu kan inte jag python direkt. Men tycker mig se åtminstone två som borde fungera.

I alla fall, för att du ska kunna lära dig någonting av detta. Berätta hur du tänker när du utesluter varje kodsnutt, så kan vi rättta dig.
Du lär dig inget på att vi berättar vad som är rätt svar.

Visa signatur

Citera om du skriver till mig. Annars läser jag troligtvis INTE.

Permalänk
Medlem

Jag har ju kommit så långt att jag listat ut att alternativ 1 och tre bör det ju inte kunna vara, då det blir fel antal namn...

Permalänk
Medlem

Anledningen är ju dels,

det är 35 namn som skall räknas upp. Räknandet börjar på 0, så der måste börja på 0 och sluta <35

Permalänk
Medlem

Jag får det nu till alternativ 2 för att:

på rad 1 så nollställs variabeln och rad 2-4 är en whileslinga

"
antal_varv = 0
while antal_varv < 5 :
print("sweclockers") #indented
 antal_varv += 1 #indented
"

Eller?

Permalänk
Medlem

För att se till så att källkod ser rätt ut.
Skriv in koden, markera den och klicka på verktygsknappen code som har en # på sig.

Visa signatur

/M

Permalänk
Medlem

Eftersom du inte ville ha en klar lösning så tänkte jag beskriva precis vad som ska göras:
När man programmerar har listors första plats siffran 0, det gör att den 35:te platsen har siffran 34.
Så det man ska göra är att sätta platsvariabeln till 0, skriva ut vad som finns där och sedan öka platsvariabeln med ett varje varv i loopen och sluta när man skrivit ut plats 34.
...
Jag kollade igenom exemplen och ser att jag antog för mycket. Det är sådär man ofta gör i tidiga exempel på att skriva ut ord i en lista. Men här vill de skriva ut allt som en lång mening på en och samma rad.
Ett av exemplen fungerar. Istället för att skriva ut varje ord och sedan byta till ny rad så ser den till så att allt är samlat och skriver ut det sedan.

Visa signatur

/M

Permalänk
Medlem

Tack.

Det är ungefär så långt jag kommit också.

Jag har inget emot att få svaret, men jag vill gärna få det förklarat så att jag lär mig. Ibland tycker jag tom att det funkar bättre än att hålla på att stirra på en massa fel.

Jag går inte den här kursen för poäng, en del i en utbildning eller något annat sån. Jag gör det för min egen skull, för att jag vill lära mig något nytt. Det råkade bli datorer och programmering (bla för att jag suger på det. Haha)

Permalänk
Medlem

Jag såg två videor som kanske hjälper lite för att förstå hur dessa funkar.
http://youtu.be/D0Nb2Fs3Q8c
http://youtu.be/JKiW4K4Dm0c

a += b betyder samma sak som a = a + b

m = 0 s1 = "" while m < 35: s1 += namn[m] #indented m += 1 #indented print(s1)

m är positionsvariabeln och sätts till 0
s1 är strängen och sätts till ingenting
medans m är mindre än 35 så gör man följande
lägg till namnet på m-positionen till strängen s1
öka m med 1

Ungefär såhär:
lista1 = "a", "b", "c"
string1 = ""

string1 = a
nästa looprunda:
string1 = a och lägg till b
nästa looprunda
string1 = a och b och så lägger man till c

sedan, när hela listan lagts till strängen, då är loopen klar för man har nått slutet på alla som är under 35.
då till sist skriver man ut strängen, utan mellanslag lustigt nog... men det kan ju bero på hur listan ser ut.

Visa signatur

/M

Permalänk
Medlem

Grymt!

Tack så jättemycket. Jag har kollat en video på youtube o ska kolla den andra nu, sen får vi se om jag greppat det. Haha

I´ll be back

Permalänk
Hedersmedlem

Jag minns att jag svarat på en liknande fråga tidigare, så jag kan ta och saxa in det här:

Skrivet av phz:

Ett sätt att lista ut vad som händer är att helt enkelt titta på koden och följa den i huvudet, kanske med ett skrivpapper till hjälp. Om jag som exempel tar koden:

i = 9 while i > 1: print(i) i -= 2

Vad kommer detta skriva ut? Om man läser koden och hänger med så blir det:

  1. När vi når `while`-villkoret första gången så är `i`=9, och 9 är större än 1 — alltså går vi in i loopen.

  2. Vi skriver ut "9".

  3. Vi minskar `i` med 2, så nu är `i`=7.

  4. Vi kommer tillbaka till loopvillkoret. 7 är större än 1, så vi går in igen.

  5. Vi skriver ut "7".

  6. Vi minskar `i` med 2, så nu är `i`=5.

  7. Vi kommer tillbaka till loopvillkoret. 5 är större än 1, så vi går in igen.

  8. Vi skriver ut "5".

  9. Vi minskar `i` med 2, så nu är `i`=3.

  10. Vi kommer tillbaka till loopvillkoret. 3 är större än 1, så vi går in igen.

  11. Vi skriver ut "3".

  12. Vi minskar `i` med 2, så nu är `i`=1.

  13. Vi kommer tillbaka till loopvillkoret. 1 är inte större än 1, så vi avslutar.

Svar: Vi skriver ut

9 7 5 3

Alla som har lärt sig programmera har gjort sådana tankeexperiment, antingen strukturerat genom lektioner eller automatiskt när liknande situationer dyker upp. När man övat på ett par sådana så märker man att man kan ta "genvägar" i tanken. En van programmerare ser direkt att ovanstående skriver ut alla udda tal från 9 till (men inte inklusive) 1. På samma sätt så ser man direkt att exempelvis:

i = 9 while i != 0: print(i) i -= 2

kommer gå åt skogen, för loopvillkoret ("`i` inte lika med 0) kommer alltid vara sant.

Så, gällande dina originalexempel: titta på dem och försök följa med på ett papper och se vad som händer. Du behöver inte skriva upp alla 100 steg som behövs; vanligen kan man hoppa över alla i "mitten" där man vet att saker bara kommer upprepa sig med små skillnader ("iterera"), så det räcker att studera de första och sista iterationerna och lista ut vad som hände däremellan. Exempel:

i = 100 while i >= 16: print(i) i -= 4

  1. Skriver ut "100".

  2. Minskar `i` till 96.

  3. Skriver ut "96".

  4. … (tankegång: vi kommer följa "fyrans tabell" utan några överraskningar ett tag, och vi hamnar förr eller senare på exempelvis `i`=20) …

  5. Skriver ut "20".

  6. Minskar `i` till 16.

  7. Loopvillkoret stämmer precis, skriver alltså ut även "16", men sedan är det stopp.

Svar: Vi skriver ut alla multiplar av 4 från 100 till (inklusive) 16.

Dold text
Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Va faaaaaan!!!

Fel igen :,-(

Vilket/vilka av följande kodsnuttar skriver ut alla 15 ord som finns
i listan ”ord”?

Ange de eller det alternativ som är korrekt.

m = 0 s = "" while m < 15: s += ord[m] m += 1 print(s)

m = 1 while m < 15: print(ord[m], end=" ") m += 1 m = 0 while m < 15: s = ord[m] print(s, end=" ") m += 1 m = 1 s = ord[0] while m < 15: s += ord[m] m += 1 print(s) m = 0 s = "" while m <= 15: s += ord[m] m += 1 print(s)

Poäng: 0 (1)

Vilket/vilka av följande kodsnuttar läser in 76 ord till listan

"namn"?

j = 1 namn[0] = input("Ge ord: ") while j < 76: namn[j] = input("Ge ord: ") j += 1 j = 0 while j <= 76: namn[j] = input("Ge ord: ") j += 1 j = 0 while j < 76: print("Ge ord: ") namn[j] = input() j += 1 j = 1 while j < 76: namn[j] = input("Ge ord: ") j += 1 j = 0 sum = "" while j < 76: namn[j] = input("Ge ord: ") sum += namn[j] j += 1

Poäng: 0 (1)

Permalänk
Medlem
Skrivet av phz:

Jag minns att jag svarat på en liknande fråga tidigare, så jag kan ta och saxa in det här:

Dold text

Haha, många som har svårt att hänga med här. Skönt att man inte ensam iaf....

Tack för hjälpen

Permalänk
Medlem

Haaaaaa!!!!

Jag klarade det! OCH jag tror jag fattar

Tack så jättemycket för er hjälp

Permalänk
Medlem

Bra att det löst sig. Jag sitter dock och blir lite frustrerad över exemplen.
Jag förstår tanken bakom att ni ska lära er några grundläggande begrepp kring tilldelningar, loopar och utskrifter. Men det känns som en uppgift som är dragen direkt från en C-kurs.
Metoderna som visats är sällan förekommande i Python-kod. Mer normalt förfarande torde vara att iterera över namn

for n in namn: print(n)

eller

s = "\n".join(namn) print(s)

alternativt om man inte behöver jobba vidare med s efteråt.

print("\n".join(namn))

Visa signatur

weeeee

Permalänk
Medlem

Jag håller med om att det blev lite knöligt. Förklaringarna som ingick i "litteraturen" på sidan hjälpte verkligen inte jättemycket heller.

Permalänk
Hedersmedlem
Skrivet av mounte:

Bra att det löst sig. Jag sitter dock och blir lite frustrerad över exemplen.
Jag förstår tanken bakom att ni ska lära er några grundläggande begrepp kring tilldelningar, loopar och utskrifter. Men det känns som en uppgift som är dragen direkt från en C-kurs.

Jo, det kan sägas att om man har liknande konstruktioner i sin skarpa Python-kod: `while`-loop med avslutande `+= 1` när man önskar ett bestämt antal iterationer, i stället för `for i in range()` (eller (om man vill skapa en lista/iterabel) att faktorera ut loopkroppen i en separat funktion som kallas från en list comprehension eller ett generatoruttryck), så har man sannolikt lärt sig "fel" någonstans. Det är tyvärr inte helt ovanligt att se liknande bökig kod i nybörjarhandledningar i Python runt om på nätet.

Tanken här är nog som du säger att det mer är en kurs i att lära sig allmän programmeringsteknik, där man har valt Python som verktyg, snarare än en ren Pythonkurs. Att lära sig hur C-lika `while`- och `for`-loopar beter sig är bra allmän programmeringskunskap, men man kan hoppas att kursen även innehåller en förklarande fortsättning gällande hur loopar i just Python generellt kan och bör hanteras.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av phz:

Jo, det kan sägas att om man har liknande konstruktioner i sin skarpa Python-kod: `while`-loop med avslutande `+= 1` när man önskar ett bestämt antal iterationer, i stället för `for i in range()` (eller (om man vill skapa en lista/iterabel) att faktorera ut loopkroppen i en separat funktion som kallas från en list comprehension eller ett generatoruttryck), så har man sannolikt lärt sig "fel" någonstans. Det är tyvärr inte helt ovanligt att se liknande bökig kod i nybörjarhandledningar i Python runt om på nätet.

Tanken här är nog som du säger att det mer är en kurs i att lära sig allmän programmeringsteknik, där man har valt Python som verktyg, snarare än en ren Pythonkurs. Att lära sig hur C-lika `while`- och `for`-loopar beter sig är bra allmän programmeringskunskap, men man kan hoppas att kursen även innehåller en förklarande fortsättning gällande hur loopar i just Python generellt kan och bör hanteras.

Jag reagerade på det med, men jag tänkte att enda förklaringen är att de ville visa hur det ofta går till i många språk. Alla som kört python i sisådär en månad borde ju stött på pythons suveräna listhantering.

Visa signatur

/M

Permalänk
Medlem

Jo, jag hade ju provat python lite innan, och det här var nya saker för mig...