Anfangs Probleme

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.
Antworten
Benutzeravatar
JustHechi
User
Beiträge: 12
Registriert: Samstag 26. Oktober 2013, 20:14

Ich soll ein Programm schreiben mit dem ich verschiedene Flächeninhalte berechnen soll ich nehm jetzt das Beispiel Kugel --> formel A= 4 * pi * r² und r= Radius

das Programm hab ich so angelegt das man zunächst den Radius angeben muss und dann das ergebniss A erscheint jedoch funktioniert das einfach nicht und ich hab keine ahnunh was ich falsch mache kann mir vllt jemand helfen??
Bild
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

`input()` liefert eine Zeichenkette zurück - auch, wenn du eine Zahl eingegeben hast. Das führt zu Problemen.

Zur Veranschaulichung:

Code: Alles auswählen

Python 3.3.0 (default, Sep 25 2013, 19:28:08) 
[GCC 4.7.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> eingabe = input('Bitte eine Zahl eingeben: ')
Bitte eine Zahl eingeben: 42
>>> eingabe
'42'
>>> type(eingabe)
<class 'str'>
>>> eingabe * eingabe
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'str'
>>> eingabe * 3.14
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
Du musst die Eingabe also erstmal in einen Zahlentyp umwandeln, damit du sinnvoll damit rechnen kannst.

EDIT: Der Grund, wieso die Fehlermeldung im ersten Moment etwas kryptisch erscheint, ist folgender:

Code: Alles auswählen

>>> 'x' * 5
'xxxxx'
>>> ['x'] * 5
['x', 'x', 'x', 'x', 'x']
>>> ['x'] * 5.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
Multiplikation mit Integern bedeutet in Python also, dass eine Sequenz (wie zum Beispiel ein String oder Liste) einfach vervielfältigt werden. Python will dir an der Stelle also sagen: "Du darfst deine Sequenz nicht mit etwas multiplizieren, was *kein* Integer ist". Python weiß an der Stelle eben nicht, was dein eigentliches Vorhaben ist und daher redet ihr sozusagen aneinander vorbei. ;)
Zuletzt geändert von snafu am Samstag 26. Oktober 2013, 20:49, insgesamt 1-mal geändert.
Benutzeravatar
JustHechi
User
Beiträge: 12
Registriert: Samstag 26. Oktober 2013, 20:14

Ja deswegen hab ich auch das den float dort eingesetzt aber es geht aus irgend einem grund nicht
oder bzw. wie wandel ich den ein string zum float um wenn ich R = input setze muss ich doch eigentlich nur float (r) eingeben aber das geht nicht....
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

`float(r)` sorgt nicht dafür, dass der Typ von `r` sich zu einem `float` verändert, sondern `float(r)` gibt einen `float` *zurück*. Was du wohl eigentlich willst, ist `r = float(r)`. Damit wird das neue `r` einfach zum Ergebnis der Rückgabe von der Typumwandlung. Mit anderen Worten: Erst dann befindet sich hinter `r` tatsächlich die `float`-Entsprechung deines Strings.
Benutzeravatar
JustHechi
User
Beiträge: 12
Registriert: Samstag 26. Oktober 2013, 20:14

perfekt funktionier vielen dank!
Benutzeravatar
JustHechi
User
Beiträge: 12
Registriert: Samstag 26. Oktober 2013, 20:14

Die Formeln konnte ich jetzt alle als code umsetzten jedoch funktioniert meine "interface" nicht wo sich der benutzer entscheiden muss was man berechnen möchte wollte es mit ner if-elif probieren aber klappt nicht
bzw.

Code: Alles auswählen

from math import pi
print ("Dieses Programm dient dem Berechnen von Volumen und Oberflaeche verschiedener Koerper und Flaechen!")

print (" a = Die Oberflaeche A einer Kugel, mit Radius r")
print (" b = Das Volumen V einer Kugel, mit Radius r")
print (" c = Das Volumen V fuer einen Kegel, mit Hoehe h und Radius r")
print (" d = Die Laenge s einer Mantellinie eines Kegels, mit Hoehe h und Radius r")
print (" e = Das Volumen V fuer einen Kegelstumpf mit Hoehe h, Deckflaechenradius r und Grundflaechenradius R")

I = input ("Bitte waehlen Sie was Sie berechnen moechten: ")

a = 1
b = 2

if I == 1:
    print ("klappt")
elif I == 2:
    print ("klappt2")
es wird nicht erkannt was eingegeben wurde
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, weil erneut der String "1" nicht das selbe ist wie die Zahl `1`... :roll:

Idealerweise sollte der Vergleich IMHO nen `TypeError` werfen, damit das Problem eher ins Auge fällt - tut er aber leider nicht.
BlackJack

@snafu: Dann bekommst Du aber Probleme mit so alltäglichen Sachen wie ``None`` als Wert für nichts oder mit Typen die sich zwar wie das Verhalten was man vergleicht, aber eben nicht den entsprechenden Typ haben.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@BlackJack: Welche Probleme soll ich denn mit `None` bekommen? Ich habe nicht vor, zu ermitteln, ob etwas größer, kleiner oder gleich `None` ist.

An den anderen Teil deiner Aussage hatte ich nicht gedacht. Klar, bei einer festen Vorgabe des (Eltern-)Typs würde man sich im Prinzip die Vorteile des Ducktypings kaputt machen. Also: Keine so gute Ideee. ;)
BlackJack

@snafu: Das *Du* das nicht vorhast, heisst ja nicht das andere das nicht machen. ;-) Wenn man explizit auf `None` prüft sollte man ``is`` nehmen, man muss es aber nicht. Zum Beispiel schreibe ich ``if None in iterable:`` wenn ich wissen will ob `None` in `iterable` vorkommt. Das müsste man dann zu ``if any(x is None for x in iterable):`` umschreiben. Noch blöder wird es wenn man auf etwas anderes testen will in einem iterierbaren Objekt was auch `None` enthalten kann. Dann kann man nämlich nicht mehr einfach ``if 42 in iterable:`` schreiben, sondern muss ``if any(x is not None and x == 42 for x in iterable):`` schreiben, damit das klappt. Und letztlich gilt das nicht nur für `None` sondern jedes `iterable` was nicht nur Daten von einem Typ enthält.

Letztlich stellt sich auch die Frage wie man so etwas umsetzen möchte. Entweder jeder Datentyp prüft in den Vergleichsmethoden erst den Typ des anderen Typs. Das müsste man dann auch bei eigenen Typen konsequent durchziehen, oder das ist fest in der Sprache verankert, dann ginge aber ``1 == 1.0`` nicht mehr weil das ja zwei verschiedene Typen sind. Hier müsste man sonst anfangen Vererbungshierarchien aufzubauen die es bis jetzt noch nicht gibt, oder irgendeine Art von Registrierung von vergleichbaren Typen schaffen.
Antworten