Seite 1 von 2
funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:20
von dark123
Hi,
gibt es eine funktion in python die erkennt ob ein ergebnis eine ganzzahl ist?
vielen dank schon mal
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:26
von nomnom
nein, aber du kannst das z.b. so überprüfen:
Wobei Version zwei effizienter ist (zumindest ist es 4× so schnell …)
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:27
von JustinJ
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:29
von nomnom
Und der Thread-Ersteller wird wohl kaum mit
ints rechnen, wenn er herausfinden will, ob eine Zahl eine Ganzzahl ist.

Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:30
von JustinJ
okay tut mir leid auf den fall hab ich nicht geachtet

Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:44
von cofi
Fuer Floats gibt es noch die `is_integer` Methode
Code: Alles auswählen
In [1]: f = 1.0
In [2]: f.is_integer()
Out[2]: True
In [3]: f = 2.3
In [4]: f.is_integer()
Out[4]: False
mit der die Absicht klarer wird.
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:47
von Hyperion
@nomnom: Deine Ansätze sollte man aber in eine Funktion "is_integer" verpacken, damit der Sinn dahiner erkennbar bleibt - wobei Python das schon eingebaut hat für floats:
Code: Alles auswählen
In [7]: value = 1.234
In [8]: value.is_integer()
Out[8]: False
In [9]: value = 1.0
In [10]: value.is_integer()
Out[10]: True
Edit: Mist, cofi war schneller...

Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:47
von DasIch
float.is_integer() gibt es erst seit 2.6
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:57
von nomnom
@Hyperion und cofi:
Die Methode kannte ich noch nicht. Google findet das auch nicht, wenn man nach
python is integer sucht … Man findet die Seite, allerdings muss man die Seite dann auch noch absuchen …

Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 16:58
von Hyperion
nomnom hat geschrieben:@Hyperion und cofi:
Die Methode kannte ich noch nicht. Google findet das auch nicht, wenn man nach
python is integer sucht … Man findet die Seite, allerdings muss man die Seite dann auch noch absuchen …

Ich habe einfach mal in der Shell drauf los getippert - ipython sei dank, bekommt man das sofort angezeigt

Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 17:07
von dark123
ich hätte dazu schreiben sollen das ich das ganze in sage machen will. da funktioniert is_integer scheinbar nicht.
ich habs jetzt so gelöst:
Code: Alles auswählen
def is_natural(x):
y = x
erg = int(x)
if(erg == x):
return true
else: return false
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 17:17
von Hyperion
- Wieso bindest Du `x` an einen neuen Namen (`y`)?
- Wieso benutzt Du einmal eine neue Zeile für den if-Zweig und beim else-Zweig nicht?
- Wieso bindest Du `int(x)` an einen Namen, wenn Du diesen nur einmal nutzt?
- Wieso benutzt Du Klammern bei der if-Bedingung?
- Wieso benennst Du das ganze nicht in Anlehnung an die float-Methode?
Code: Alles auswählen
def is_integer(x):
if int(x) == x:
return true
else:
return false
# oder kompakter:
def is_integer(x):
return int(x) == x
# und vermutlich effizienter:
def is_integer(x):
return not x % 1
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 17:19
von pillmuncher
Warum? Oh, warum nur?
dark123 hat geschrieben:Code: Alles auswählen
def is_natural(x):
y = x # das führt zwar einen neuen Namen (y) ein, aber das referenzierte Objekt bleibt dasselbe.
# Python kopiert Werte nicht bei einer Zuweisung. Außerdem wird y nirgends mehr verwendet.
erg = int(x) # Das hättest du schon eine Zeile weiter oben machen können
if(erg == x): # Lass die Klammern weg, die sind in Python nicht nötig.
return true # Es muss True heißen, nicht true.
else: return false # Es muss False heißen, nicht false.
Außerdem wird erg == x zu True oder False ausgewertet, Du schreibst also letzlich sowas wie:
Warum dann nicht gleich:
Oder warum nicht gleich:
Zudem solltest du 4 Leerzeichen pro Einrückungsebene verwenden. Das würde es übersichtlicher machen.
Und Hyperion hat recht, seine Version ist vemutlich besser.
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 17:21
von Hyperion
pillmuncher hat geschrieben:
Und Hyperion hat recht, seine Version ist vemutlich besser.
Damit ich mich nicht mit fremden Federn schmücke: nomnom hatte das vorgeschlagen

Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 17:21
von snafu
Modulo-Reste würde ich zwecks Nachvollziehbarkeit ja schon eher explizit auf Null testen...
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 17:36
von Hyperion
pillmuncher hat geschrieben:Warum? Oh, warum nur?
Weil heute Sonntag ist!

Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 17:41
von dark123
stimmt. das y brauch ich nicht.
und die return true bwz false kann ich mir auch sparen. hab das alles nur
schnell geschrieben ohne gross nachzudenken
nur:
def is_integer(x):
return not x % 1
funktioniert nicht. das liefert nämlich immer true.
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 17:47
von Hyperion
Bitte verwende doch die Code-Tags, wenn Du Quellcode postest. Für Python-Code die speziellen Python-Code-Tags!
dark123 hat geschrieben:
funktioniert nicht. das liefert nämlich immer true.
Bei mir klappt es. Wie hast Du das getestet? Die einzige Erklärung wäre die, dass `sage` anders castet, als ein normales Python das tun würde.
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 18:04
von dark123
ja habs in sage getestet:
Code: Alles auswählen
definition:
def is_integer(x):
return not x % 1
aufruf:
test = 2/3
is_integer(test)
evaluate:
True
das war auch der grund, wieso ich nach einer funktion gesucht habe.
Re: funktion ob ergebnis ganzzahl ist
Verfasst: Sonntag 15. Januar 2012, 18:06
von nomnom
Weißt du, was Sage berechnet, wenn du
2/3 schreibst?

Das ist eine Ganzzahl-Division, und weil die drei nicht in die zwei passt, kommt dabei null raus. Wenn du wirklich
zwei drittel berechnen willst, musst du mindestens eine der Zahlen als
float angeben:
Code: Alles auswählen
In [1]: 2/3
Out[1]: 0
In [2]: 2.0/3
Out[2]: 0.6666666666666666