Permalänk
Medlem

Svarsfråga/lista Python

Hej

Är så korkad när det gäller detta så ni vet innan
Ska göra en klädshop, nu är den väldigt enkel, men har fastnat. Jag har en fråga "vill du köpa mer" om svaret är ja så ska listan på kläder komma upp, det gör den inte. Och om svaret är nej så ska man komma tillbaka till huvudmenyn.
Jag behöver även räkna ut vad priset blir om jag köper fler.

Jag har provat allt - förutom det rätta sättet! Även googlat som en tok

Är väldigt tacksam till den så hjälper mig, om man inte vill ge svaret så gärna en hint eller vad som helst. Blir knäpp efter 4 dagar och jag förstår att det är väldigt enkelt om man kan det

Koden:

import replit
import random
from getkey import getkey, keys

def FirstChoise():
replit.clear()
print()
print("Köp kläder")
print()
clothes = ["Byxor", "Tröja", "Jacka", "Skor", "Strumpor", "Keps"] #
clothes.sort()
for i in clothes:
print(i)
print()
clothes = input("Vad vill du köpa? ")
print("Du väljer... " + str (clothes) + " ")
print()

questions = input("Vill du köpa något mer? (ja/nej): ")
while(True):
if questions[0]=="ja":
clothes = ["Byxor", "Tröja", "Jacka", "Strumpor", "Keps"]
clothes.sort()
for i in clothes:
print(i)

elif questions[0]=="nej":
print("Din kostnad: ")
print()
print("Tryck Enter för huvudmenyn!")

def SecondChoise():
replit.clear()
print()
print("Väska")
print("Tryck Enter för huvudmenyn!")

def ThirdChoise():
replit.clear()
print("Accessoarer")
print("Tryck Enter för huvudmenyn!")

def ForthChoice():
replit.clear()
print("Välkommen åter!\nHejdå!")
print()

menuOptions = ["KLÄDER", "VÄSKA", "ACCESSOARER", "AVSLUTA"]

menuSelected = 0

while(True):
replit.clear()
print("\t\tVälkommen till DinaKläder!")
print("******************************************")
print()

for ix, option in enumerate(menuOptions):
if ix == menuSelected:
option=option + " " "<---"
print(option)

keyPressed = getkey()

if keyPressed == keys.DOWN and menuSelected + 1 != len(menuOptions):
menuSelected += 1

elif keyPressed == keys.UP and menuSelected >= 1:
menuSelected -=1

elif keyPressed == keys.ENTER:
if menuSelected == 0:
FirstChoise()

elif menuSelected == 1:
SecondChoise()

elif menuSelected == 2:
ThirdChoise()

elif menuSelected == 3:
ForthChoice()
break

Permalänk
Medlem

Du behöver pris som en variabel du kan addera kostnaden till, du bör även kolla upp hur dict fungerar om uppgiften inte specifikt kräver listor.

Krävs listor så kolla hur man gör med listor i listor.

Permalänk
Medlem

Provade med dict, men får ju inte fram listan om jag svara ja på frågan.... While och if bör väl vara kvar då jag ska svara antingen ja eller nej. Så länge jag svara ja så ska ju det köra på....eller fattar jag fel...

Suck....detta va svårt

Permalänk
Medlem

@ala-car: Ett problem du har är att din struktur i FirstChoise (det stavas choice förresten ) är:

Skriv ut val Hämta input från användaren Fråga om användaren vill köpa mer Loopa: Om ja: Skriv ut val Om nej: Avsluta

Du har alltså inget som avbryter den inre loopen, utan den kommer bara snurra i all oändlighet och låsa programmet. Du gör här det vanliga nybörjarfelet att tänka på problemet som två delar: först fråga användaren efter första valet, sen fråga efter resten av valen i en loop. Försök att unvika att hantera det första valet som ett specialfall, d.v.s. gör något sånt här istället:

Loopa: Skriv ut val Hämta input från användaren Fråga om användaren vill köpa mer Om nej: Avbryt loopen Annars: Fortsätt att loopa

Sen är det bra om du använder
[code]
Kod här
[/code]
när du klistrar in kod för att bevara formateringen, detta är ju extra viktigt för just Python.

Permalänk
Medlem
Skrivet av perost:

@ala-car: Ett problem du har är att din struktur i FirstChoise (det stavas choice förresten ) är:

Skriv ut val Hämta input från användaren Fråga om användaren vill köpa mer Loopa: Om ja: Skriv ut val Om nej: Avsluta

Du har alltså inget som avbryter den inre loopen, utan den kommer bara snurra i all oändlighet och låsa programmet. Du gör här det vanliga nybörjarfelet att tänka på problemet som två delar: först fråga användaren efter första valet, sen fråga efter resten av valen i en loop. Försök att unvika att hantera det första valet som ett specialfall, d.v.s. gör något sånt här istället:

Loopa: Skriv ut val Hämta input från användaren Fråga om användaren vill köpa mer Om nej: Avbryt loopen Annars: Fortsätt att loopa

Sen är det bra om du använder
[code]
Kod här
[/code]
när du klistrar in kod för att bevara formateringen, detta är ju extra viktigt för just Python.

De rackarns stavfelen finns överallt tack snälla för svaren... men jag får det ändå inte att fungera. Klistrar endast in första valet nu
När jag klickar på att jag vill köpa mer så kommer jag till huvudmenyn, jag har väl ändå skrivit att kläderna ska visa igen eller?? Även när jag skriver nej så kommer jag till huvdmenyn.
Vad är det jag missar? Ska nog lägga ner klädaffären...haha (har flyttat det mesta fram och tillbaka och bytt plats på det mesta)
Känner mig rätt korkad....

def FirstChoice():
while(True):
replit.clear()
print()
print("Köp kläder")
print()
clothes = ["Byxor", "Tröja", "Jacka", "Skor", "Strumpor", "Keps"] #
clothes.sort()
for i in clothes:
print(i)
print()
clothes = input("Vad vill du köpa? ")
print("Du väljer... " + str (clothes) + " ")
print()

questions = input("Vill du köpa något mer? (ja/nej): ")

if questions =="ja":
clothes = ["Byxor", "Tröja", "Jacka", "Strumpor", "Keps"]
clothes.sort()
for i in clothes:
print(i)

elif questions =="nej":
print("Din kostnad: ")
print()
print("Tryck Enter för huvudmenyn!")
break

Permalänk
Medlem
Skrivet av ala-car:

De rackarns stavfelen finns överallt tack snälla för svaren... men jag får det ändå inte att fungera. Klistrar endast in första valet nu
När jag klickar på att jag vill köpa mer så kommer jag till huvudmenyn, jag har väl ändå skrivit att kläderna ska visa igen eller?? Även när jag skriver nej så kommer jag till huvdmenyn.
Vad är det jag missar? Ska nog lägga ner klädaffären...haha (har flyttat det mesta fram och tillbaka och bytt plats på det mesta)
Känner mig rätt korkad....

def FirstChoice():
while(True):
replit.clear()
print()
print("Köp kläder")
print()
clothes = ["Byxor", "Tröja", "Jacka", "Skor", "Strumpor", "Keps"] #
clothes.sort()
for i in clothes:
print(i)
print()
clothes = input("Vad vill du köpa? ")
print("Du väljer... " + str (clothes) + " ")
print()

questions = input("Vill du köpa något mer? (ja/nej): ")

if questions =="ja":
clothes = ["Byxor", "Tröja", "Jacka", "Strumpor", "Keps"]
clothes.sort()
for i in clothes:
print(i)

elif questions =="nej":
print("Din kostnad: ")
print()
print("Tryck Enter för huvudmenyn!")
break

Eftersom vi inte ser hur din kod är indenterad är det svårt att säga exakt.
Men du skriver ut alla klädesplagg och sedan kommer koden att gå vidare till break, vilket avslutar loopen och skickar tillbaka dig till huvudmenyn.

Permalänk
Medlem

@ala-car: Du har som sagt en break i slutet av din loop, vilket gör loopen överflödig eftersom den alltid kommer avsluta efter första iterationen. Men du har också en massa onödig kod, som t.ex. att du skriver ut kläderna om man svarar "ja". Detta görs ju redan i början av loopen, så om användaren svarar ja så behöver du inte göra någonting.

Permalänk
Medlem

Nu tror jag att man ser min indentering missade [code]
Perost, jag måste väl tala om för programmet vad som ska göra efter ett "ja". Hur vet programmet att just "ja" ska få fram klädlistan igen. Jag vill vara kvar i den menyn . byxa, skor osv.

Jag tänker ju så här:
En lista på produkter
jag väljer en produkt, vill jag köpa fler
ja - Här måste det ju finnas något så programmet vet vad den ska göra. Hur kopplas "ja" till prokduktlistan som finns i början av loopen
listan på prokukter komma tillbaka
väljer en till sak, vill du köpa fler
nej - Här efter måste det vara en break så inte produktlistan körs hela tiden, eller?
huvudmeny

import replit import random from getkey import getkey, keys def FirstChoice(): while(True): replit.clear() print() print("Köp kläder") print() clothes = ["Byxor", "Tröja", "Jacka", "Skor", "Strumpor", "Keps"] # clothes.sort() for i in clothes: print(i) print() clothes = input("Vad vill du köpa? ") print("Du väljer... " + str (clothes) + " ") print() questions = input("Vill du köpa något mer? (ja/nej): ") if questions =="ja": clothes = ["Byxor", "Tröja", "Jacka", "Strumpor", "Keps"] clothes.sort() for i in clothes: print(i) elif questions =="nej": print("Din kostnad: ") print() print("Tryck Enter för huvudmenyn!") def SecondChoice(): replit.clear() print() print("Väska") print("Tryck Enter för huvudmenyn!") def ThirdChoice(): replit.clear() print("Accessoarer") print("Tryck Enter för huvudmenyn!") def ForthChoice(): replit.clear() print("Välkommen åter!\nHejdå!") print() menuOptions = ["KLÄDER", "VÄSKA", "ACCESSOARER", "AVSLUTA"] menuSelected = 0 while(True): replit.clear() print("\t\tVälkommen till DinaKläder!") print("******************************************") print() for ix, option in enumerate(menuOptions): if ix == menuSelected: option=option + " " "<---" print(option) keyPressed = getkey() if keyPressed == keys.DOWN and menuSelected + 1 != len(menuOptions): menuSelected += 1 elif keyPressed == keys.UP and menuSelected >= 1: menuSelected -=1 elif keyPressed == keys.ENTER: if menuSelected == 0: FirstChoice() elif menuSelected == 1: SecondChoice() elif menuSelected == 2: ThirdChoice() elif menuSelected == 3: ForthChoice() break

Permalänk
Medlem
Skrivet av ala-car:

Perost, jag måste väl tala om för programmet vad som ska göra efter ett "ja". Hur vet programmet att just "ja" ska få fram klädlistan igen. Jag vill vara kvar i den menyn . byxa, skor osv.

Det är ju därför du har loopen, om du inte gör någonting så kommer loopen köra ett till varv och skriva ut klädlistan igen. Det är bara om användaren svarar nej som du faktiskt måste göra någonting.

Permalänk
Medlem
Skrivet av perost:

Det är ju därför du har loopen, om du inte gör någonting så kommer loopen köra ett till varv och skriva ut klädlistan igen. Det är bara om användaren svarar nej som du faktiskt måste göra någonting.

... questions = input("Vill du köpa något mer? (ja/nej): ") if questions =="ja": print() else: break

Då räcker det med att jag har så här som ovan? Det funkar men tänkte om det var rätt och om det blir något problem när det byggs vidare.

Permalänk
Medlem
Skrivet av ala-car:

Då räcker det med att jag har så här som ovan? Det funkar men tänkte om det var rätt och om det blir något problem när det byggs vidare.

Det beror förstås på vad du ska bygga på senare, men jag har svårt att se varför du skulle behöva skilja på första och resten av valen. Enklare kod är för det mesta enklare att bygga vidare på än kod som är komplicerad bara för sakens skull, så det är nästan alltid en bra idé att försöka göra koden så enkel som möjligt (särskilt som nybörjare).

Din tidigare kod bryter t.ex. mot DRY-principen (Don't Repeat Yourself) genom att du har utskiften av klädlistan på två olika ställen. Det innebär att du måste ändra på två ställen om du vill ändra på klädlistan, och skulle du ändra på bara ett av ställena så har du skapat en bug (tillägg: jag såg nu att du redan har en bug, användaren kan bara välja "Skor" första gången med din tidigare lösning).

Permalänk
Medlem
Skrivet av perost:

Det beror förstås på vad du ska bygga på senare, men jag har svårt att se varför du skulle behöva skilja på första och resten av valen. Enklare kod är för det mesta enklare att bygga vidare på än kod som är komplicerad bara för sakens skull, så det är nästan alltid en bra idé att försöka göra koden så enkel som möjligt (särskilt som nybörjare).

Din tidigare kod bryter t.ex. mot DRY-principen (Don't Repeat Yourself) genom att du har utskiften av klädlistan på två olika ställen. Det innebär att du måste ändra på två ställen om du vill ändra på klädlistan, och skulle du ändra på bara ett av ställena så har du skapat en bug (tillägg: jag såg nu att du redan har en bug, användaren kan bara välja "Skor" första gången med din tidigare lösning).

Nu gjorde jag så att jag importerar klädlistan, har förstått att DRY är big no, no... Tanken är ju att det ska kunna bli en slutsumma på det man har handlat och även funktion för felhantering. Jag får jobba på

Tack för all hjälp!

Permalänk
Medlem
Skrivet av ala-car:

... questions = input("Vill du köpa något mer? (ja/nej): ") if questions =="ja": print() else: break

Då räcker det med att jag har så här som ovan? Det funkar men tänkte om det var rätt och om det blir något problem när det byggs vidare.

Ja, det är räcker, men man kan förbättra.

1. Styling.

Det är vicktigt. Här är några Artiklar.

https://www.python.org/dev/peps/pep-0008/
https://realpython.com/python-pep8/

Jag föreslår att du alltid använder pylint.

2. Det är bättre att använda huvudfunktionen. Då kan du importera modulen, till exempel för testning.

def main: while(True): replit.clear() print("\t\tVälkommen till DinaKläder!") print("******************************************") print() ... if __name__ == "__main__": main()

https://realpython.com/python-main-function/

3. Perost nämnde redan DRY

Till exempel:

clothes = ["Byxor", "Tröja", "Jacka", "Strumpor", "Keps"] clothes.sort() for i in clothes: print(i)

4. "Vill du köpa något mer? (ja/nej): "; Vad händer när jag svarar på något annat? Du behövar en "else"

n. Andra förslag är lite mer komplexa.

Permalänk
Medlem
Skrivet av Ilya:

Ja, det är räcker, men man kan förbättra.

1. Styling.

Det är vicktigt. Här är några Artiklar.

https://www.python.org/dev/peps/pep-0008/
https://realpython.com/python-pep8/

Jag föreslår att du alltid använder pylint.

2. Det är bättre att använda huvudfunktionen. Då kan du importera modulen, till exempel för testning.

def main: while(True): replit.clear() print("\t\tVälkommen till DinaKläder!") print("******************************************") print() ... if __name__ == "__main__": main()

https://realpython.com/python-main-function/

3. Perost nämnde redan DRY

Till exempel:

clothes = ["Byxor", "Tröja", "Jacka", "Strumpor", "Keps"] clothes.sort() for i in clothes: print(i)

4. "Vill du köpa något mer? (ja/nej): "; Vad händer när jag svarar på något annat? Du behövar en "else"

n. Andra förslag är lite mer komplexa.

Nu har jag lite att gå igenom, tack snälla. Återkommer säkert