Seite 1 von 2
ganze Zahlen Definieren
Verfasst: Sonntag 18. Oktober 2015, 13:33
von granpatomic
Hallo ich bin 12 Jahre alt also entschuldigung erstmal für die vielleicht etwas dümmliche frage

Ich habe angefangen ein Matheprogramm zu schreiben mit dem man Mathe lernen kann jetzt will ich Teilen hinzufügen aber nur mit einem einem Ergebniss das eine Ganze ist sprich keine Komma zahlen jt weiss ich nicht wie ich das programmieren soll
Code: Alles auswählen
ergteilen = zahl1teilen/zahl2teile
if str(ergteilen).isdigit(int) == True:
aufgabenteilen = rechnenteilen()
aufgabenteilen.teilen_rechnen()
Das ist was ich gedacht hatte geht aber irgendwie nicht ;(
zahl1teilen und zahl2teilen sind übrigends zufallszahlen über random.randint
Re: gganze Zahlen Definieren
Verfasst: Sonntag 18. Oktober 2015, 13:51
von __deets__
hallo,
bitte benutze die code-tags hier im Forum, um deinen Code zu formatieren. Sonst geht gerade bei Python die wichtige Einrueckung verloren.
Welche Python-Version verwendest du denn? Ich vermute mal Python3, denn dort ist die Division standardmaessig die Fliesskomma-Division.
Um eine Ganzzahl-Division zu erzwingen, musst du dann einfach ein anderen Operator verwenden - den Doppel-Slash:
Und noch eine abschliessende Bemerkung: man vergleicht nicht mit "== True" - das ist naemlich doppelt-gemoppelt. Stattdessen genuegt ein einfach "if str(ergteilen).isdigit(int)" bzw. "if not str(ergteilen).isdigit(int)" wenn man auf das Gegenteil pruefen will.
[edit] wenn man vom Doppel-Slash redet, sollte man ihn auch benutzen...

Re: gganze Zahlen Definieren
Verfasst: Sonntag 18. Oktober 2015, 14:10
von Sirius3
@granpatomic: dass zwei zufällige Zahlen ganzzahlige Vielfache voneinander sind, ist doch recht unwahrscheinlich. Es ist viel einfacher, eine Divisonsaufgabe zu stellen, bei der Du weißt, dass das Ergebnis eine ganze Zahl ist.
Re: gganze Zahlen Definieren
Verfasst: Sonntag 18. Oktober 2015, 14:36
von BlackJack
@granpatomic: Gleitkommazahlen haben übrigens eine Methode `is_integer()`. Dazu muss man die nicht erst in eine Zeichenkette umwandeln und dann testen ob die einzelnen Zeichen Ziffern sind.
Code: Alles auswählen
In [39]: a = 23.5
In [40]: b = 42.0
In [41]: a.is_integer()
Out[41]: False
In [42]: b.is_integer()
Out[42]: True
Falls sie diese Methode nicht hätten wäre es auch einfacher die Gleitkommazahl umzuwandeln und dann zu prüfen ob die Werte noch gleich sind.
Code: Alles auswählen
In [43]: a == int(a)
Out[43]: False
In [44]: b == int(b)
Out[44]: True
Re: gganze Zahlen Definieren
Verfasst: Sonntag 18. Oktober 2015, 14:57
von granpatomic
Danke für die vielen tollen antworten jetzt funktioniert es endlich!!

Re: gganze Zahlen Definieren
Verfasst: Montag 19. Oktober 2015, 20:32
von Kebap
granpatomic hat geschrieben:Hallo ich bin 12 Jahre alt also entschuldigung erstmal für die vielleicht etwas dümmliche frage

Ich fand die Frage okay und wollte nur mal hallo sagen. Viel Spaß mit Python und hier im Forum!
Re: gganze Zahlen Definieren
Verfasst: Montag 19. Oktober 2015, 21:59
von rmp
__deets__ hat geschrieben:hallo,
Und noch eine abschliessende Bemerkung: man vergleicht nicht mit "== True" - das ist naemlich doppelt-gemoppelt. Stattdessen genuegt ein einfach "if str(ergteilen).isdigit(int)" bzw. "if not str(ergteilen).isdigit(int)" wenn man auf das Gegenteil pruefen will.
Da widerspreche ich, gerade bei einem Neuling. Ich rate dir, @granpatomic, es immer korrekt und voll auszuschreiben. Wenn du später mal in deinen Code guckst, dann ist "if str(ergteilen).isdigit(int)" ganz klar undeutlicher und missverständlicher als "if str(ergteilen).isdigit(int) == True". Bei einem Neuling würde ich sogar raten, Zuweisungen (denn das steckt implizit dahinter) und Test zu splitten. Wenn du schon Tipperei sparen willst, dann spare lieber an unnötigen Umwandlungen. Eine simple und hübsche Möglichkeit ist auch, das Problem ganz anders anzugehen , nämlich
Code: Alles auswählen
tmp = ergteilen - int(ergteilen) # int(ergteilen) gibt den Ganzzahl Anteil zurück, also z.B. 3 bei 3.14
if tmp != 0.0:
# 'ergteilen' ist keine Ganzzahl bzw. keine Fließkommazahl, die auf .0 endet
Programmieren und Mathe sind näher verwandt als mancher meint. Es macht also in jeden Fall Sinn, ein bisschen über die Problemstellung nachzudenken. Als simple Faustregel kann gelten: Je einfacher eine Lösung, desto besser (Code, der nicht da ist, kann auch nicht fehlerhaft sein) und: Eine gute Lösung ist meist auch eine elegante Lösung.
Viel Spass beim Üben und Lernen ;)
Re: gganze Zahlen Definieren
Verfasst: Montag 19. Oktober 2015, 22:12
von BlackJack
@rmp: Mit dem expliziten Test auf `True` oder `False` schwimmst Du ziemlich gegen den Strom. Insbesondere weil in Python ja auch oft ausgenutzt wird das nicht nur `True` oder `False` einen ”Wahrheitsgehalt” haben. Diese Spracheigenschaft wäre ja nutzlos wenn man sie nicht nutzen würde oder man nutzt sie und macht dann ausgerechnet bei `True` und `False` eine Ausnahme. Ausserdem eröffnet man damit mehr Wege etwas auszudrücken für das es eigentlich *einen* offensichtlichen Weg geben sollte, denn ``a == False`` könnte man auch als ``a != True`` ausdrücken und ``a == True`` auch als ``a != False``. Wenn man den expliziten Test nicht macht hat man ``a`` und ``not a`` und das war's.
Das mit dem abziehen ist indirekter als das ``if a != int(a):`` was schon als alternative vorgeschlagen wurde. Aber ``if not a.is_integer():`` ist wohl nicht zu schlagen was den „one obvious way” angeht, denn genau für diesen Test gibt es die Methode.
Re: gganze Zahlen Definieren
Verfasst: Montag 19. Oktober 2015, 22:40
von rmp
Gegen den Strom schwimmen ist mir völlig schnurz. Ich habe genug bugs im Leben gesehen, die durch "schlaue" Abkürzungen kamen. Und ich habe genug Schei**e gesehen, die mehrheitsfähig und üblich war.
Der TE sagt, er sei 12 und er scheint noch neu im Programmieren zu sein. Abkürzungen kann er später nehmen (und noch viel später verstehen, dass sie unklug sind. Bei mir hat's auch 20 Jahre gedauert *g). Erst mal wird er zweifellos davon profitieren, stringent zu programmieren.
Über "if not a.is_integer():" diskutiere ich nicht; das ist wohl eine Sache der Sicht und ich verstehe, wenn Python Puristen gerne ihre Sprache mit allen features ausschöpfen. Mein Fokus hier war a) auf den Anfänger gerichtet und b) aus Lesbarkeit und Offensichtlichkeit und c) auf den direkten mathematischen Bezug.
Soll er sich einfach aussuchen, was ihm schmeckt.
Re: gganze Zahlen Definieren
Verfasst: Montag 19. Oktober 2015, 23:27
von BlackJack
@rmp: Hier geht es nicht um Abkürzungen sondern darum etwas nicht unnötig lang zu schreiben in dem man zusätzliche unnötige Operationen einbaut.
Es sollte einen offensichtlichen Weg geben der verwendet wird. Und um eine Gleitkommazahl darauf zu prüfen ob sie eine ganze Zahl ist, wird die `is_integer()`-Methode angeboten.
Re: gganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 07:56
von Sirius3
@rmp: etwas klareres und lesbareres als "if not a.is_integer():" gibt es ja kaum, es ist zwar ein bißchen ein holpriges Englisch, aber auch jemand der nicht Programmieren kann, würde es wohl verstehen. Gerade bei is_xxx-Funktionen ist ja mehr als eindeutig, dass ein Wahrheitswert abgefragt werden soll. Und warum sollte eine unnötige Zuweisung lesbarer werden. Klar wenn eine Zeile zu lang wird, leidet die Lesbarkeit, aber ein "tmp" ist das genaue Gegenteil von lesbar.
Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 12:57
von rmp
granpatomic hat geschrieben:Hallo
Ich habe angefangen ein Matheprogramm zu schreiben mit dem man Mathe lernen kann ...
Ich bin nicht als Python Evangelist unterwegs. Dem TE ging es zumindest auch wesentlich um Mathe. Also habe ich ihm einen Ansatz vorgeschlagen, der diesen Aspekt mit im Blick hatte.
Euer is_integer() ist nützlich und wunderbar - und ein Pythonismus. Ihr könnt 3 mal recht haben damit aus Pythonsicht, aber dem TE wird's sicher nicht schaden, noch andere Ansätze zu sehen.
Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 13:03
von /me
rmp hat geschrieben:Euer is_integer() ist nützlich und wunderbar - und ein Pythonismus.
Dies ist ein Python-Forum, es geht um Python-Fragen und damit sollten dann auch "pythonische" Ansätze gewählt werden.
Ich habe genug Java-Entwickler gesehen die ihre Konzepte auf Python übertragen haben und das alles viel zu umständlich fanden und im Endeffekt damit gescheitert sind. Man sollte mit einer Sprache programmieren, nicht gegen sie.
Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 13:05
von cofi
Ok, also dein Argument ist, dass es sinnvoll ist wenn man in Python kein Python schreibt, sondern andere Sprachen abbildet?
Der TE lernt und schreibt Python, dann sollte das Ziel doch eben sein zu lernen wie man es in Python schreiben sollte.
Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 13:27
von jerch
IMHO ist das auch kein Pythonismus, solche boolschen "Flagmethoden" sieht man auch bei C++-APIs allerorten.
Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 15:35
von rmp
... und hinter solchen "Flagmethoden" steckt entweder ein AST lookup oder ein Test à la "return (x - int(x)) 0 : 1)" oder ein simpler cast "gib einfach den integer Anteil zurück".
Python source (./Objects/floatobject.c):
Code: Alles auswählen
static PyObject *
float_is_integer(PyObject *v)
{
// ...
double x = PyFloat_AsDouble(v);
// ...
o = (floor(x) == x) ? Py_True : Py_False;
// ...
return o;
}
ist das, was ich eben beschrieb. floor ist convenience für "x - int(x)". Na sowas. Scheint ganz, als ob ich gar nicht so un-Python-istisch denken würde und obendrein noch wüsste, wovon ich rede. Entschuldigung.
Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 15:38
von cofi
Und hinter allem steckt eine Binaer-Repraesentation. Was ist dein Punkt?
Wir bewegen uns auf der Abstraktionsebene von Python, der Programmiersprache, nicht auf denen darunter.
Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 15:43
von rmp
Danke, cofi
für die Bestätigung, dass es hier nicht um ein Sachthema geht oder um richtig/falsch, sondern einfach nur um Rudelspielchen. Aber ist OK, ich verstehe ja, dass es peinlich ist, in der Sache keine Argumente zu haben und dass Ihr ja schlecht gegen den Python Sourcecode anstinken könnt.
Spielt eure Kleingärtner Kinderspielchen ohne mich. Angenehmen Aufenthalt noch, allerseits.
Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 16:34
von BlackJack
@rmp: Doch es geht um das Sachthema und das ist wie man das in Python ausdrückt und nicht wie es eine Ebene tiefer ausgedrückt wird. Von Dir kommen als ”Argumente” das Dir egal ist ob das in Python so gemacht wird und das hier alles Rudelspielchen seien, weil Du sachlich keine Argumente hast.
Was soll das überhaupt? Dein ``x - int(x) == 0.0`` wurde in Form von ``x == int(x)`` bereits vorher schon gezeigt. Zusätzlich zu dem Hinweis das es die extra dafür vorgesehene Methode gibt. Das wo Du Dich jetzt dran aufhängst ist das sich das Rudel ans Python-Zen erinnert und sich alle über den einen offensichtlichen Weg einig sind und das auch einem Programmieranfänger mitteilt? Nochmal: Alternativen wurden auch genannt, es wurde also nicht einfach nur der eine Weg propagiert und alles andere totgeschwiegen.
Ein Vorteil die vorgesehene Methode zu verwenden ist übrigens auch das man sich um Fehler keine Gedanken machen muss weil da schon jemand anders drüber nachgedacht hat. Alle Ansätze mit `int()` haben nämlich das Problem das sie nicht mit dem gesamten Wertebereich funktionieren, die `is_integer()`-Methode aber schon. Die Randfälle bei denen eine Lösung mit `int()` nicht funktioniert überlasse ich dem geneigten Leser als Übung.

Re: ganze Zahlen Definieren
Verfasst: Dienstag 20. Oktober 2015, 17:35
von jerch
rmp hat geschrieben:... und hinter solchen "Flagmethoden" steckt entweder ein AST lookup oder ein Test à la "return (x - int(x)) 0 : 1)" oder ein simpler cast "gib einfach den integer Anteil zurück".
Was Du hier beschreibst, ist ein Implementationsdetail von XY. Darauf zu setzen ist in OOP nie eine gute Idee. Darum baut man ja APIs, in C++ oder Java sind dann auch häufig private Member involviert, womit Dein "äusserer" Test so nicht mehr möglich ist.