funktion ob ergebnis ganzzahl ist

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.
dark123
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2012, 16:18

Hi,

gibt es eine funktion in python die erkennt ob ein ergebnis eine ganzzahl ist?


vielen dank schon mal
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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 …)
Zuletzt geändert von nomnom am Sonntag 15. Januar 2012, 16:33, insgesamt 1-mal geändert.
JustinJ
User
Beiträge: 14
Registriert: Sonntag 15. Januar 2012, 15:59

Code: Alles auswählen

isinstance(ZAHL, int)
wäre die funktion
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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. ;)
Zuletzt geändert von nomnom am Sonntag 15. Januar 2012, 16:34, insgesamt 2-mal geändert.
JustinJ
User
Beiträge: 14
Registriert: Sonntag 15. Januar 2012, 15:59

okay tut mir leid auf den fall hab ich nicht geachtet :(
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@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:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

float.is_integer() gibt es erst seit 2.6
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

@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 … ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
dark123
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2012, 16:18

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

Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

- 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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Modulo-Reste würde ich zwecks Nachvollziehbarkeit ja schon eher explizit auf Null testen...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

pillmuncher hat geschrieben:Warum? Oh, warum nur? :?
Weil heute Sonntag ist! :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
dark123
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2012, 16:18

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
dark123
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2012, 16:18

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.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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
Antworten