Python rechnet falsch

OP #6187197
Hi Leute, bin neu hier und zu Beginn habe ich eine Frage bezüglich eines 
Babybeispieles und ich frag mich nur was ich da falsch gemacht habe. ER 
rechnet die Multiplikation aus irgendeinem Grund falsch.
Kurze INfo: Ich lern Python erst seit ein paar Minuten.

Hier die Programmierung:

tage = float();
tage = input();
stunden = float();

print('Gib die Anzahl der Tage ein', tage)

stunden = tage * 24

print('Das sind die Stunden von ', tage,'Tagen :',stunden)


und raus kommt immer nur das

5     (die Zahl die ich eingebe)
Gib die Anzahl der Tage ein 5
Das sind die Stunden von  5 Tagen : 555555555555555555555555
Gast #6187209
Scheint ein String-Verarbeitungs-Problem zu sein.
Deine Eingabe ist ein Text.
So wie ich es interpretiere, verfielfacht Python diesen String einfach 
24 Mal.
Du musst den String also in eine Zahl umwandeln.
Beitrag #6187213 wurde von einem Moderator gelöscht.
Beitrag #6187223 wurde von einem Moderator gelöscht.
Beitrag #6187227 wurde von einem Moderator gelöscht.
Beitrag #6187228 wurde von einem Moderator gelöscht.
Gast #6187367
Der Moderator möchte leider nicht, dass Dir geholfen wird.

Schau am besten ein youtube Tutorial...

Ansonsten guck Dir die Funktionsreferenz von float(), print() und 
input() an.
Dann siehst Du, was da oben alles nicht stimmt.
Gast #6187407
Das der Code oben Murks ist und er sich eine andere Lektüre zum Lernen 
suchen soll war ein unflätiger Kommentar?

Wenn der Mensch, wie er selber sagt, gerade seit ein paar Minuten Python 
lernt und dann so einen Code zur Diskussion stellt:
1
tage = float();
2
tage = input();
3

4
print('Gib die Anzahl der Tage ein', tage)

kann der einzige Schluss doch nur sein, dass sein Lernmaterial absolut 
minderwertig ist.

Aber gut... macht ihr mal.
Gast #6187425
Seppl schrieb:
> Das der Code oben Murks ist und er sich eine andere Lektüre zum Lernen
> suchen soll war ein unflätiger Kommentar?

Nein, du warst nicht gemeint, sondern ein anderer Typ, der "halt die 
Fresse" und ähnliches schrieb. Diese Ausdrucksweise war doch sehr 
daneben.
#6187474
STK500-Besitzer schrieb:
> Scheint ein String-Verarbeitungs-Problem zu sein.
> Deine Eingabe ist ein Text.
> So wie ich es interpretiere, verfielfacht Python diesen String einfach
> 24 Mal.
> Du musst den String also in eine Zahl umwandeln.

Das ist kein Problem, sondern intendiert und dokumentiert:
1
3 * '4'

ist in Python tatsächlich '444', anstatt (wie in PHP) 12.
1
3 + '4'

dagegen ist in PHP 7, in Python wirft das einen TypeError.
#6187479
Marvin K. schrieb:
> tage = float();
> tage = input();
> stunden = float();

Den "float()"-Quatsch kannst Du Dir in Python sparen, die Semikola am 
Ende der Zeilen ebenfalls. Python verwendet Autovivikation -- Du mußt 
Variablen also nicht deklarieren -- und andererseits bindet es Typen 
nicht an die Variablen, sondern an den Wert. Beispiel:
1
i = 3    # i ist jetzt ein integer
2
i = 3.3  # i ist jetzt ein float
3
i = '3'  # i ist jetzt ein str (in Python2) oder ein bytes (Python3)

Diesen Code kannst Du genau so ausführen, und der Typ von i ändert sich 
dabei mit jeder Zuweisung.
#6187482
Leider ist mein ursprünglicher Post-Versuch genau in die Minute 
gefallen, als das Topic kurz weg war...

Kurz: Python ist Typenschwach, eine Variable, die vorher einen string 
enthilt, kann mit nächster Zuweisung einen int oder float enthalten, und 
umgekehrt.

Zugleich hat Python mächtige Array-Funktionen. Da strings nichts anderes 
als Arrays sind, kannst du deren Elemente multiplizieren, es passiert 
also folgendes:

'5' * 2 = '55'

5 * 2 = 10

[5] * 2 = [5, 5]

float('5') * 2 = 10

Das ist alles so gewollt. Für Anfänger verwirrend, aber nützliche 
Features.

Edit: Missverständlichkeit reduziert
#6187511
Chris R. schrieb:
> Kurz: Python ist Typenschwach

Verzeihung, PHP ist schwach typisiert, weil es sich seinen Variablentyp 
je nach verwendetem Operator automatisch zurecht castet -- und deswegen 
kommt dort bei 3 + '4' auch 7 heraus, bei 3 * '4' eine 12.

Python ist dynamisch, aber stark typisiert, deswegen wirft es bei 3 + 
'4' einen TypeError. 3 * '4' ist dagegen unter Python definiert (durch 
die "magische" Methode _mul_ des Builtin 'str'), heraus kommt '444'.
Gast #6187596
Marvin K. schrieb:
> tage = float();
 Das ist überflüssig, in Python musst du keine Variablen Deklarieren. 
einfach erstazlos weglassen.

> tage = input();
 Hier ließt du eine String ein tage ist jetzt ein String kein float 
mehr!
 zum überprüfen einfach type(tage) ausgeben. (Achtung in Python können ) 
Variablen den Type änderen (ist aber schlechter Style)

> stunden = float();
Auch das würde ich würde ich in Python weglassen. Btw das Semikolon ist 
in Python Optional und unüblich das Linebreak schließt die Instruktion 
auch ab.

>
> print('Gib die Anzahl der Tage ein', tage)
>
 das sollte vor den Input stehen, oder auch so input('Gib die Anzahl der 
Tage ein ')

> stunden = tage * 24

tage vom Type String die 24 ist ein Int, eine besonderheit von Python 
ist das Python hier den String 24 Concatiniert und das in Stunden als 
String speichert.

hier mal dein Beispiel in Python 3.6 oder höher
beachte das int(tage) um aus den String ein int zu machen.
(Zur Vereinfachung würde die Fehlerbehandlung weglassen)
1
tage = input('Gib die Anzahl der Tage ein: ')
2
stunden = int(tage) * 24
3
print(f'Das sind die Stunden von {tage}, Tagen :{stunden}')
#6188235
Chris R. schrieb:
> Sheeva P. schrieb:
>> Python ist dynamisch, aber stark typisiert
>
> sorry, da hab ich was durcheinander geworfen - danke für die
> Berichtigung! :)

Nichts zu danken, sehr gerne. Im Alltag ist man an solche Dinge 
irgendwann ja so gewöhnt, daß man es als selbstverständlich hinnimmt und 
nicht mehr darüber nachdenkt... Ich hätte das sicherlich auch schon 
längst vergessen, wenn ich nicht unregelmäßig Python-Schulung halten 
würde. ;-)
Gast #6188408
Sheeva P. schrieb:
> Das ist kein Problem, sondern intendiert und dokumentiert:

Doch ist es: Für den Threadopener ;)
Ich habe bis jetzt keine Ahnung von python.
Dass der TO noch andere, mehr Defizite hat, hat er ja schon geschrieben.
python-Tutorien sollte es aufgrund seiner Verbreitung ja zuhauf geben.
Damit würde ich anfangen.
Moderator #6188520
Da D. schrieb:
> Du meinst "Mit nem Stacktrace abschmieren" ist das richtige für den
> User des Programms?

In diesem speziellen Fall schon:

Der User ist hier einer, der gerade anfängt, in Python zu programmieren.

Für diesen dürfte die aus der Falscheingabe "Hampelmann" resultierende
Fehlermeldung

1
  File "test.py", line 3, in <module>
2
    stunden = int(tage) * 24
3
ValueError: invalid literal for int() with base 10: 'Hampelmann'

leichter zu verstehen sein als das zum Abfangen dieses Fehlers
erforderliche Exception-Handling.
Gast #6188910
Vort schrieb:
> Erwin D. schrieb:
>> MaWin schrieb:
>>> Jeder cast ist überflüssig, wenn man
>>> programmieren kann.
>>
>> Dann berichtige bitte und zeig, wie man es richtig macht.
>
> Hat dir deine Mutti nicht gesagt, dass Du MaWin nicht überfordern
> sollst?

Das ist doch keine Überforderung.
Das beantwortet er doch mit links ;-)
#6189115
Erwin D. schrieb:
>> Erwin D. schrieb:
>>> MaWin schrieb:
>>>> Jeder cast ist überflüssig, wenn man
>>>> programmieren kann.
>>>
>>> Dann berichtige bitte und zeig, wie man es richtig macht.
>>
>> Hat dir deine Mutti nicht gesagt, dass Du MaWin nicht überfordern
>> sollst?
>
> Das ist doch keine Überforderung.
> Das beantwortet er doch mit links ;-)

Mich würde auch interessieren, was denn seiner Meinung nach der richtige 
Weg ist, um in python einen string in einen int zu konvertieren.
Und mich würde interessieren, warum es wohl in sehr vielen Sprachen 
Casts gibt, wenn ihre Benutzung wie er behauptet grundsätzlich immer ein 
Fehler ist.
#6191253
STK500-Besitzer schrieb:
> Sheeva P. schrieb:
>> Das ist kein Problem, sondern intendiert und dokumentiert:
>
> Doch ist es: Für den Threadopener ;)
> Ich habe bis jetzt keine Ahnung von python.

Das tut mir leid, aber Du kannst es ja leicht beheben. ;-)

Nein, im Ernst: wenn Du Verwendung für eine Skriptsprache hast, ist 
Python zweifellos eine hervorragende Wahl. ;-)

> Dass der TO noch andere, mehr Defizite hat, hat er ja schon geschrieben.
> python-Tutorien sollte es aufgrund seiner Verbreitung ja zuhauf geben.
> Damit würde ich anfangen.

Das ist zwar zweifellos richtig, aber als Anfänger fängt man so ein 
Tutorial ja erstmal an und verinnerlicht es nicht innerhalb von einer 
halben Stunde. Unser TO wird sicherlich noch an die richtige Stelle des 
Tutorial kommen und den entsprechenden Hinweis finden, hab' doch bitte 
einfach mal ein bisschen Geduld mit einem Einsteiger. ;-)
#6191254
Da D. schrieb:
> Sheeva P. schrieb:
>> Da Python meist das Richtige tut, ist das in der Regel auch überflüssig.
>> ;-)
>
> Du meinst "Mit nem Stacktrace abschmieren" ist das richtige für den
> User des Programms?

Das hängt ganz davon ab, aber meistens ist das so. Der Stacktrace hat ja 
immerhin die Informationen, daß, warum, was, und wo etwas schiefgelaufen 
ist. Das ist mehr, als ich von vielen anderen Sprachen kenne...
Gast #6197761
Und wer Python um ein vielfaches schneller haben will, ohne den Code 
speziell anpassen zu müssen, sollte mal den alternativen PyPy 
Interpreter ausprobieren. PyPy ist ein JIT Compiler für Python. Bei 
meinen Versuchen war es mehrfach schneller als der Standard Python 
Interpreter.

https://www.pypy.org/

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.