Vorstellung, erster Beitrag und Frage

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.
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

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
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

vielen Dank, das hilft schon einmal weiter.
Heißt ich gehe den Weg eigentlich genau andersrum als gedacht.

Ich werde mal mit Deinen Informationen "spielen".
Hab vielen Dank.
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

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
Benutzeravatar
__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
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

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'
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du importierst datetime als Klassenname. Ein einfaches “import datetime” löst das.
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

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
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

PS - mein Bauch findet Variante 2 deutlich schlanker, noch kann ich das aber nicht begründen.
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

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
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie kommst du denn darauf, dass da Komma mit Komma ersetzt wird? Wie separiert man denn die mehreren Argumente an eine Funktion?
Benutzeravatar
__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
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

__deets__ hat geschrieben: Donnerstag 13. Januar 2022, 19:57 Wie kommst du denn darauf, dass da Komma mit Komma ersetzt wird? Wie separiert man denn die mehreren Argumente an eine Funktion?
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
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei `ausgabetext.replace("DM", "Euro")` wird "DM" durch KOMMA ersetzt und was soll das "Euro"? Warum hast Du bei dieser Zeile nicht die selbe Frage?
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

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("," ,".")
Zuletzt geändert von derkai74 am Donnerstag 13. Januar 2022, 22:33, insgesamt 3-mal geändert.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

In dem DM und EURO Beispiel kommt doch auch ein Komma vor im Ausdruck mit dem replace. Wieso verwirrt dich das Komma nicht, aber das Komma bei dem andern Ausdruck stellt ein Mysterium dar?
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

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
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du sagst es doch selbst. Das Komma trennt die Argumente. Und das tut es in beiden Fällen. Also ist im Fall vom Komma und Punkt das zweite Komma nicht das, womit das erste ersetzt wird. Sonder der Trenner.
derkai74
User
Beiträge: 39
Registriert: Montag 27. Dezember 2021, 22:14

Ey Ey Ey - ich tret mal bei Seite-
dann steh ich nicht mehr auf dem Schlauch.

Danke Danke Danke
Das zweite Komma steht nicht in "" - daher ist der Trenner.
Manchmal hilft auch gucken.

Danke
Kai
Antworten