Forum: PC-Programmierung Python rechnet falsch


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Marvin K. (mrxv001zzr)


Bewertung
0 lesenswert
nicht 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

: Wiederhergestellt durch Admin
von STK500-Besitzer (Gast)


Bewertung
0 lesenswert
nicht 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.

: Wiederhergestellt durch Admin
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.
von Marvin K. (mrxv001zzr)


Bewertung
0 lesenswert
nicht lesenswert
Und wie funktioniert das? HAb da keinen Plan

von Test (Gast)


Bewertung
0 lesenswert
nicht lesenswert
stunden = int(tage) * 24

von Seppl (Gast)


Bewertung
-3 lesenswert
nicht 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.

von Erwin D. (Gast)


Bewertung
3 lesenswert
nicht lesenswert
Seppl schrieb:
> Der Moderator möchte leider nicht, dass Dir geholfen wird.

Das glaube ich nicht. Es wurde nur die unflätige Antwort gelöscht und 
die Beiträge, die damit zusammenhängen.

von Typo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch mit type(tage) den Typ der Variable anzeigen. Dann siehst 
du auch dass es ein String ist.

von Seppl (Gast)


Bewertung
0 lesenswert
nicht 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:
tage = float();
tage = input();

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.

von Erwin D. (Gast)


Bewertung
2 lesenswert
nicht 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.

von Sheeva P. (sheevaplug)


Bewertung
1 lesenswert
nicht 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:
3 * '4'

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

dagegen ist in PHP 7, in Python wirft das einen TypeError.

von Sheeva P. (sheevaplug)


Bewertung
2 lesenswert
nicht 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:
i = 3    # i ist jetzt ein integer
i = 3.3  # i ist jetzt ein float
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.

von Chris R. (hownottobeseen)


Bewertung
1 lesenswert
nicht 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

: Bearbeitet durch User
von Sheeva P. (sheevaplug)


Bewertung
2 lesenswert
nicht 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'.

von Chris R. (hownottobeseen)


Bewertung
2 lesenswert
nicht lesenswert
Sheeva P. schrieb:
> Python ist dynamisch, aber stark typisiert

sorry, da hab ich was durcheinander geworfen - danke für die 
Berichtigung! :)

von imonbln (Gast)


Bewertung
0 lesenswert
nicht 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)
tage = input('Gib die Anzahl der Tage ein: ')
stunden = int(tage) * 24
print(f'Das sind die Stunden von {tage}, Tagen :{stunden}')

von Da D. (dieter)


Bewertung
1 lesenswert
nicht lesenswert
imonbln schrieb:
> (Zur Vereinfachung wurde die Fehlerbehandlung weglassen)

Das scheint ein weit verbreitetes Motto bei Python Programmierern zu 
sein. ;-)

von Sheeva P. (sheevaplug)


Bewertung
0 lesenswert
nicht 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. ;-)

von Sheeva P. (sheevaplug)


Bewertung
-1 lesenswert
nicht lesenswert
Da D. schrieb:
> imonbln schrieb:
>> (Zur Vereinfachung wurde die Fehlerbehandlung weglassen)
>
> Das scheint ein weit verbreitetes Motto bei Python Programmierern zu
> sein. ;-)

Da Python meist das Richtige tut, ist das in der Regel auch überflüssig. 
;-)

von STK500-Besitzer (Gast)


Bewertung
0 lesenswert
nicht 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.

von Da D. (dieter)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Yalu X. (yalu) (Moderator)


Bewertung
-1 lesenswert
nicht 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

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

leichter zu verstehen sein als das zum Abfangen dieses Fehlers
erforderliche Exception-Handling.

von MaWin (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Test schrieb:
> stunden = int(tage) * 24

Es lebe die Typesicherheit! Jeder cast ist überflüssig, wenn man 
programmieren kann. Ein cast ist immer ein Indikator für einen 
schlechten Programmierer.

von Carl D. (jcw2)


Bewertung
3 lesenswert
nicht lesenswert
MaWin schrieb:
> Test schrieb:
>> stunden = int(tage) * 24
>
> Es lebe die Typesicherheit! Jeder cast ist überflüssig, wenn man
> programmieren kann. Ein cast ist immer ein Indikator für einen
> schlechten Programmierer.

Das ist kein cast, sondern eine Konvertierung nach int.

: Bearbeitet durch User
von Erwin D. (Gast)


Bewertung
2 lesenswert
nicht lesenswert
MaWin schrieb:
> Jeder cast ist überflüssig, wenn man
> programmieren kann.

Dann berichtige bitte und zeig, wie man es richtig macht.

von Vort (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
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?

von Erwin D. (Gast)


Bewertung
1 lesenswert
nicht 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 ;-)

von Typo (Gast)


Bewertung
3 lesenswert
nicht lesenswert
Für Python gibt es übrigens statische type checker die bei größeren 
Projekten sinnvoll sein können.

http://mypy-lang.org/
https://google.github.io/pytype/

von Rolf M. (rmagnus)


Bewertung
1 lesenswert
nicht 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.

von Sheeva P. (sheevaplug)


Bewertung
0 lesenswert
nicht 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. ;-)

von Sheeva P. (sheevaplug)


Bewertung
-1 lesenswert
nicht 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...

von Sheeva P. (sheevaplug)


Bewertung
0 lesenswert
nicht lesenswert
Typo schrieb:
> Für Python gibt es übrigens statische type checker die bei größeren
> Projekten sinnvoll sein können.
>
> http://mypy-lang.org/
> https://google.github.io/pytype/

Und natürlich einen Linter:

https://www.pylint.org/

von Typo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.