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:

Code: Alles auswählen

int(a) == a
a % 1 == 0
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

Code: Alles auswählen

isinstance(ZAHL, int)
wäre die funktion

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 16:29
von nomnom
JustinJ hat geschrieben:

Code: Alles auswählen

isinstance(ZAHL, int)

Code: Alles auswählen

>>> isinstance(1.0, int)
False
>>> 
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... :oops:

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 :P

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:

Code: Alles auswählen

if True:
    return True
else:
    return False
Warum dann nicht gleich:

Code: Alles auswählen

return erg == x
Oder warum nicht gleich:

Code: Alles auswählen

def is_integer(x):
    return x == int(x)
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! :mrgreen:

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