Python rechnet falsch

OP #6187197
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren