ganze Zahlen Definieren

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.
Benutzeravatar
granpatomic
User
Beiträge: 6
Registriert: Sonntag 18. Oktober 2015, 13:19

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
Zuletzt geändert von Anonymous am Dienstag 20. Oktober 2015, 09:02, insgesamt 2-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

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:

Code: Alles auswählen

ergteilen = zahl1teilen // zahl2teile
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... :oops:
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
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
Benutzeravatar
granpatomic
User
Beiträge: 6
Registriert: Sonntag 18. Oktober 2015, 13:19

Danke für die vielen tollen antworten jetzt funktioniert es endlich!! :mrgreen: :mrgreen:
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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!
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
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 ;)
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.
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.
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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
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.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

IMHO ist das auch kein Pythonismus, solche boolschen "Flagmethoden" sieht man auch bei C++-APIs allerorten.
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.
Zuletzt geändert von rmp am Dienstag 20. Oktober 2015, 15:39, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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.
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. :-)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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