Permalänk
Medlem

Hjälp nybörjare med Python

Hej på er!

Totalt ny på det här med programmering och Python. Tanken är att jag ska plugga Interaktionsdesign till hösten och vill testa på lite programmering innan. Just nu har jag fastnat. Skulle någon vänlig själ kunna förklara vilka av exemplaren nedan som är korrekta och varför? Jag numrerade dem för enkelhetens skull, så detta ingår självklart inte i koden. Vore väldigt tacksam för svar!!

Vilket/vilka av följande kodsnuttar läser in 35 ord till listan "namn"?

1.

m = 1 namn[0] = input("Ge ord: ") while m < 35: namn[m] = input("Ge ord: ") m += 1

2.

m = 1 while m < 35: namn[m] = input("Ge ord: ") m += 1

3.

m = 0 while m <= 35: namn[m] = input("Ge ord: ") m += 1

4.

m = 0 s = "" while m < 35: namn[m] = input("Ge ord: ") s += namn[m] m += 1

5.

m = 0 while m < 35: print("Ge ord: ") namn[m] = input() m += 1

Vilket/vilka av följande kodsnuttar läser in 28 ord till listan "ord"?

6.

n = 0 while n < 28: print("Ge ord: ") ord[n] = input() n += 1

7.

n = 0 s = "" while n < 28: ord[n] = input("Ge ord: ") s += ord[n] n += 1

8.

n = 1 while n < 28: ord[n] = input("Ge ord: ") n += 1

9.

n = 0 while n <= 28: ord[n] = input("Ge ord: ") n += 1

10.

n = 1 ord[0] = input("Ge ord: ") while n < 28: ord[n] = input("Ge ord: ") n += 1

Adderade [code]-taggar.
Permalänk
Medlem

Det där löser du själv med lite vägledning.

Tänk på att arrayer än nollindexerade samt hur villkoret i while-loopen fungerar. Att börja på index (n) = 1 är aldrig en bra idé. Att loopa med <= som villkor kan innebära saker som du antagligen inte vill.

Permalänk
Medlem

Peta in koden i shell och testa själv, kan nog vara mest givande så. Försök förstå hur varje kodbit fungerar.

Visa signatur

Speldator :[I] AMD 5600X - 16GB fläskigt ram - AMD 580RX - AOC 32" Wide
HTPC : i5 3450S - 8GB G.Skill - Streacom F8

Permalänk
Medlem

Känner att jag inte är någon naturbegåvning på detta, har inte kommit in i det än och det blir bara fel.... Har Schell men får ingen av dessa att fungera. Har Mac och problem med hakparanteser. Kan skriva { och } men det verkar inte fungera och hittar inget annat sätt när jag testar och söker på det. Får väl se om jag kan låna min sambos PC och testa...

<= är jag med på att man inte kan använda här, men n=1? En annan uppgift här nedan, men här går det ju att ha n=1 eller i detta fallet m=1. Borde man inte kunna skriva om det som jag postade innan på samma sätt?

Skriver ut alla 95 ord som finns i listan ”ord”:

m = 1 sum = ord[0] while m < 95: sum += ord[m] m += 1 print(sum)

Adderade [code]-taggar.
Permalänk
Medlem
Skrivet av Märta:

Känner att jag inte är någon naturbegåvning på detta, har inte kommit in i det än och det blir bara fel.... Har Schell men får ingen av dessa att fungera. Har Mac och problem med hakparanteser. Kan skriva { och } men det verkar inte fungera och hittar inget annat sätt när jag testar och söker på det. Får väl se om jag kan låna min sambos PC och testa...

<= är jag med på att man inte kan använda här, men n=1? En annan uppgift här nedan, men här går det ju att ha n=1 eller i detta fallet m=1. Borde man inte kunna skriva om det som jag postade innan på samma sätt?

Skriver ut alla 95 ord som finns i listan ”ord”:

m = 1
sum = ord[0]

while m < 95:
sum += ord[m]
m += 1
print(sum)​

Det GÅR ju att börja på 1, men det känns ju klumpigt att ta ett speciafall för index 0 när man lika gärna hade kunnat sätta m = 0 och ta bort raden sum = ord[0].

Visa signatur

i5 750 @ 3.9 GHz | NH-D14 | P7P55D |GTX 960 | Vulcan 8GB | Seagate 600 480 GB | Newton 650w | P280 | Dell U2515H

Permalänk
Hedersmedlem
Skrivet av Märta:

Känner att jag inte är någon naturbegåvning på detta, har inte kommit in i det än och det blir bara fel.... Har Schell men får ingen av dessa att fungera. Har Mac och problem med hakparanteser. Kan skriva { och } men det verkar inte fungera och hittar inget annat sätt när jag testar och söker på det. Får väl se om jag kan låna min sambos PC och testa...

Öppna ett textdokument (eller en terminal) och testa alla Shift- och Alt-kombinationer systematiskt för att se om inte [ och ] dyker upp någonstans. { och } betyder fundamentalt olika saker i Python (och troligen alla programspråk), så det fungerar inte som substitut som du märkt.

Notera om du ska testa koden i en Python-tolk att dina exempel förutsätter att du använder Python 3, och inte Python 2. När tolken öppnas så säger den vilken version som körs. Exempel på min dator, med relevanta versionsnummer rödmarkerade:

$ python Python 2.7.6 (default, Feb 26 2014, 06:42:04) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> quit() $ python3 Python 3.3.5rc2 (default, Mar 5 2014, 10:38:26) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>>

Övrig text kommer skilja sig lite, men se till att du kör rätt huvudversion.

Skrivet av Märta:

<= är jag med på att man inte kan använda här, men n=1? En annan uppgift här nedan, men här går det ju att ha n=1 eller i detta fallet m=1. Borde man inte kunna skriva om det som jag postade innan på samma sätt?

Skriver ut alla 95 ord som finns i listan ”ord”:

m = 1 sum = ord[0] while m < 95: sum += ord[m] m += 1 print(sum)

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.

Visa signatur

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

Permalänk
Medlem

Tack för alla exempel och svar!

Jag övergav min Mac ett tag då jag inte hittade hur man gjorde riktiga hakparenteser och lösningarna när jag googlat på det inte heller fungerade (hade rätt version av Python innan också). På sambons PC kan jag i alla fall skriva in det korrekt och fattar nu lite mer. Dock har jag en kod som jag fått höra innan fungerade för att skriva ut alla i det här fallet ord i listan. Jag får dock bara att den skriver ut 2 och inte 3. Har jag skrivit fel eller har jag fått fel information?

>>> j = 1 >>> s = ord[0] >>> while j < 3: s += ord[j] j += 1 print(s) 0 0

Tänker att det borde stå så här istället: (men som ni ser får jag inte heller det att fungera, utan får Syntaxfel för print)

>>> j = 1 >>> s = ord[0] >>> while j < 3: s += ord[j] j += 1 print(s) SyntaxError: invalid syntax

Kanske en dum fråga, men som sagt är total nybörjare och har inte riktigt fattat tänket än

Lade till [code]-taggar så att koden är läsbar. Annars försvinner bl a indentering.
Permalänk
Medlem
Skrivet av Märta:

Jag övergav min Mac ett tag då jag inte hittade hur man gjorde riktiga hakparenteser

Höger alt + 8 producerar tecknet [ och Höger alt + 9 producerar tecknet ].

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem

Jepp, så enkelt var det att göra hakparanteser på Mac. Tack! Måste läst fel eller jag vet inte vad för jag tyckte att jag testade detta innan....

Behöver dock fortfarande hjälp med det andra jag skrev.

Permalänk
Hedersmedlem
Skrivet av Märta:

Dock har jag en kod som jag fått höra innan fungerade för att skriva ut alla i det här fallet ord i listan. Jag får dock bara att den skriver ut 2 och inte 3. Har jag skrivit fel eller har jag fått fel information?

>>> j = 1 >>> s = ord[0] >>> while j < 3: s += ord[j] j += 1 print(s) 0 0

Vad som händer beror på vad `ord` innehåller ovan. Exempel:

>>> ord = ['kanin', 'katt', 'ko', 'kamel'] >>> j = 1 >>> s = ord[0] >>> while j < 3: ... s += ord[j] ... j += 1 ... print(s) ... kaninkatt kaninkattko

Notera att du även får en halvfärdig delutskrift av strängen `s` under uppbyggnadsfasen, eftersom utskriften sker en gång per loop.

Ovanstående är resultat om `ord` är en lista av textsträngar. Om `ord` i stället är en textsträng så blir resultatet annorlunda:

>>> ord = 'kameleont' >>> j = 1 >>> s = ord[0] >>> while j < 3: ... s += ord[j] ... j += 1 ... print(s) ... ka kam

Detta är för att Python hela tiden försöker vara så snällt som möjligt, och när man försöker hantera `kameleont` som en lista så tänker Python att man vill se ordet som en "lista av bokstäver": `['k', 'a', 'm', 'e', 'l', 'e', 'o', 'n', 't']`. Jag nämner detta bara för att poängtera att dina kodexempel beror även på vad `ord` innehåller, vilket du får tänka på när du kör dina program.

Skrivet av Märta:

Tänker att det borde stå så här istället: (men som ni ser får jag inte heller det att fungera, utan får Syntaxfel för print)

>>> j = 1 >>> s = ord[0] >>> while j < 3: s += ord[j] j += 1 print(s) SyntaxError: invalid syntax

Syntaxfelet kommer av att du är i den interaktiva tolken, och den förväntar sig en fortsättning av loopen, vilket i Python indikeras med en viss "indentering" (indrag från vänsterkanten). När du helt plötsligt ger `print(s)` utan indentering så blir det syntaxfel. I den interaktiva tolken skulle ovanstående skrivits exempelvis:

>>> ord = ['kanin', 'katt', 'ko', 'kamel'] >>> j = 1 >>> s = ord[0] >>> while j < 3: ... s += ord[j] ... j += 1 ... >>> print(s) kaninkattko

Notera hur `>>>` förvandlas till `...` när tolken menar att du är inne i loopen. Genom att skriva en blankrad (alltså bara trycka Enter) efter `j += 1` så säger jag till tolken att jag är klar med loopen, och den körs. Jag får tillbaka `>>>` och kan skriva `print(s)` och få rätt resultat.

Visa signatur

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

Permalänk
Medlem
Skrivet av phz:

Notera hur `>>>` förvandlas till `...` när tolken menar att du är inne i loopen. Genom att skriva en blankrad (alltså bara trycka Enter) efter `j += 1` så säger jag till tolken att jag är klar med loopen, och den körs. Jag får tillbaka `>>>` och kan skriva `print(s)` och få rätt resultat.

Tack! Det var detta jag missat! Nu tror jag att jag fattat detta.

Permalänk
Medlem

Lånar tråden lite!

Har lyckats svara rätt på frågan Vilket/vilka av följande kodsnuttar skriver ut alla 87 ord som finns
i listan ”namn”?

Båda nedanstående är rätt, men jag förstår ändå inte riktig när man skulle vilja använda den senare varianten. Varför blanda in variabeln s1? Varför skriva 6 rader i stället för 4? Vill gärna förstå och inte bara komma vidare.. Någon som kan upplysa?

k = 0
while k < 87:
print(namn[k], end=" ")
k += 1

k = 0
s1 = ""
while k < 87:
s1 += namn[k]
k += 1
print(s1)

Permalänk
Medlem
Skrivet av flipo:

Lånar tråden lite!

Har lyckats svara rätt på frågan Vilket/vilka av följande kodsnuttar skriver ut alla 87 ord som finns
i listan ”namn”?

Båda nedanstående är rätt, men jag förstår ändå inte riktig när man skulle vilja använda den senare varianten. Varför blanda in variabeln s1? Varför skriva 6 rader i stället för 4? Vill gärna förstå och inte bara komma vidare.. Någon som kan upplysa?

k = 0
while k < 87:
print(namn[k], end=" ")
k += 1

k = 0
s1 = ""
while k < 87:
s1 += namn[k]
k += 1
print(s1)

Notera att de inte skriver ut exakt samma sak!

För övrigt är ett bättre och mycket mer pytonskt(stavning?) sätt att skriva:

for i in namn: print(i," ")

Jag tror inte det finns något positivt med det andra fallet förutom om man vill ha s1 till något annat.

Permalänk
Medlem
Skrivet av flipo:

Båda nedanstående är rätt, men jag förstår ändå inte riktig när man skulle vilja använda den senare varianten. Varför blanda in variabeln s1? Varför skriva 6 rader i stället för 4? Vill gärna förstå och inte bara komma vidare.. Någon som kan upplysa?

Den senare lägger ihop allt till en sträng som sen skrivs ut.
Just detta exempel är konstruerat för att lära sig programmera så det finns ingen direkt praktisk anledning.

Tänk dig istället att du inte skulle printa listan men istället skriva till en fil eller skicka innehållet över nätverket då finns det absolut anledning att göra allt vid ett och samma tillfälle istället för 87.

Visa signatur

I'm Winston Wolfe. I solve problems.