Хитрость заключается в том, чтобы искать в SO все остальные моменты, когда задавался этот вопрос. Каждый из них даст повторение того же стандартного ответа.
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)было то, что я искал, когда я нашел этот вопрос с Google.
@ Дэвид: issubclassбыло бы ошибкой, так как он работает на классах. isinstanceпроверяет, является ли данный объект экземпляром класса или одного из подклассов этого класса , поэтому он совершенно универсален. Метинкс, что isinstance(obj, cls)эквивалентноissubclass(obj.__class__, cls)
7
Это не работает для других целочисленных типов, например, если x = 12L. Я знаю, что только intпросили, но хорошо, чтобы исправить другие проблемы, прежде чем они случаются. Вероятно, самый общий isinstance(x, numbers.Integral).
Скотт Гриффитс
9
Для Python 2, есть также прямая двойная проверка: isinstance(x, (int, long)).
Эрик О Лебиго
1
ВНИМАНИЕ: bools также являются экземплярами целых чисел. Смотритеisinstance(True, int)
Замечание, потому что булевы будет решать True (например isinstance(False, (int, float)) = True), мне нужно not isinstance(n, bool) and isinstance(n, (int, float))вместо
Проще просить прощения, чем просить разрешения. Просто выполните операцию. Если это работает, объект имел приемлемый, подходящий, правильный тип. Если операция не работает, объект не подходящего типа. Знание типа редко помогает.
Просто попробуйте выполнить операцию и посмотрите, работает ли она.
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
Есть ли причина делать это, когда typeи isinstanceможете сделать работу?
user225312
9
int (1.5) не вызывает ValueError, и вы, очевидно, знаете это - нарочно дают неправильный ответ? Шутки в сторону?
Гленн Мейнард
4
@Glenn: я предполагаю, что С.Лотт понимал вопрос как «проверил, является ли строка целым числом или числом с плавающей точкой» (в этом случае это было бы действительно хорошим решением).
@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Извините за плохой синтаксис, но я не могу сделать больше в одной строке.)
мг.
2
@АА: да. Причина в том, что это проще и надежнее. Различие между intи floatможет даже не иметь отношения ко многим алгоритмам. Запрос типа явно является признаком плохого полиморфизма или еще более серьезной проблемы проектирования. Коротко. Не проверяйте типы. Прощать проще, чем спрашивать разрешения.
С.Лотт
10
То, что вы тоже можете сделать, это использовать type()
Пример:
if type(inNumber)== int :print"This number is an int"elif type(inNumber)== float :print"This number is a float"
Это потерпит неудачу в [по общему признанию редком] случае, когда рассматриваемое число является ПОДКЛАССОМ int или float. (Отсюда, почему «isinstance» будет считаться «лучше», ИМО.)
Дэн Х
7
Вот фрагмент кода, который проверяет, является ли число целым числом или нет, он работает как для Python 2, так и для 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
Обратите внимание, что Python 2 имеет оба типа intи long, в то время как Python 3 имеет только тип int. Источник .
Если вы хотите проверить, является ли ваш номер floatзнаком int, сделайте это
(isinstance(yourNumber, float)and(yourNumber).is_integer())# True for 3.0
Если вам не нужно различать int и float, и вы согласны с любым из них, то ответ ninjagecko - это путь
Я знаю, что это старая тема, но это то, что я использую, и я подумал, что это может помочь.
Он работает в Python 2.7 и Python 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))
Вы можете использовать модуль по модулю, чтобы определить, является ли х целым числом численно. isinstance(x, int)Метод определяет только тогда , когда х обозначает целое число от типа:
def isInt(x):if x%1==0:print"X is an integer"else:print"X is not an integer"
3.2 % 2доходность 1.4. Что ты говоришь, Вилли? Кроме того, вы получите a, TypeErrorесли x не является числом для начала, поэтому ваша программа преждевременно завершит работу, если вы последуете этому совету ...
dylnmc
@dylnmc Затем вы можете использовать метод isinstance (), чтобы определить, является ли x числом. Также 3,2% 1 дает 0,2. Если число делится на 1 равномерно, оно является целым числом. Этот метод был полезен для меня, даже если он не был для вас.
Уильям Гереке
это верно; x%1 == 0должно быть истинным только для целых чисел (но это также будет верно для чисел с плавающей запятой только с нулем после десятичной точки). Если вы знаете, что это будет int (например, если это параметр функции), то вы можете просто проверить по модулю. Могу поспорить, что это быстрее, чем Math.floor(x) == x. С не очень яркой стороны, это будет, Trueесли вы передадите поплавок, похожий на 1.0или 5.0, и вы столкнетесь с той же проблемой, используя то, что оригинальный постер упомянул в своем вопросе.
17
5
Пробовал в Python версии 3.6.3 Shell
>>> x =12>>>import numbers
>>> isinstance(x, numbers.Integral)True>>> isinstance(x,int)True
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
Хотя X - это число с плавающей точкой, но значение является целым числом, поэтому, если вы хотите проверить, что значение является целым числом, вы не можете использовать isinstance, и вам нужно сравнивать значения, а не типы.
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)
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
func проверяет целочисленные значения, но также возвращает true для чисел с плавающей точкой .0
Gideon Lytes
Пожалуйста, объясните, почему / как ваш вклад решает вопрос ОП.
Хери
@ Привет, он хочет проверить, является ли число целым или плавающим, определенная мной функция может это сделать, abs - это встроенный python-функция, которая возвращает абсолютное значение числа, round - также встроенный, который округляет число, если я вычтю округленное число из абсолютного и получу ноль, то число будет целым, или у него будет ноль, как после десятичных разрядов
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)
было то, что я искал, когда я нашел этот вопрос с Google.Ответы:
Используйте isinstance .
Так:
_РЕДАКТИРОВАТЬ:_
Как указано, в случае длинных целых чисел вышеприведенное не сработает. Так что вам нужно сделать:
источник
issubclass
будет более общим?issubclass
было бы ошибкой, так как он работает на классах.isinstance
проверяет, является ли данный объект экземпляром класса или одного из подклассов этого класса , поэтому он совершенно универсален. Метинкс, чтоisinstance(obj, cls)
эквивалентноissubclass(obj.__class__, cls)
x = 12L
. Я знаю, что толькоint
просили, но хорошо, чтобы исправить другие проблемы, прежде чем они случаются. Вероятно, самый общийisinstance(x, numbers.Integral)
.isinstance(x, (int, long))
.isinstance(True, int)
Мне больше всего нравится ответ @ ninjagecko.
Это также будет работать:
есть также комплекс типа для комплексных чисел
источник
isinstance(False, (int, float)) = True
), мне нужноnot isinstance(n, bool) and isinstance(n, (int, float))
вместоОдин лайнер:
Это позволяет избежать некоторых проблем:
Демо-версия:
источник
isinstance(99**10,int)
естьTrue
.Проще просить прощения, чем просить разрешения. Просто выполните операцию. Если это работает, объект имел приемлемый, подходящий, правильный тип. Если операция не работает, объект не подходящего типа. Знание типа редко помогает.
Просто попробуйте выполнить операцию и посмотрите, работает ли она.
источник
type
иisinstance
можете сделать работу?class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int
. (Извините за плохой синтаксис, но я не могу сделать больше в одной строке.)int
иfloat
может даже не иметь отношения ко многим алгоритмам. Запрос типа явно является признаком плохого полиморфизма или еще более серьезной проблемы проектирования. Коротко. Не проверяйте типы. Прощать проще, чем спрашивать разрешения.То, что вы тоже можете сделать, это использовать
type()
Пример:источник
Вот фрагмент кода, который проверяет, является ли число целым числом или нет, он работает как для Python 2, так и для Python 3.
Обратите внимание, что Python 2 имеет оба типа
int
иlong
, в то время как Python 3 имеет только типint
. Источник .Если вы хотите проверить, является ли ваш номер
float
знакомint
, сделайте этоЕсли вам не нужно различать int и float, и вы согласны с любым из них, то ответ ninjagecko - это путь
источник
как насчет этого решения?
источник
Я знаю, что это старая тема, но это то, что я использую, и я подумал, что это может помочь.
Он работает в Python 2.7 и Python 3 <.
источник
Вы можете использовать модуль по модулю, чтобы определить, является ли х целым числом численно.
isinstance(x, int)
Метод определяет только тогда , когда х обозначает целое число от типа:источник
3.2 % 2
доходность1.4
. Что ты говоришь, Вилли? Кроме того, вы получите a,TypeError
если x не является числом для начала, поэтому ваша программа преждевременно завершит работу, если вы последуете этому совету ...x%1 == 0
должно быть истинным только для целых чисел (но это также будет верно для чисел с плавающей запятой только с нулем после десятичной точки). Если вы знаете, что это будет int (например, если это параметр функции), то вы можете просто проверить по модулю. Могу поспорить, что это быстрее, чемMath.floor(x) == x
. С не очень яркой стороны, это будет,True
если вы передадите поплавок, похожий на1.0
или5.0
, и вы столкнетесь с той же проблемой, используя то, что оригинальный постер упомянул в своем вопросе.Пробовал в Python версии 3.6.3 Shell
Не могу понять, на что работать.
источник
пожалуйста, проверьте это: импорт номеров
Хотя X - это число с плавающей точкой, но значение является целым числом, поэтому, если вы хотите проверить, что значение является целым числом, вы не можете использовать isinstance, и вам нужно сравнивать значения, а не типы.
источник
источник
Обновление: попробуйте это
источник
Вы можете сделать это с помощью простого оператора if
Для проверки поплавка
если тип (а) == тип (1.1)
Для проверки целочисленного типа
если тип (а) == тип (1)
источник
источник
Попробуй это...
источник
variable.isnumeric
проверяет, является ли значение целым числом:источник