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.
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.
@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
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
Ł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"exceptValueError:passtry:
inNumberfloat = float(inNumber)print"this number is a float"exceptValueError:pass
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"
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ą
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
"""returnnot(float(num)).is_integer()classTestIsFloat(unittest.TestCase):def test_float(self):
self.assertTrue(is_float(2.2))def test_int(self):
self.assertFalse(is_float(2))
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"
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ć.
import math
a =1.1-0.1print a
print isinstance(a, numbers.Integral)print math.floor( a )if(math.floor( a )== a):print"It is an integer number"else:printFalse
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.
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]isnotNoneand num[-1].isdigit():returnTrueelse:returnFalsefor 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)exceptExceptionas err:print(err)
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.
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
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
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.Odpowiedzi:
Użyj isinstance .
Więc:
_EDYTOWAĆ:_
Jak wskazano, w przypadku długich liczb całkowitych powyższe nie będzie działać. Więc musisz zrobić:
źródło
issubclass
byłby bardziej ogólny?issubclass
byłby błędem, ponieważ działa na klasach.isinstance
sprawdza, czy dany obiekt jest instancją klasy lub jedną z podklas tej klasy , więc jest całkowicie ogólny. Methinks, któryisinstance(obj, cls)
jest równoważny zissubclass(obj.__class__, cls)
x = 12L
. Wiem, że tylko oint
to poproszono, ale fajnie jest naprawić inne problemy, zanim się pojawią. Prawdopodobnie najbardziej ogólnyisinstance(x, numbers.Integral)
.isinstance(x, (int, long))
.isinstance(True, int)
Najbardziej podoba mi się odpowiedź @ ninjagecko.
Działa to również:
istnieje również typ złożony dla liczb zespolonych
źródło
isinstance(False, (int, float)) = True
),not isinstance(n, bool) and isinstance(n, (int, float))
Zamiast tego potrzebowałemJednowarstwowy:
Pozwala to uniknąć niektórych problemów:
Próbny:
źródło
isinstance(99**10,int)
jestTrue
.Ł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.
źródło
type
i kiedyisinstance
może to wykonać?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.)int
ifloat
moż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.Możesz także użyć
type()
Przykład:źródło
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.
Zauważ, że Python 2 ma oba typy
int
ilong
, podczas gdy Python 3 ma tylko typint
. Źródło .Jeśli chcesz sprawdzić, czy Twój numer
float
reprezentuje anint
, zrób toJeś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ą
źródło
co z tym rozwiązaniem?
źródło
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 <.
źródło
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:źródło
3.2 % 2
daje1.4
. O czym rozmawiasz, Willi (s | am)?TypeError
x%1 == 0
powinno 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,True
jeśli zdasz float typu1.0
lub5.0
, i napotkasz ten sam problem, używając tego, o czym wspomniał oryginalny plakat w swoim pytaniu.Próbowałem w wersji Python Shell 3.6.3
Nie udało mi się znaleźć czegoś, na co można by popracować.
źródło
proszę sprawdzić: importuj numery
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.
źródło
źródło
Aktualizacja: spróbuj tego
źródło
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)
źródło
źródło
Spróbuj tego...
źródło
variable.isnumeric
sprawdza, czy wartość jest liczbą całkowitą:źródło