python aanduiding van floats of ints

Pagina: 1
Acties:

Onderwerpen

Vraag


  • ericvoordenhout
  • Registratie: September 2016
  • Laatst online: 02-03 20:24
Mijn vraag

hallo, ik hoop dat ik in het juiste topic zit, maar mijn vraag is:
ik ben in python bezig met een simpel vraagstuk:

eerste_getal = float(input('kies een getal'))
eerste_getal = False
bewerking = input ('kies +, -, *, / ')
bewerking = False
tweede_getal = float(input('kies een getal'))
tweede_getal = False

nu wil ik met een while loop dus zorgen dat als er bij het eerste getal iets anders als een float, of int ingevoerd wordt dat deze vraag nog een x gesteld wordt net zo lang tot het juiste ingevoerd is.


Relevante software en hardware die ik gebruik
pycharm

Wat ik al gevonden of geprobeerd heb

Ik probeer in te voeren while eerste_getal is == str:

En dan wil ik dat de vraag opnieuw gesteld wordt, zoniet mag je door naar de bewerking.. enz.. doe ik hier iets fout? maar ik krijg steeds de melding ValueError, en die snap ik dat kan je met try en except uit de weg gaan, maar mijn while loop lijkt niks te doen want het programma gaat hierna gewoon verder naar mijn bewerking, kan iemand mij hier mee helpen zodat ik ook snap hoe het werkt :)

alvast bedankt

[ Voor 8% gewijzigd door ericvoordenhout op 31-08-2023 17:18 ]

Beste antwoord (via ericvoordenhout op 01-09-2023 16:43)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ericvoordenhout schreef op vrijdag 1 september 2023 @ 16:39:
[...]


uhm, zal ik volgende keer doen, als ik weet hoe dat moet 8)7
Doe eens gek en klik eens op de link ("code tags") in mijn bericht ;)

Voor wat betreft je probleem: Waar sla je nu je invoer op (als in: welke variabele)? ;)

[ Voor 13% gewijzigd door RobIII op 01-09-2023 16:43 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Alle reacties


Acties:
  • +4 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je leest een waarde in een variabele en vervolgens zet je diezelfde variabele op False ;)

Vraag jezelf eens af:

X = 1
X = False

Wat zit er nu in X? Als je 1 zegt zit daar je probleem (want er zit False in X) ;)

Begin eens met debuggen: Debuggen: Hoe doe ik dat?

[ Voor 24% gewijzigd door RobIII op 31-08-2023 17:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • +1 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
try en except met die ValueError kan je inderdaad gebruiken om te kijken of je invoer juist is.

Over de loop: het makkelijkste is een boolean variabele (vlag) bijhouden met of je invoer geldig is. Je blijft dan loopen totdat de vlag gezet wordt. In code ziet dat er zo uit:

Python:
1
2
3
4
5
6
7
8
9
10
11
# je begint met False omdat je anders nooit in de while komt
# logisch klopt dat ook omdat je nog geen geldig getal hebt
geldig_eerste_getal = False

# zolang je geen geldig getal hebt voer je de loop uit (while = zolang, not = geen)
while not geldig_eerste_getal:
    # hier in de while vraag je om invoer
    # regel hieronder moet je alleen uitvoeren als de invoer geldig is
    geldig_eerste_getal = True

# hier beneden kom je dan alleen als de invoer geldig is


Let op: in dit voorbeeld zet ik de vlag altijd op True. Dit moet je natuurlijk alleen doen als de invoer geldig is. Dat stukje mag je zelf puzzelen.

Acties:
  • 0 Henk 'm!

  • ericvoordenhout
  • Registratie: September 2016
  • Laatst online: 02-03 20:24
bedankt voor de antwoorden, ik ben zeker een stukje verder gekomen, ik vindt het nog steeds lastig, want ik heb het gevoel dat je met de while loop een beetje achterstevoren moet denken :).


Ik moet ook zeggen ik ben helemaal nieuw met python, ik heb van bro code de 12 uur durende tutorial gezien en van buvesa ook de tutorial, misschien dat jullie dat wat zegt, nu probeer ik zelf die rekenmachine van buvesa te optimaliseren. voor mijn gevoel ben ik er maar het werkt niet....

mijn eerste cijfer lijkt nu goed te werken, zodra er een str, als antwoord wordt gegeven herhaalt de loop zich..
echter met mijn bewerking niet, daar zal ik nog wel iets fout doen...
maar mijn tweede cijfer werkt ook niet naar behoren en de basis is toch hetzelfde als mijn eerste cijfer (in mijn ogen) hebben jullie nog tips?

ik heb hier mijn code:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
eerste_geldig_getal = False
eerste_getal = float
geldig_bewerking = False
bewerking = str('+, -, *, /')
tweede_geldig_getal = False
tweede_getal = float

while not eerste_geldig_getal:
    try:
        print (float(input('kies een getal')))
        if eerste_getal == str:
            print (True)
        else:
            break
    except ValueError:
        print ('ik zei toch een getal ;) \n ')

while not geldig_bewerking:
    try:
        print (str(input('kies +, -, *, /')))
        if bewerking != str ('+, -, *, /'):
            print (True)
        else:
            break
    except ValueError:
        print (' je kan alleen kiezen uit +, -, *, /, \n')

while not tweede_geldig_getal:
    try:
        print (float(input('kies een getal')))
        if tweede_getal == str:
            print (True)

        else:
            if bewerking == '+':
                print(eerste_getal + tweede_getal)
            elif bewerking == '-':
                print(eerste_getal - tweede_getal)
            elif bewerking == '*':
                print(eerste_getal * tweede_getal)
            elif bewerking == '/':
                print(eerste_getal / tweede_getal)

    except ValueError:
        print ('ik zei toch een getal ;) \n')

[ Voor 4% gewijzigd door RobIII op 01-09-2023 16:37 . Reden: Code tags toegevoegd ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wanneer je code post, gebruik dan code tags aub ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ericvoordenhout
  • Registratie: September 2016
  • Laatst online: 02-03 20:24
RobIII schreef op vrijdag 1 september 2023 @ 16:38:
Wanneer je code post, gebruik dan code tags aub ;)
uhm, zal ik volgende keer doen, als ik weet hoe dat moet 8)7

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ericvoordenhout schreef op vrijdag 1 september 2023 @ 16:39:
[...]


uhm, zal ik volgende keer doen, als ik weet hoe dat moet 8)7
Doe eens gek en klik eens op de link ("code tags") in mijn bericht ;)

Voor wat betreft je probleem: Waar sla je nu je invoer op (als in: welke variabele)? ;)

[ Voor 13% gewijzigd door RobIII op 01-09-2023 16:43 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ericvoordenhout
  • Registratie: September 2016
  • Laatst online: 02-03 20:24
nooit geweten dat dat kan :), ik ga er volgende x mee aan de gang,

maar dat is denk ook mijn probleem, aangezien ik echt helemaal nieuw hierin ben :P
moet ik nog wat doen met return input?

of moet ik mijn variabelen aanpassen als in antwoord_eerste getal = eerste_getal misschien?
of zou ik heel mijn if elif statement in een variable moeten zetten als dat kan?

[ Voor 22% gewijzigd door ericvoordenhout op 01-09-2023 16:52 ]


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je gebruikt nu een break om de loop te stoppen. Dat kan inderdaad ook. Je hebt dan geen vlag meer nodig. Je kan dan ook een oneindige loop maken:
Python:
1
while True:


Je print nu de waardes van je invoer. Je moet de uitkomst van de input() in een variabele zetten zoals je in je topicstart had. Alleen dan kan je het verderop gebruiken.

Bij de getallen hoef je niet meer te kijken of het een string is. Als de omzetting naar float mislukt dan wordt die ValueError gegooid.

Bij de bewerking vergelijk je nu je variabele (die je vergeet te vullen; zie 2e punt) met de string '+, -, *, /'. Je moet kijken of de input 1 van die 4 is. Je kan hier het beste een array maken van de 4 mogelijkheden en dan met 'in' kijken of de input daar in zit. Zie: https://www.askpython.com...ot-in-operators-in-python

Acties:
  • +1 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 15:02
Hier een wat compactere vorm van je programma:
Zoek maar eens op wat eval() en f-strings doen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while True:
    try:
        Eerste_Getal = float(input('Kies een Getal: '))
        while True:
            Bewerking = input('Kies bewerking ( +, -, * of / ): ' )
            if len(Bewerking) == 1 and Bewerking[0] in ['+', '-', '*', '/']:
                while True:
                    Tweede_Getal = float(input('Kies een Getal: '))
                    try:
                        print( f"Resultaat is: {eval(f'Eerste_Getal{Bewerking}Tweede_Getal')}")
                        break
                    except:
                        print("Dit is geen getal!")
                break
            else:
                print ('Onjuiste invoer!')
        break
    except:
        print("Dit is geen getal!")
print('End of Program')

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


Acties:
  • +3 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ben(V) schreef op vrijdag 1 september 2023 @ 19:13:
Hier een wat compactere vorm van je programma:
Ja, zo zal TS het wel leren...
Give a Man a Fish, and You Feed Him for a Day. Teach a Man To Fish, and You Feed Him for a Lifetime
Daarbij is er op jouw code ook nog wel e.e.a. op te merken qua leesbaarheid en duidelijkheid. TS is nieuw en dan is zo'n 7 niveau's diepe code niet bepaald meteen makkelijk te doorgronden.

[ Voor 24% gewijzigd door RobIII op 01-09-2023 19:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 15:02
Goede voorbeelden is waar je het beste van leert is mijn ervaring.
Anders blijf je eeuwig in wel werkende maar slechte code hangen.

Vooral omdat het ertoe aanzet uit te zoeken hoe het werkt.

Nesting is altijd beter dan onnodige herhalingen en met de juiste code editor/debugger ook veel beter te lezen en te begrijpen.

[ Voor 25% gewijzigd door Ben(V) op 01-09-2023 19:27 ]

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


Acties:
  • +1 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 14:36

DataGhost

iPL dev

Ben(V) schreef op vrijdag 1 september 2023 @ 19:25:
Goede voorbeelden is waar je het beste van leert is mijn ervaring.
Ironisch. En niet waar, tenminste niet op jouw manier. Je leert het beste van uitzoeken wat je precies opschrijft en waarom het niet werkt zoals je hoopte dat het zou werken. Daarbij kan iemand je een stukje op weg helpen door je te wijzen wat je verkeerd doet. Dat kan inderdaad met een voorbeeld maar dat kan je beperken tot een heel klein voorbeeld in plaats van het geheel.
Anders blijf je eeuwig in wel werkende maar slechte code hangen.
Nogmaals ironisch. Maar ook dat kan je zonder volledige uitwerkingen oplossen door gewoon aan te geven welke delen van de code precies slecht zijn en waarom, en zodoende iemand uit te dagen om daar iets beters voor te verzinnen. En dat kan zelfs iets heel anders zijn dan wat je zelf in gedachten had of zelfs nog veel beter, maar die mogelijkheid ontneem je door het helemaal voor te kauwen. Daarbij is je voorbeeld behoorlijk slecht, zoals al genoemd, en je gebruikt wat constructies die helemaal nergens op slaan. Bijvoorbeeld regel 6 slaat helemaal nergens op (maar dat is niet het enige wat raar is hoor). Sure, het doet ongeveer wat je wilt maar het is nodeloos complex en niet in een oogopslag duidelijk wat je aan het doen bent. Bedenk maar eens hoe dat logischer kan. Bovendien is je programma niet normaal af te sluiten.
Vooral omdat het ertoe aanzet uit te zoeken hoe het werkt.
Dat valt nog mee. Helemaal als je nog niet kan programmeren en helemaal niet doorhebt wat er allemaal gebeurt en waarom. Op het moment dat je in die rekenmachine machtsverheffen zou willen toevoegen ben je weer hopeloos verloren omdat je geen idee hebt hoe de rest eigenlijk werkt. Je moet eens weten hoeveel mensen er zijn die eigenlijk niet echt kunnen programmeren maar gewoon wat dingen bij elkaar copy/pasten totdat het werkt, zonder te weten waarom precies. Door zelf iets stap voor stap te bouwen heb je bij elke stap door wat er gebeurt, in plaats van een stapel kant-en-klare code te krijgen "hier, dit moet je copy/pasten", de meest voor de hand liggende reactie daarbij is "oh."
Nesting is altijd beter dan onnodige herhalingen en met de juiste code editor/debugger ook veel beter te lezen en te begrijpen.
Wat voor onnodige herhalingen zouden er nodig zijn om jouw programma minder diep genest te maken dan? En waarom is het "altijd beter"? Vind je dat gewoon, of heb je daar een goede onderbouwing bij?

En direct als eerste aanraden om uit te zoeken wat eval doet is natuurlijk helemaal uit den boze. Dat is gewoon een security-ramp waiting to happen. Eval is heel mooi en is in *beperkte* gevallen handig om te gebruiken maar het zou op geen enkele manier je goto (ha-ha) moeten zijn. Maar dat gooi je nu gewoon even bij iemand op z'n bord, zonder enige uitleg van wat het doet en in welke van de enorm veel gevallen je het vooral niet moet gebruiken. Zoals bij user-input :X

Programmeren is veel meer dan alleen code kloppen, dat is eigenlijk alleen maar de laatste stap in het hele proces en zo ongeveer de minst belangrijke. Programmeren is kort door de bocht het probleem begrijpen en opsplitsen in logische sub-problemen, bij elk daarvan een aanpak verzinnen resulterend in een sub-oplossing, en dan het logisch aan elkaar knopen daarvan. Pas als dat allemaal gebeurd is kan je een programmeertaal gaan kiezen en het daarin uittypen. Door dat voorbeeld neer te knallen ben je aan al die stappen voorbij gegaan.

Met de tips van Daos komt TS veel verder, en misschien zelfs met de documentatie van Python in aanraking.

[ Voor 24% gewijzigd door DataGhost op 01-09-2023 21:15 ]


Acties:
  • 0 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 15:02
Heel verhaal met weinig inhoud.

TS had de boel zelfstandig aan het werk dus mijn voorbeeld is bedoelt om te laten zien hoe het ook kan.
Daar kan hij van leren in plaats van links naar de python documentatie te plaatsen.

Mijn voorbeeld laat TS zien hoe nesting en exceptions samen elegant werken en het gebruik van eval en f-strings.
Daarmee help je iemand mee op weg naar zaken die hij anders misschien nooit zou tegenkomen.

[ Voor 33% gewijzigd door Ben(V) op 01-09-2023 21:38 ]

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


Acties:
  • +1 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 14:36

DataGhost

iPL dev

:X nog concrete aanwijzingen waarom je precies vindt dat er weinig inhoud in zit? Of ben jij gewoon niet zo van het uitleggen? Heel concrete vraag dan, waar je ongetwijfeld overheen hebt gelezen: waarom is jouw regel 6 geschreven zoals je die hebt geschreven? Denk je niet dat daar een leesbaardere en logischere regel voor in de plaats zou kunnen komen, helemaal gezien je kennelijke aversie tegen onnodige herhalingen?
TS had de boel zelfstandig aan het werken dus mijn voorbeeld is bedoelt om te laten zien hoe het ook kan.
Daar kun je pas van leren in plaats van links naar de python documentatie te plaatsen.
Je hebt op geen enkele manier uitgelegd welke delen je op welke manier hebt aangepast en waarom, wat er niet goed was aan de originele aanpak en wat jij denkt dat wel goed zou zijn aan jouwe. Je hebt gewoon een stuk matige code neergegooid en daarbij zelf nog verwezen naar nota bene diezelfde documentatie wederom zonder enig waarom erbij. Niet echt een bruikbaar voorbeeld dus. Ik kan hetzelfde programma op vijf compleet andere manieren schrijven, goed en slecht, en ook zonder enige duiding neerplempen, maar dat helpt TS verder niet met begrijpen hoe en wat.

Acties:
  • 0 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 15:02
Tja beterweters zullen altijd beterweters blijven.

Ik denk dat TS meer aan mijn stukje code heeft dan aan jouw proza, dat hem niets helpt maar enkel bedoelt is om jouw gevoel van eigenwaarde op te krikken.

En daar wil ik het bij laten als je het niet erg vind.

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


Acties:
  • +6 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 14:36

DataGhost

iPL dev

Als je het niet kan uitleggen, prima. Als je niet fatsoenlijk kan programmeren, prima. Maar doe dan niet alsof je het beste schrijft wat er ooit geschreven is en stuur vooral geen beginners het bos in met domme adviezen zoals eval. Laat het er inderdaad maar bij.

Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 16:31

RayNbow

Kirika <3

Ben(V) schreef op vrijdag 1 september 2023 @ 19:13:
Hier een wat compactere vorm van je programma:
Zoek maar eens op wat eval() en f-strings doen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while True:
    try:
        Eerste_Getal = float(input('Kies een Getal: '))
        while True:
            Bewerking = input('Kies bewerking ( +, -, * of / ): ' )
            if len(Bewerking) == 1 and Bewerking[0] in ['+', '-', '*', '/']:
                while True:
                    Tweede_Getal = float(input('Kies een Getal: '))
                    try:
                        print( f"Resultaat is: {eval(f'Eerste_Getal{Bewerking}Tweede_Getal')}")
                        break
                    except:
                        print("Dit is geen getal!")
                break
            else:
                print ('Onjuiste invoer!')
        break
    except:
        print("Dit is geen getal!")
print('End of Program')
Een programma dat niet meer reageert op Ctrl+C. Bravo!

Ipsa Scientia Potestas Est
NNID: ShinNoNoir

Pagina: 1