Konvertierung von Formaten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fil3000
User
Beiträge: 2
Registriert: Donnerstag 31. Januar 2019, 09:45

Liebe Community,

ich bin neu in Python und neu hier, also hallo =)

Ich komme aber gleich zum Punkt: Ich möchte einen Taschenrechner programmieren, glaube aber nicht, dass der Thread in das wissenschaftliche Forum gehört, da es sich eher um Schwierigkeiten mit der Python Syntax handelt. Es ist sicher nichts, was nicht lösbar ist.

An einer Stelle sollen Logarithmen berechnet werden. Anstatt vorher auswählen, welche Basis man nimmt, ob es sich also um log, lg, ln, ... handelt, möchte ich die Eingabe frei gestalten. Das heißt, es soll eine Zahl eingegeben werden. Um bei Fehleingaben nicht abzubrechen, verwende ich try, sodass man eine Meldung erhält "Bitte eine Zahl eingeben Blabla", wenn der input nicht float ist. Es soll aber Ausnahmen, z. B. e als Eingabe geben, so dass der eingegebenen Zahl dann der Wert math.exp(1) zugewiesen wird. Ich bekomme aber die untenstehende Fehlermeldung. Habt ihr eine Idee?

Danke schon mal für eure Zeit.

Das funktioniert (ohne die e-Ausnahme):

Code: Alles auswählen

import math

print('log a (b) [Log a zur Basis b]')
while True:
    try:
        a = float(input('a = '))
        break
    except ValueError:
        print('Zahl, bitte.')

while True:
    try:
        b = float(input('Basis = '))
        break
    except ValueError:
        print('Zahl, bitte.')
        
print(math.log(a,b))
Ich dachte ich kann jetzt bei dem ValueError einfach schauen, ob es sich bei der nicht-float-Eingabe um den Buchstaben e handelt und wenn ja, den Wert der Zahl e zuweisen:

Code: Alles auswählen

while True:
    try:
        b = float(input('Basis = '))
        break
    except ValueError:
        if b == e:
            b = math.exp(1)
        else:
            print('Zahl, bitte.')
Dort bekomme ich jedoch diesen Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "/Users/fil3000/PycharmProjects/python3_buch/2_while/Rechner 2.0.py", line 13, in <module>
    b = float(input('Basis = '))
ValueError: could not convert string to float: 'e'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/fil3000/PycharmProjects/python3_buch/2_while/Rechner 2.0.py", line 16, in <module>
    if b == e:
NameError: name 'b' is not defined
Zuletzt geändert von fil3000 am Donnerstag 31. Januar 2019, 10:56, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst halt den Wert von input *zuerst* an eine Variable "eingabe" zB binden, und den *dann* versuchen zu konvertieren - und wenn das fehlschlaegt, kannst du weitergehende Pruefungen machen.
fil3000
User
Beiträge: 2
Registriert: Donnerstag 31. Januar 2019, 09:45

Hi,

danke schonmal. Aber dann kann ich die Eingabe bei einer ungültigen Eingabe doch nicht mehr in der Schleife haben... oder?

LG
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso nicht? Das hat doch keinerlei Einfluss auf den umgebenden Code.
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Darüberhinaus fehlen im Vergleich die Anführungszeichen um e
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fil3000: Ich würde den Test auf 'e' als Eingabe dann aber auch *vor* dem Versuch machen die Eingabe in eine Zahl zu wandeln. Und dann die Schleife auch in eine Funktion zu verpacken statt sie zweimal in den Quelltext zu kopieren.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten