Vinnaren i pepparkakshustävlingen!
2021-08-14, 17:51
  #1777
Medlem
Citat:
Ursprungligen postat av toblemona
Uppgiften kommer från boken Python från början av Skansholm 😅

Ookej...

En väldigt viktig fråga:
Använder du boken som kurslitteratur på gymnasie eller högskolenivå?
Om du gör detta bör du nog ta en liten diskussion med din lärare om huruvida ni ska använda boken då den inte är Pythonkompatibel, utan den använder generella programmeringsmetoder för andra språk i Python.

Använder du boken för ditt egen intresse? då ska du nog ta dig en funderare på dessa kodsnuttar:

Vilken av dessa två kodsnuttar är med läsbar, effektivast och körbar?

Orginalkoden från din post:

Kod:
namn = [] # skapar tom lista
pris = [] # skapar tom lista
while True:
    
s.strip() # tar bort ev blanka tecken först och sist
    
s.rfind('  '# söker index före priset
    
namn.append(s[0:i]) # bildar slice med namnet
    
pris.append(float(s[i+1:])) # bildar slice med priset
min(pris#söker lägsta pris
pris.index(m# index för lägsta pris
print(namn[k] + ' är billigast')
print(
f'Kostnad: {m:1.2f} kr/månad'


Eller min ändrade kodsnutt. Den är nästan samma som originalet, men med mer Pythonisk kod:

Kod:
namn = [] # skapar tom lista
pris = [] # skapar tom lista
while True:
    
sinput()
    
s.split()
    
nameprice s
    namn
.append(name)
    
pris.append(price)
min(pris#söker lägsta pris
pris.index(m# index för lägsta pris
print(namn[k] + ' är billigast')
print(
f'Kostnad: {m:1.2f} kr/månad'




Info om författaren:

Citat:
Jan Skansholm är tekn. dr. och har under många år varit verksam som universitetslektor vid Chalmers tekniska högskola och vid Göteborgs Universitet.Han har mångårig erfarenhet av programmeringsundervisning, både från den akademiska världen och från företagskurser, där han verkat som föreläsare och instruktör.


Jan Skansholm debuterade som läroboksförfattare 1986. Denna webbplats innehåller diverse kompletterande information, t.ex. lösningar till övningsuppgifter, för de böcker han skrivit eller varit medförfattare till.

Som han skriver koden är han en programmerare för C, C++, C# mfl. Han kommer från den gamla tiden där man måste indexera. Visst, jag kan tycka att detta är bra att kunna och att lära sig för att generellt kunna programmera, men det är INGET som en nybörjare i PYTHON skall hålla på med när man inte har koll på sitt språk.

Att använda listindexering och slicers kan vara ett bra sätt i mer avancerad kod, men som jag skrev förut finns det ju verktyg i Python som är bättre att använda. Som du ser på mina inlägg löser jag uppgiften utan listindexering, med bättre och mer läsbar kod.

I mitt första inlägg använder jag inte ens listor, utan en dict(). Varför skapa två listor när man kan ha en samling?

Varför hålla på så här:

Kod:
namn.append(s[0:i]) # bildar slice med namnet
    
pris.append(float(s[i+1:])) # bildar slice med priset
min(pris#söker lägsta pris
pris.index(m# index för lägsta pris 

När man kan göra det med en dict:

Kod:
produkter dict()
nameprice input().split()
produkter[name]= price
min_produkt 
min(produkterkey produkter.get)
print(
f'namn: {min_produkt} pris:  {produkter.get(min_produkt)} kr/månad'

En enklare, mer läsbar kod, även om den inte ens är färdig, då den saknar en loop.
Citera
2021-08-14, 17:57
  #1778
Medlem
toblemonas avatar
Citat:
Ursprungligen postat av Methos
Ookej...

En väldigt viktig fråga:
Använder du boken som kurslitteratur på gymnasie eller högskolenivå?
Om du gör detta bör du nog ta en liten diskussion med din lärare om huruvida ni ska använda boken då den inte är Pythonkompatibel, utan den använder generella programmeringsmetoder för andra språk i Python.

Använder du boken för ditt egen intresse? då ska du nog ta dig en funderare på dessa kodsnuttar:

Vilken av dessa två kodsnuttar är med läsbar, effektivast och körbar?

Orginalkoden från din post:

Kod:
namn = [] # skapar tom lista
pris = [] # skapar tom lista
while True:
    
s.strip() # tar bort ev blanka tecken först och sist
    
s.rfind('  '# söker index före priset
    
namn.append(s[0:i]) # bildar slice med namnet
    
pris.append(float(s[i+1:])) # bildar slice med priset
min(pris#söker lägsta pris
pris.index(m# index för lägsta pris
print(namn[k] + ' är billigast')
print(
f'Kostnad: {m:1.2f} kr/månad'


Eller min ändrade kodsnutt. Den är nästan samma som originalet, men med mer Pythonisk kod:

Kod:
namn = [] # skapar tom lista
pris = [] # skapar tom lista
while True:
    
sinput()
    
s.split()
    
nameprice s
    namn
.append(name)
    
pris.append(price)
min(pris#söker lägsta pris
pris.index(m# index för lägsta pris
print(namn[k] + ' är billigast')
print(
f'Kostnad: {m:1.2f} kr/månad'




Info om författaren:



Som han skriver koden är han en programmerare för C, C++, C# mfl. Han kommer från den gamla tiden där man måste indexera. Visst, jag kan tycka att detta är bra att kunna och att lära sig för att generellt kunna programmera, men det är INGET som en nybörjare i PYTHON skall hålla på med när man inte har koll på sitt språk.

Att använda listindexering och slicers kan vara ett bra sätt i mer avancerad kod, men som jag skrev förut finns det ju verktyg i Python som är bättre att använda. Som du ser på mina inlägg löser jag uppgiften utan listindexering, med bättre och mer läsbar kod.

I mitt första inlägg använder jag inte ens listor, utan en dict(). Varför skapa två listor när man kan ha en samling?

Varför hålla på så här:

Kod:
namn.append(s[0:i]) # bildar slice med namnet
    
pris.append(float(s[i+1:])) # bildar slice med priset
min(pris#söker lägsta pris
pris.index(m# index för lägsta pris 

När man kan göra det med en dict:

Kod:
produkter dict()
nameprice input().split()
produkter[name]= price
min_produkt 
min(produkterkey produkter.get)
print(
f'namn: {min_produkt} pris:  {produkter.get(min_produkt)} kr/månad'

En enklare, mer läsbar kod, även om den inte ens är färdig, då den saknar en loop.
Boken är kurslitteratur på högskoleingenjörsprogrammet
Citera
2021-08-14, 18:22
  #1779
Medlem
Citat:
Ursprungligen postat av toblemona
Boken är kurslitteratur på högskoleingenjörsprogrammet

Okej, då skulle jag ta en diskussion med lektorn, om nu inte lektorn är stollen som skriver boken.
Vad är syftet med kursen? Är det att lära dig Python, eller att lära dig generell programmering via Python?
Ska du lära dig Python ordentligt måste du frångå vissa generella metoder som fungerar för C mfl. språk.
För Python är ett högnivåspråk och har väldigt många inbyggda verktyg som gör saker och ting mer läsbart och mer effektivt.



Hmm Uppgift 9_1


Kod:
import random

def spela
():
    
ord = ['Sten''Sax''Påse']
    return 
ord[random.randint(02)]

def jämför(ord1ord2):
    if 
ord1 == ord2:
        return 
0      # Betyder oavgjort
    
elif ord1 == 'Sten' and ord2 == 'Sax'  or \
         
ord1 == 'Sax'  and ord2 == 'Påse' or \
         
ord1 == 'Påse' and ord2 == 'Sten':
        return 
1
    
else:
        return 


Kan du läsa den?
Vem i sitt mildaste friska sinne använder random.randint() som ett INDEX?

Citat:
Python random.choice() function

The choice() function of a random module returns a random element from the non-empty sequence. For example, we can use it to select a random password from a list of words.


Jag får ont i huvudet av detta:

En fråga till dig, Läs vad random.choice() gör.

Vad är bäst:

Kod:
def spela():
    
ord = ['Sten''Sax''Påse']
    return 
ord[random.randint(02)] 

Eller:

Kod:
def spela():
      return 
random.choice([ 'Sten''Sax''Påse']) 

Hans enormt felbyggda elif tänker jag inte bemöda mig att kommentera.
Citera
2021-08-15, 14:39
  #1780
Medlem
toblemonas avatar
Citat:
Ursprungligen postat av Methos
Okej, då skulle jag ta en diskussion med lektorn, om nu inte lektorn är stollen som skriver boken.
Vad är syftet med kursen? Är det att lära dig Python, eller att lära dig generell programmering via Python?
Ska du lära dig Python ordentligt måste du frångå vissa generella metoder som fungerar för C mfl. språk.
För Python är ett högnivåspråk och har väldigt många inbyggda verktyg som gör saker och ting mer läsbart och mer effektivt.



Hmm Uppgift 9_1


Kod:
import random

def spela
():
    
ord = ['Sten''Sax''Påse']
    return 
ord[random.randint(02)]

def jämför(ord1ord2):
    if 
ord1 == ord2:
        return 
0      # Betyder oavgjort
    
elif ord1 == 'Sten' and ord2 == 'Sax'  or \
         
ord1 == 'Sax'  and ord2 == 'Påse' or \
         
ord1 == 'Påse' and ord2 == 'Sten':
        return 
1
    
else:
        return 


Kan du läsa den?
Vem i sitt mildaste friska sinne använder random.randint() som ett INDEX?




Jag får ont i huvudet av detta:

En fråga till dig, Läs vad random.choice() gör.

Vad är bäst:

Kod:
def spela():
    
ord = ['Sten''Sax''Påse']
    return 
ord[random.randint(02)] 

Eller:

Kod:
def spela():
      return 
random.choice([ 'Sten''Sax''Påse']) 

Hans enormt felbyggda elif tänker jag inte bemöda mig att kommentera.
Den mer komprimerade koden (return random.choice) är givetvis elegantare och mer pytonsk. Skansholm begriper jag ibland inte hur han resonerar, det är inte alltid logiskt och genomtänkt. Gissar att det finns bättre kurslitteratur.
Citera
2021-08-15, 14:50
  #1781
Medlem
Citat:
Ursprungligen postat av toblemona
Den mer komprimerade koden (return random.choice) är givetvis elegantare och mer pytonsk. Skansholm begriper jag ibland inte hur han resonerar, det är inte alltid logiskt och genomtänkt. Gissar att det finns bättre kurslitteratur.

Jag misstänker att att han har som syfte att försöka generalisera sin programmering så du lär dig programmera alla språk. Men det blir liksom helt fel. Det blir som att någon skall lära ut arabiska för att lära sig kommunicera med alla länder i arabvärlden. Det går liksom inte.

Som sagt, fråga din lektor vad syftet är med kursen. Lära sig Python gör du däremot inte med den koden.

Felet grundar sig på att Python är ett språk där allting är objekt. Därför går det att behandla allting som objekt, därav kan du även peka på objekt i en sekvens eller samling av något. Du kan således välja ett konkret element i en lista utan att behöva veta index på elementet. I andra språk måste man gå via index för att få ut något ur t.ex. en lista.

Vi använder listindex för vissa saker också, men det är för att mer komma åt elementen i en for-loop utan att dra till med en till for-loop.
__________________
Senast redigerad av Methos 2021-08-15 kl. 14:52.
Citera
2021-08-15, 15:12
  #1782
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av Methos
...

Info om författaren:

...
Jag tror att Skansholm är pensionär sedan runt fem år, men han kanske jobbar vidare med sina böcker. Hans mest kända värk [sic!] tror jag är Java direkt. Jag gissar (är trött och har ont i huvudet) att syftet med den konstiga koden är att visa något i stil med "så här löser man problemet med klassisk imperativ programmering, koden råkar vara skriven i Python" och att läsaren sedan ska omvandla det hela till vettig pythonkod.
Citera
2021-08-15, 15:23
  #1783
Medlem
Citat:
Ursprungligen postat av Neksnor
Jag tror att Skansholm är pensionär sedan runt fem år, men han kanske jobbar vidare med sina böcker. Hans mest kända värk [sic!] tror jag är Java direkt. Jag gissar (är trött och har ont i huvudet) att syftet med den konstiga koden är att visa något i stil med "så här löser man problemet med klassisk imperativ programmering, koden råkar vara skriven i Python" och att läsaren sedan ska omvandla det hela till vettig pythonkod.

Ja, det är bisarrt. Tittar på en lektionsuppgift som handlar om klasser, där han har skapat exempel på en Kort-klass och en Kortlek. Sedan sätter han inte ihop dessa två, utan han försöker få med Kort i denna Kortlek utan att Kortlek ärver från Kort. Ser väldigt fånigt ut.

Jag vet att Raymond Hettinger (medlem i Pythons kärngrupp)har väldigt roligt åt dessa gamla Microsoftderivat som hela tiden skall programmera Python som om det vore C#.

Denna kan även nybörjare se:
Transforming Code into Beautiful, Idiomatic Python
https://youtu.be/OSGv2VnC0go?list=PL...i_o_onnmDKj3MA
Citera
2021-08-15, 15:50
  #1784
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av Methos
Ja, det är bisarrt. Tittar på en lektionsuppgift som handlar om klasser, där han har skapat exempel på en Kort-klass och en Kortlek. Sedan sätter han inte ihop dessa två, utan han försöker få med Kort i denna Kortlek utan att Kortlek ärver från Kort. Ser väldigt fånigt ut.

Jag vet att Raymond Hettinger (medlem i Pythons kärngrupp)har väldigt roligt åt dessa gamla Microsoftderivat som hela tiden skall programmera Python som om det vore C#.

Denna kan även nybörjare se:
Transforming Code into Beautiful, Idiomatic Python
https://youtu.be/OSGv2VnC0go?list=PL...i_o_onnmDKj3MA
Det kan dock finnas en poäng i att koda konstigt, men då bör man förklara varför man gör det.
Som Otto Salomom (killen som "uppfann" träslöjd) verkar ha sagt: "Det är barnet, icke träbiten, som i slöjden ska formas".
https://sverigesradio.se/avsnitt/45080

Tyvärr ser man inte sällan här, i nybörjartrådarna, någon som kommer med en smart enradslösning på ett problem som kanske handlar om att lära sig använda if/while-satser.

Citera
2021-08-15, 15:59
  #1785
Medlem
Citat:
Ursprungligen postat av Neksnor
Det kan dock finnas en poäng i att koda konstigt, men då bör man förklara varför man gör det.
Som Otto Salomom (killen som "uppfann" träslöjd) verkar ha sagt: "Det är barnet, icke träbiten, som i slöjden ska formas".
https://sverigesradio.se/avsnitt/45080

Tyvärr ser man inte sällan här, i nybörjartrådarna, någon som kommer med en smart enradslösning på ett problem som kanske handlar om att lära sig använda if/while-satser.


Jovisst, men då skall man också se till att man lär nybörjaren (barn som vuxen) korrekt syntax för det ändamål man har. Det är inte korrekt syntax för Python att börja köra iterering via index när Python har verktyg för detta med iter() eller __iter__().

Man KAN däremot först lägga upp en uppgift på traditionellt vis, med indexering. Sedan visar man att det finns verktyg för detta i Python. Då har man lärt eleven att båda metoderna fungerar, men den senare är det som gäller för Python.

Sedan kan man köra "onliners" för att visa att det är så som Python fungerar, men då skall man också förklara vad man gör. Jag gjorde ju hans problem genom OOC. För någon här inne ville ju inte använda inbyggda funktioner, så jag gjorde en manuell klass istället. Men den är också förklarad i tre inlägg.

Man bygger t.ex. inte en if-sats som denna:

Kod:
elif ord1 == 'Sten' and ord2 == 'Sax'  or \
         
ord1 == 'Sax'  and ord2 == 'Påse' or \
         
ord1 == 'Påse' and ord2 == 'Sten':
        return 


I sådana fall kör man varje jämförelse som en elif för mer läsbar kod.
Citera
2021-08-19, 19:53
  #1786
Medlem
toblemonas avatar
Citat:
Ursprungligen postat av Methos
Jag misstänker att att han har som syfte att försöka generalisera sin programmering så du lär dig programmera alla språk. Men det blir liksom helt fel. Det blir som att någon skall lära ut arabiska för att lära sig kommunicera med alla länder i arabvärlden. Det går liksom inte.

Som sagt, fråga din lektor vad syftet är med kursen. Lära sig Python gör du däremot inte med den koden.

Felet grundar sig på att Python är ett språk där allting är objekt. Därför går det att behandla allting som objekt, därav kan du även peka på objekt i en sekvens eller samling av något. Du kan således välja ett konkret element i en lista utan att behöva veta index på elementet. I andra språk måste man gå via index för att få ut något ur t.ex. en lista.

Vi använder listindex för vissa saker också, men det är för att mer komma åt elementen i en for-loop utan att dra till med en till for-loop.
Fattar din poäng. Ska prata med gubben vid tillfälle.
Citera
2021-08-24, 14:53
  #1787
Medlem
toblemonas avatar
En ny uppgift från Skansholm som jag beöver lite hjälp med:
" Skriv ett program som läser in ett antal temperaturer som uppmätts vid samma tidpunkt på olika platser.Mätstationerna är numrerade från 1 och uppåt, och programmet läser in temperaturerna i nummerordning (mätstation 1 först osv.) Programmet ska skriva ut medelvärdet av alla temperaturerna. Det ska sedan skriva ut alla temperaturer som är högre än medelvärdet. För varje sådan temperatur sk programmet också skriva ut mätstationens nummer."

Jag har skrivit en del, men inte gjort alla delar. Har nu inte gjort de inlästa numren som användarinput, och anledningen att jag skriver ut dem är bara att jag ville se att det fungerade.
Ett problem är att jag får ZeroDivisionError när medel ska skrivas ut. Har provat ändra mätvärdena, men det hjälper inte. Dessutom vet jag inte hur man skriver ut mätstationernas nummer för de olika temperaturerna som är högre än medel.

Kod:
s = [[0.2, 1.1, 2.4],
    [1.7, 0.8, 3.5],
    [2.2, 5.3, 4.7]]

for i in s:
    for j in i:
        print(j, end = ' ')
    print()

flt_S = []
for i in flt_S:
    flt_S.append(float(i))

for i in flt_S:
    for j in i:
        print(j, end = ' ')
    print()

sum = 0
for i in flt_S:      
    sum = sum + float(i)
medel = sum / len(flt_S)
print(f'{medel:.2f}')

if i > medel:
    print(i)
__________________
Senast redigerad av toblemona 2021-08-24 kl. 15:24.
Citera
2021-08-24, 16:39
  #1788
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av toblemona
En ny uppgift från Skansholm som jag beöver lite hjälp med:
" Skriv ett program som läser in ett antal temperaturer som uppmätts vid samma tidpunkt på olika platser.Mätstationerna är numrerade från 1 och uppåt, och programmet läser in temperaturerna i nummerordning (mätstation 1 först osv.) Programmet ska skriva ut medelvärdet av alla temperaturerna. Det ska sedan skriva ut alla temperaturer som är högre än medelvärdet. För varje sådan temperatur sk programmet också skriva ut mätstationens nummer."

Jag har skrivit en del, men inte gjort alla delar. Har nu inte gjort de inlästa numren som användarinput, och anledningen att jag skriver ut dem är bara att jag ville se att det fungerade.
Ett problem är att jag får ZeroDivisionError när medel ska skrivas ut. Har provat ändra mätvärdena, men det hjälper inte. Dessutom vet jag inte hur man skriver ut mätstationernas nummer för de olika temperaturerna som är högre än medel.

Kod:
s = [[0.2, 1.1, 2.4],
    [1.7, 0.8, 3.5],
    [2.2, 5.3, 4.7]]

for i in s:
    for j in i:
        print(j, end = ' ')
    print()

flt_S = []
for i in flt_S:
    flt_S.append(float(i))

for i in flt_S:
    for j in i:
        print(j, end = ' ')
    print()

sum = 0
for i in flt_S:      
    sum = sum + float(i)
medel = sum / len(flt_S)
print(f'{medel:.2f}')

if i > medel:
    print(i)

1. Varför kör input-data i en "nested" lista typ [[1,2,3],[4,5,6]...]
Ska du inte bara ha en lista med olika temperaturer från väderstationer:
typ [1.2,2.1,3.2,4.1,5.3,6.1,7.3...]

2. Du kör en For-loop på en tom lista, vilket aldrig kan vara rätt:
Kod:
flt_S = []
for i in flt_S:

3. För att få nummer på stationerna behöver du använda index från listan med temperaturer och lägga till 1 (eftersom index börjar på noll). Du kan komma åt index i en for-loop av listan genom enumerate()

Se ett exempel för dig att lära dig av, dock ej skriva av
__________________
Senast redigerad av Enterprise 2021-08-24 kl. 16:47.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback