Sprawdź, czy liczba jest liczbą całkowitą czy zmienną

199

Oto jak to zrobiłem:

inNumber = somenumber
inNumberint = int(inNumber)
if inNumber == inNumberint:
    print "this number is an int"
else:
    print "this number is a float"

Coś w tym stylu.
Czy są na to ładniejsze sposoby?

Steinthor.palsson
źródło
4
Sztuką jest wyszukiwanie w SO wszystkich pozostałych czasów, w których pytanie było zadawane. Każdy z nich zapewni powtórzenie tej samej, standardowej odpowiedzi.
S.Lott,
1
... A dlaczego musisz wiedzieć?
Karl Knechtel
@Wooble: nie działa w przypadku większych liczb .
jfs
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)to było to, czego szukałem, gdy znalazłem to pytanie w Google.
Martin Thoma

Odpowiedzi:

283

Użyj isinstance .

>>> x = 12
>>> isinstance(x, int)
True
>>> y = 12.0
>>> isinstance(y, float)
True

Więc:

>>> if isinstance(x, int):
        print 'x is a int!'

x is a int!

_EDYTOWAĆ:_

Jak wskazano, w przypadku długich liczb całkowitych powyższe nie będzie działać. Więc musisz zrobić:

>>> x = 12L
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x, int)
False
użytkownik225312
źródło
nie issubclassbyłby bardziej ogólny?
David Heffernan
3
@David: issubclassbyłby błędem, ponieważ działa na klasach. isinstancesprawdza, czy dany obiekt jest instancją klasy lub jedną z podklas tej klasy , więc jest całkowicie ogólny. Methinks, który isinstance(obj, cls)jest równoważny zissubclass(obj.__class__, cls)
7
To nie działa w przypadku innych typów liczb całkowitych, na przykład if x = 12L. Wiem, że tylko o intto poproszono, ale fajnie jest naprawić inne problemy, zanim się pojawią. Prawdopodobnie najbardziej ogólny isinstance(x, numbers.Integral).
Scott Griffiths,
9
Dla Pythona 2, istnieje także bezpośredni dokładnie sprawdzić: isinstance(x, (int, long)).
Eric O Lebigot,
1
UWAGA: boole są również wystąpieniami liczb całkowitych. Zobaczisinstance(True, int)
jtschoonhoven
93

Najbardziej podoba mi się odpowiedź @ ninjagecko.

Działa to również:

dla Python 2.x

isinstance(n, (int, long, float)) 

Python 3.x nie ma długiego czasu

isinstance(n, (int, float))

istnieje również typ złożony dla liczb zespolonych

Dan H.
źródło
Sidenote, ponieważ booleany rozstrzygną się na True (np. isinstance(False, (int, float)) = True), not isinstance(n, bool) and isinstance(n, (int, float))Zamiast tego potrzebowałem
YTZ
54

Jednowarstwowy:

isinstance(yourNumber, numbers.Real)

Pozwala to uniknąć niektórych problemów:

>>> isinstance(99**10,int)
False

Próbny:

>>> import numbers

>>> someInt = 10
>>> someLongInt = 100000L
>>> someFloat = 0.5

>>> isinstance(someInt, numbers.Real)
True
>>> isinstance(someLongInt, numbers.Real)
True
>>> isinstance(someFloat, numbers.Real)
True
ninjagecko
źródło
6
W Python 3 isinstance(99**10,int)jest True.
Carlos A. Gómez
12

Łatwiej prosić o wybaczenie niż prosić o pozwolenie. Po prostu wykonaj operację. Jeśli to działa, obiekt był akceptowalnego, odpowiedniego, właściwego typu. Jeśli operacja nie działa, obiekt nie był odpowiedniego typu. Znajomość typu rzadko pomaga.

Po prostu spróbuj wykonać operację i sprawdź, czy działa.

inNumber = somenumber
try:
    inNumberint = int(inNumber)
    print "this number is an int"
except ValueError:
    pass
try:
    inNumberfloat = float(inNumber)
    print "this number is a float"
except ValueError:
    pass
