Hallo zusammen,
hier ein mittelalter Kai aus dem Rheinland.
Bei Schinken würde man vielleicht sagen -> gut abgehangen.
Habe mir irgendwie in den Kopf gesetzt etwas programmieren zu wollen.
Ich bereue es fast jetzt schon. Puh, ist da viel zu lernen. Aber mit meinem fast
nicht vorhandenen Vorwissen, habe ich es ja so gewollt.
Weshalb ich mir auch den offenen Brief an alle Neulinge gut durchgelesen habe.
Genauso lesen ich gerade viele Bücher zum Thema Python und Raspberry.
Trotzdem, oder gerade deswegen möchte ich doch zwei Fragen stellen.
Bestimmt greife ich da meinen Büchern vorweg.
Und nein, ich möchte da nix "vorgefertigtes" haben. Selber mittdenken wäre mir lieber.
Es geht mir um ein Grundverständnis davon, wie ich mit Zahlen bzw. deren Möglichkeiten
in Variablen umgehe. Konkret: Der Nutzer soll einen Euro Betrag eingeben. Und das
in Deutscher Schreibweise. Also zumindest mit "Komma" für die Cent. Statt einem Punkt.
Habe dazu ein paar wenige Einträge hier im Forum gefunden.
Was ich erlesen habe ist:
Mit Input ohne irgendwas = sting
Da ist dann die gewünschte Eingabe möglich, aber die Zahlen weiterzuverabeiten schwierig.
Dann gibt es: locale, eval usw usw
Wärt Ihr bereit mir einmal einen roten Faden dafür zu geben, welche Themen ich
dafür abarbeiten muss, um an das Ziel zu kommen?
Vermutlich geht die zweite Frage in etwa gleiche Richtung. Betrifft Sie
die Eingabe eines Datums.
Mir geht es nicht darum, wie ich etwas umwandel, sondern, dass die Eingabe
schon wie gewünscht erfolgen kann.
So, jetzt hab ich fertig. Steinigt mich bitte nicht gleich.
Vielen Dank für Eure Hilfe bereits vorab.
Kai
Vorstellung, erster Beitrag und Frage
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Dir muss es aber ums umwandeln gehen, denn die Eingabe über `input()` erfolgt immer als Zeichenkette. Unter der Haube eigentlich noch ”schlimmer”: als Bytes. Nur dass Dir *diese* Umwandlung von `input()` bereits abgenommen wird.
Und genau so kann es sein, dass Dir andere Funktionen schon etwas von der Umwandlung abnehmen. Aber der Rechner kann letztlich nur Daten die irgendwie als Bytes repräsentiert werden, verarbeiten.
Konkret zum Dezimalkomma: das kann man einfach durch einen Punkt ersetzen und dann die Umwandlung in `float` versuchen. Oder bei Geldbeträgen eventuell auch `decimal.Decimal`-Objekte wenn man mit der (fehlenden) Präzision von ”normalen” Gleitkommazahlen ein Problem hat/bekommt. Also ``amount = float(input("Betrag: ").replace(",", "."))``. Falls der Benutzer auch Punkte als Tausendertrenner verwenden darf, müsste man die vorher ausfiltern. Falls die wirklich nur an den dafür passenden Stellen stehen dürfen, müsste man das explizit prüfen. Und falls der Benutzer *auch* Zahlen mit Dezimal*punkt* eingeben können soll, wird das mit den Tausenderpunkten noch einmal ein bisschen haariger, weil man dann zwischen diesen beiden Anwendungsfällen unterscheiden können muss. Was beispielsweise unmöglich ist wenn beliebig viele Nachkommastellen erlaubt sind, weil man dann nicht sagen kann was beispielsweise der Punkt in "4.200" bedeuten soll – Tausendertrenner (=4200) oder Dezimalpunkt (=4,2).
Beim Datum ist `datetime.datetime.strptime()` eine passende Umwandlungsfunktion. Also solange man nicht Monatsnamen eingeben können soll, wo dann wieder das Lokalisationsproblem besteht und man sich mit `locale` beschäftigen muss, oder selber ein bisschen was programmieren muss, oder nach einer passenden externen Bibliothek schauen müsste.
Und genau so kann es sein, dass Dir andere Funktionen schon etwas von der Umwandlung abnehmen. Aber der Rechner kann letztlich nur Daten die irgendwie als Bytes repräsentiert werden, verarbeiten.
Konkret zum Dezimalkomma: das kann man einfach durch einen Punkt ersetzen und dann die Umwandlung in `float` versuchen. Oder bei Geldbeträgen eventuell auch `decimal.Decimal`-Objekte wenn man mit der (fehlenden) Präzision von ”normalen” Gleitkommazahlen ein Problem hat/bekommt. Also ``amount = float(input("Betrag: ").replace(",", "."))``. Falls der Benutzer auch Punkte als Tausendertrenner verwenden darf, müsste man die vorher ausfiltern. Falls die wirklich nur an den dafür passenden Stellen stehen dürfen, müsste man das explizit prüfen. Und falls der Benutzer *auch* Zahlen mit Dezimal*punkt* eingeben können soll, wird das mit den Tausenderpunkten noch einmal ein bisschen haariger, weil man dann zwischen diesen beiden Anwendungsfällen unterscheiden können muss. Was beispielsweise unmöglich ist wenn beliebig viele Nachkommastellen erlaubt sind, weil man dann nicht sagen kann was beispielsweise der Punkt in "4.200" bedeuten soll – Tausendertrenner (=4200) oder Dezimalpunkt (=4,2).
Beim Datum ist `datetime.datetime.strptime()` eine passende Umwandlungsfunktion. Also solange man nicht Monatsnamen eingeben können soll, wo dann wieder das Lokalisationsproblem besteht und man sich mit `locale` beschäftigen muss, oder selber ein bisschen was programmieren muss, oder nach einer passenden externen Bibliothek schauen müsste.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sorry, dass ich mich nochmal melde,
Habe wieder viele Seiten in meinen Büchern gelesen.
Es geht nochmal um's Thema Datum.
Überall steht, wie ich mit einem Datum umgehe. Time - Datetime usw....
Das kann ich überall nachlesen.
Aber in keinem meiner Einsteiger Bücher steht, wie ich den Nutzer auffordere
ein Datum einzugeben. Das wäre noch einfach. Aber wie kann ich in Python ein
Datum so durch den Nutzer eingeben lassen, dass ich damit später auch rechnen kann?
BSP
Benutzer gibt ein Datum wie z. B, 15.05.2021 ein.
Was nun, um es in Python so umzuwandeln, dass ich dann damit rechnen kann?
Sehr es mir bitte nach, wenn ich nerve.
Aber was nutzen da Bücher, wenn niemand diesen ersten Schritt erklärt?
grrrrr
Danke und vg
Kai
Habe wieder viele Seiten in meinen Büchern gelesen.
Es geht nochmal um's Thema Datum.
Überall steht, wie ich mit einem Datum umgehe. Time - Datetime usw....
Das kann ich überall nachlesen.
Aber in keinem meiner Einsteiger Bücher steht, wie ich den Nutzer auffordere
ein Datum einzugeben. Das wäre noch einfach. Aber wie kann ich in Python ein
Datum so durch den Nutzer eingeben lassen, dass ich damit später auch rechnen kann?
BSP
Benutzer gibt ein Datum wie z. B, 15.05.2021 ein.
Was nun, um es in Python so umzuwandeln, dass ich dann damit rechnen kann?
Sehr es mir bitte nach, wenn ich nerve.
Aber was nutzen da Bücher, wenn niemand diesen ersten Schritt erklärt?
grrrrr
Danke und vg
Kai
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Um mich mal selbst zu zitieren: „Beim Datum ist `datetime.datetime.strptime()` eine passende Umwandlungsfunktion.“
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
also, Code:
from datetime import datetime
x = input("Datum eingeben: ")
x = datetime.datetime.strptime(x, "%d,-%m-%y")#.strfptime("%d-%m-%y)
print(x)
führt zu:
Datum eingeben: 05.03.2021
Traceback (most recent call last):
File "/home/pi/Python/Testen/Datum.py", line 6, in <module>
x = datetime.datetime.strptime(x, "%d,-%m-%y")#.strfptime("%d-%m-%y)
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
from datetime import datetime
x = input("Datum eingeben: ")
x = datetime.datetime.strptime(x, "%d,-%m-%y")#.strfptime("%d-%m-%y)
print(x)
führt zu:
Datum eingeben: 05.03.2021
Traceback (most recent call last):
File "/home/pi/Python/Testen/Datum.py", line 6, in <module>
x = datetime.datetime.strptime(x, "%d,-%m-%y")#.strfptime("%d-%m-%y)
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Oder andersherum einmal `datetime` bei ``datetime.datetime.strptime(…) weg lassen.
Und dann ist das Format falsch. Da ist ein Komma drin, dass da nichts zu suchen hat, und bei Datumsangaben wo die Teile durch "-" getrennt sind, würden die allermeisten, wenn nicht alle Benutzer erwarten, dass die Reihenfolge Jahr, Monat, Tag ist.
`x` ist kein besonders guter Name hier, und man sollte den auch nicht an so verschiedene Dinge wie Zeichenketten und Datumsobjekte binden. Das verwirrt.
Und dann ist das Format falsch. Da ist ein Komma drin, dass da nichts zu suchen hat, und bei Datumsangaben wo die Teile durch "-" getrennt sind, würden die allermeisten, wenn nicht alle Benutzer erwarten, dass die Reihenfolge Jahr, Monat, Tag ist.
`x` ist kein besonders guter Name hier, und man sollte den auch nicht an so verschiedene Dinge wie Zeichenketten und Datumsobjekte binden. Das verwirrt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Also, mega Denkeschön für Deine Geduld.
Habe nun 2 Varianten, die beide funktionieren
1) import datetime
start_datum = input("Datum eingeben: ")
start_datum = datetime.datetime.strptime(start_datum, "%d.%m.%Y")
print(start_datum)
2) from datetime import datetime
start_datum = input("Datum eingeben: ")
start_datum = datetime.strptime(start_datum, "%d.%m.%Y")
print(start_datum)
Das werde ich mir morgen mal in Ruhe anschauen ->
Du importierst datetime als Klassenname. Ein einfaches “import datetime” löst das.
Bin beim Lernen halt erst bei den Variabeln, if, for, Funktionen usw.
Aber Dank Deiner Hilfe kann ich jetzt quasi damit starten Datum und Betrag
in meinem "Lernprogramm" mit aufzunehmen.
VG
Kai
Habe nun 2 Varianten, die beide funktionieren
1) import datetime
start_datum = input("Datum eingeben: ")
start_datum = datetime.datetime.strptime(start_datum, "%d.%m.%Y")
print(start_datum)
2) from datetime import datetime
start_datum = input("Datum eingeben: ")
start_datum = datetime.strptime(start_datum, "%d.%m.%Y")
print(start_datum)
Das werde ich mir morgen mal in Ruhe anschauen ->
Du importierst datetime als Klassenname. Ein einfaches “import datetime” löst das.
Bin beim Lernen halt erst bei den Variabeln, if, for, Funktionen usw.
Aber Dank Deiner Hilfe kann ich jetzt quasi damit starten Datum und Betrag
in meinem "Lernprogramm" mit aufzunehmen.
VG
Kai
amount = float(input("Betrag: ").replace(",", "."))
Ich möchte dazu gerne nochmal nachfragen.
Es funktioniert. Ich möchte aber verstehen, warum?
Ich habe mir dazu zu Herzen genommen mich aus der Komfortzone
zu begeben und Englisch zu blättern
https://docs.python.org/3.9/library/std ... es.replace
Folgende Erklärungen zu replace habe ich gefunden:
1)
# str.replace(old, new[, count])
# return a copy of the string with all occurrences of substring
# old replaced by new. If the optional argument count is given,
# only the first count occurrences are replaced.
2)
#Parameter von replace('x', 'y', [Anzahl])
#Der dritte Parameter für die Anzahl ist Optional. Hier können wir festlegen, wie viele Vorkommen des alten Wertes ersetzt werden soll. Wird dieser Parameter nicht angegeben, werden alle Vorkommen ersetzt.
#Beispiel: es sollen nur die erste 3 Vorkommen ersetzt werden:
In einem string ist mir das klar. Bsp
ausgabetext = "Der Preis für 2 Socken beträgt 2 DM und 2 Paar kosten 3.50 DM"
ausgabetext = ausgabetext.replace("DM", "Euro")
ausgabetext = ausgabetext.replace("2", "zwei", 2)
Die ersten beiden Zahlen "2" werden gegen das Wort "zwei" getauscht.
Und weil das dritte Argument 2 ist, bleibt die dritte Zahl "2" eben ach die Zahl 2.
.replace(",", "."))``.
Was bedeutet das jetzt übersetzt in Bezug auf die Umwandlung der Benutzereingabe: 500,00
frei nach 1) und 2) übersetzt würde das doch jetzt bedeuten, ersetze "Komma" gegen "Komma"
Anzahl "Punkt".
In der Dokumentation habe ich float.replace nicht gefunden.
Ich weiß, ich bin ne lästige Fliege.... aber
VG
Kai
Ich möchte dazu gerne nochmal nachfragen.
Es funktioniert. Ich möchte aber verstehen, warum?
Ich habe mir dazu zu Herzen genommen mich aus der Komfortzone
zu begeben und Englisch zu blättern
https://docs.python.org/3.9/library/std ... es.replace
Folgende Erklärungen zu replace habe ich gefunden:
1)
# str.replace(old, new[, count])
# return a copy of the string with all occurrences of substring
# old replaced by new. If the optional argument count is given,
# only the first count occurrences are replaced.
2)
#Parameter von replace('x', 'y', [Anzahl])
#Der dritte Parameter für die Anzahl ist Optional. Hier können wir festlegen, wie viele Vorkommen des alten Wertes ersetzt werden soll. Wird dieser Parameter nicht angegeben, werden alle Vorkommen ersetzt.
#Beispiel: es sollen nur die erste 3 Vorkommen ersetzt werden:
In einem string ist mir das klar. Bsp
ausgabetext = "Der Preis für 2 Socken beträgt 2 DM und 2 Paar kosten 3.50 DM"
ausgabetext = ausgabetext.replace("DM", "Euro")
ausgabetext = ausgabetext.replace("2", "zwei", 2)
Die ersten beiden Zahlen "2" werden gegen das Wort "zwei" getauscht.
Und weil das dritte Argument 2 ist, bleibt die dritte Zahl "2" eben ach die Zahl 2.
.replace(",", "."))``.
Was bedeutet das jetzt übersetzt in Bezug auf die Umwandlung der Benutzereingabe: 500,00
frei nach 1) und 2) übersetzt würde das doch jetzt bedeuten, ersetze "Komma" gegen "Komma"
Anzahl "Punkt".
In der Dokumentation habe ich float.replace nicht gefunden.
Ich weiß, ich bin ne lästige Fliege.... aber
VG
Kai
- __blackjack__
- User
- Beiträge: 13111
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
`float.replace()` gibt's auch nicht:
Code: Alles auswählen
In [20]: str.replace
Out[20]: <method 'replace' of 'str' objects>
In [21]: float.replace
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-21-878b15d4be56> in <module>
----> 1 float.replace
AttributeError: type object 'float' has no attribute 'replace'
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
das verstehe ich ja leider eben nicht.
Es ist schwer zu beschreiben.
replace( 1. Inhalt ist der übergebene input -> also - strg 500 KOMMA 23 - durch
den 2. Inhalt in der Klammer -> also auch KOMMA ersetzt wird.
Was dann auf's gleiche rauskommt.
Was der Punkt dann hinten macht, verstehe ich dann nicht.
Wie separiert man denn die mehreren Argumente an eine Funktion?
das wäre dann wohl genau die Frage.
Könnt Ihr es etwas mehr "Schulkind" ausdrücken, bitte?
Kai
Sorry, jetzt verstehe ich gar nichts mehr
dieser Code:
ausgabetext = "Der Preis für 2 Socken beträgt 5 DM und 5 Paar kosten 10 DM"
ausgabetext = ausgabetext.replace("DM", "Euro")
print(ausgabetext)
bewirkt diese Ausgabe:
Der Preis für 2 Socken beträgt 5 Euro und 5 Paar kosten 10 Euro
Hier wird doch eindeutig "DM" gegen "EURO" getauscht.
Genau aus dem Grund, habe ich ja die Frage bei replace("," ,".")
dieser Code:
ausgabetext = "Der Preis für 2 Socken beträgt 5 DM und 5 Paar kosten 10 DM"
ausgabetext = ausgabetext.replace("DM", "Euro")
print(ausgabetext)
bewirkt diese Ausgabe:
Der Preis für 2 Socken beträgt 5 Euro und 5 Paar kosten 10 Euro
Hier wird doch eindeutig "DM" gegen "EURO" getauscht.
Genau aus dem Grund, habe ich ja die Frage bei replace("," ,".")
Zuletzt geändert von derkai74 am Donnerstag 13. Januar 2022, 22:33, insgesamt 3-mal geändert.
Ausgangswert ist DM -> Ergebnis ist EURO (Komma hin oder her)
Was macht denn das Komma, wenn im Ergebnis genau das geschieht
was im Argument 1 (DM) gegen Argument 2 (Euro) getauscht wird?
Also genau das, was replace("DM", "EURO") ausführen soll.
Wofür ist denn das Komma da? Was bewirkt es? außer Argument1 von Argument 2 zu trennen?
VG
Kai
Was macht denn das Komma, wenn im Ergebnis genau das geschieht
was im Argument 1 (DM) gegen Argument 2 (Euro) getauscht wird?
Also genau das, was replace("DM", "EURO") ausführen soll.
Wofür ist denn das Komma da? Was bewirkt es? außer Argument1 von Argument 2 zu trennen?
VG
Kai