S.Lott
źródło
5
Czy jest jakiś powód, aby to zrobić, kiedy typei kiedy isinstancemoże to wykonać?
user225312,
9
int (1.5) nie podnosi ValueError, a ty oczywiście wiesz o tym - celowo dając złą odpowiedź? Poważnie?
Glenn Maynard
4
@Glenn: Zakładam, że S.Lott rozumiał pytanie jako „sprawdź, czy łańcuch jest liczbą całkowitą czy zmienną ” (w którym to przypadku byłoby to dobre rozwiązanie).
@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Przepraszam za złą składnię, ale nie mogę zrobić więcej w jednym wierszu.)
mg.
2
@AA: Tak. Powodem jest to, że jest to prostsze i bardziej niezawodne. Rozróżnienie między inti floatmoże nawet nie być istotne w przypadku wielu algorytmów. Bezpośrednie podanie typu jest zwykle oznaką złego polimorfizmu lub jeszcze poważniejszego problemu projektowego. W skrócie. Nie sprawdzaj typów. Łatwiej prosić o przebaczenie niż prosić o pozwolenie.
S.Lott,
10

Możesz także użyć type() Przykład:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"
użytkownik274595
źródło
1
Nie zdarzyłoby się to w [co prawda rzadkim] przypadku, że liczba ta jest PODKLASĄ int lub float. (Dlatego dlaczego „isinstance” byłoby uważane za „lepsze”, IMO).
Dan H
7

Oto fragment kodu, który sprawdza, czy liczba jest liczbą całkowitą, czy nie, działa zarówno dla Python 2, jak i Python 3.

import sys

if sys.version < '3':
    integer_types = (int, long,)
else:
    integer_types = (int,)

isinstance(yourNumber, integer_types)  # returns True if it's an integer
isinstance(yourNumber, float)  # returns True if it's a float

Zauważ, że Python 2 ma oba typy inti long, podczas gdy Python 3 ma tylko typ int. Źródło .

Jeśli chcesz sprawdzić, czy Twój numer floatreprezentuje an int, zrób to

(isinstance(yourNumber, float) and (yourNumber).is_integer())  # True for 3.0

Jeśli nie musisz rozróżniać między liczbą całkowitą a liczbą zmiennoprzecinkową, i nie przeszkadza ci żadna z nich, odpowiedź ninjagecko jest właściwą drogą

import numbers

isinstance(yourNumber, numbers.Real)
Agostino
źródło
6

co z tym rozwiązaniem?

if type(x) in (float, int):
    # do whatever
else:
    # do whatever
krakowi
źródło
6

Wiem, że to stary wątek, ale używam tego i pomyślałem, że to może pomóc.

Działa w Pythonie 2.7 i Pythonie 3 <.

def is_float(num):
    """
    Checks whether a number is float or integer

    Args:
        num(float or int): The number to check

    Returns:
        True if the number is float
    """
    return not (float(num)).is_integer()


class TestIsFloat(unittest.TestCase):
    def test_float(self):
        self.assertTrue(is_float(2.2))

    def test_int(self):
        self.assertFalse(is_float(2))
Shahar
źródło
5

Możesz użyć modulo, aby ustalić, czy x jest liczbą całkowitą liczbowo. isinstance(x, int)Metoda oznaczania tylko wtedy, gdy x jest liczbą całkowitą od typu:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"
William Gerecke
źródło
3.2 % 2daje 1.4. O czym rozmawiasz, Willi (s | am)? TypeError
Otrzymasz
@dylnmc Następnie możesz użyć metody isinstance (), aby ustalić, czy x jest liczbą. Również 3,2% 1 daje 0,2. Jeśli liczba jest równomiernie podzielna przez 1, jest to liczba całkowita liczbowa. Ta metoda była dla mnie przydatna, chociaż mogła nie być dla Ciebie.
William Gerecke
to prawda; x%1 == 0powinno być prawdziwe tylko dla liczb całkowitych (ale będzie również prawdziwe dla liczb zmiennoprzecinkowych, w których tylko zero po przecinku). Jeśli wiesz, że będzie to int (np. Jeśli jest to parametr funkcji), możesz po prostu sprawdzić za pomocą modulo. Założę się, że jest szybszy niż Math.floor(x) == x. Po niezbyt jasnej stronie będzie to miało miejsce, Truejeśli zdasz float typu 1.0lub 5.0, i napotkasz ten sam problem, używając tego, o czym wspomniał oryginalny plakat w swoim pytaniu.
dylnmc,
5

Próbowałem w wersji Python Shell 3.6.3

>>> x = 12
>>> import numbers
>>> isinstance(x, numbers.Integral)
True
>>> isinstance(x,int)
True

Nie udało mi się znaleźć czegoś, na co można by popracować.

ella
źródło
4

proszę sprawdzić: importuj numery

import math

a = 1.1 - 0.1
print a 

print isinstance(a, numbers.Integral)
print math.floor( a )
if (math.floor( a ) == a):
    print "It is an integer number"
else:
    print False

Chociaż X jest zmiennoprzecinkowe, ale wartość jest liczbą całkowitą, więc jeśli chcesz sprawdzić, czy wartość jest liczbą całkowitą, nie możesz użyć isinstance i musisz porównać wartości, a nie typy.

M.Hefny
źródło
1
absolute = abs(x)
rounded = round(absolute)
if absolute - rounded == 0:
  print 'Integer number'
else:
  print 'notInteger number'
Ajay Prajapati
źródło
0

Aktualizacja: spróbuj tego


inNumber = [32, 12.5, 'e', 82, 52, 92, '1224.5', '12,53',
            10000.000, '10,000459', 
           'This is a sentance, with comma number 1 and dot.', '121.124']

try:

    def find_float(num):
        num = num.split('.')
        if num[-1] is not None and num[-1].isdigit():
            return True
        else:
            return False

    for i in inNumber:
        i = str(i).replace(',', '.')
        if '.' in i and find_float(i):
            print('This is float', i)
        elif i.isnumeric():
            print('This is an integer', i)
        else:
            print('This is not a number ?', i)

except Exception as err:
    print(err)
Magotte
źródło
Tak, zrobiłem i to nie zadziałało. I jestem pewien, że tak naprawdę tego nie próbowałeś. Ponieważ to nie działa.
JJJ
Z pewnością istnieje mniej obraźliwy sposób reagowania. Chociaż masz rację, po prostu przeprowadzam więcej testów, ale to nie działa w każdym przypadku.
Magotte
@JJJ Co powiesz na to rozwiązanie?
Magotte
0

Możesz to zrobić za pomocą prostej instrukcji if

Aby sprawdzić pływalność

jeśli typ (a) == typ (1.1)

Aby sprawdzić liczbę całkowitą

jeśli typ (a) == typ (1)

Alwyn Miranda
źródło
-1
def is_int(x):
  absolute = abs(x)
  rounded = round(absolute)
  if absolute - rounded == 0:
    print str(x) + " is an integer"
  else:
    print str(x) +" is not an integer"


is_int(7.0) # will print 7.0 is an integer
Gideon Lytes
źródło
func sprawdza ints, ale także zwraca true dla
liczb zmiennoprzecinkowych,
Wyjaśnij, dlaczego / jak twój wkład rozwiązuje pytanie dotyczące PO.
Heri
@Heri chce sprawdzić, czy liczba jest liczbą całkowitą czy zmiennoprzecinkową, funkcja, którą zdefiniowałem, może to zrobić, abs to wbudowana funkcja python, która zwraca wartość bezwzględną liczby, round jest również wbudowaną funkcją, która zaokrągla liczba, jeśli odejmę zaokrągloną liczbę od wartości bezwzględnej i otrzymam zero, to liczba jest liczbą całkowitą lub ma zero jak po swoich miejscach dziesiętnych
Gideon Lytes
-1

Spróbuj tego...

def is_int(x):
  absolute = abs(x)
  rounded = round(absolute)
  return absolute - rounded == 0
Ramkumar G.
źródło
-5

variable.isnumeric sprawdza, czy wartość jest liczbą całkowitą:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
osoba
źródło