Перевірте, чи є число int чи float


199

Ось як я це зробив:

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

Щось схоже.
Чи є приємніші пошуки способів зробити це?


4
Хитрість полягає в тому, щоб шукати на SO всі інші випадки, коли це питання було задано. Кожен із них надасть повторення тієї ж, стандартної відповіді.
S.Lott

1
... А навіщо вам це знати?
Карл Кнечтел


@Wooble: не вдається для більшої кількості .
jfs

assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)було те, що я шукав, коли знайшов це запитання в Google.
Мартін Тома

Відповіді:


283

Використовуйте речовину .

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

Так:

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

x is a int!

_EDIT: _

Як зазначалося, у випадку довгих цілих чисел вищезазначене не буде працювати. Тому вам потрібно зробити:

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

не issubclassбуло б більш загальним?
Девід Геффернан

3
@David: issubclassбуде помилкою, оскільки це працює на класах. isinstanceперевіряє, чи даний об'єкт є екземпляром класу або одним з підкласів цього класу , тож він є абсолютно загальним. Methinks, що 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)
jtschoonhoven

93

Мені найбільше подобається відповідь @ ninjagecko.

Це також працює:

для Python 2.x

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

Python 3.x не має давно

isinstance(n, (int, float))

існує також тип комплексу для складних чисел


Зауваження, тому що булеві буде вирішувати True (наприклад isinstance(False, (int, float)) = True), мені потрібно not isinstance(n, bool) and isinstance(n, (int, float))замість
YTZ

54

Одноколісний:

isinstance(yourNumber, numbers.Real)

Це дозволяє уникнути деяких проблем:

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

Демонстрація:

>>> import numbers

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

>>> isinstance(someInt, numbers.Real)
True
>>> isinstance(someLongInt, numbers.Real)
True
>>> isinstance(someFloat, numbers.Real)
True

6
У Python 3 isinstance(99**10,int)є True.
Карлос А. Гомес

12

Простіше просити прощення, ніж просити дозволу. Просто виконайте операцію. Якщо він працює, об’єкт був прийнятного, придатного, належного типу. Якщо операція не працює, об'єкт не був відповідного типу. Знання типу рідко допомагає.

Просто спробуйте операцію і подивіться, чи працює вона.

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

5
Чи є причина , щоб зробити це , коли typeі isinstanceможуть зробити цю роботу?
user225312

9
int (1.5) не викликає ValueError, і ви, очевидно, знаєте, що - давати неправильну відповідь навмисно? Серйозно?
Гленн Мейнард

4
@Glenn: Я припускаю, що С.Лотт зрозумів питання як "перевірити, чи рядок є int чи float" (у такому випадку це насправді було б хорошим рішенням).

@AA : class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Вибачте за поганий синтаксис, але я не можу зробити більше в одному рядку.)
мг.

2
@AA: Так. Причина в тому, що це простіше і надійніше. Різниця між intі floatможе навіть не бути актуальним для багатьох алгоритмів. Запит на тип явно, як правило, є ознакою поганого поліморфізму або навіть більш серйозної проблеми дизайну. Коротко. Не перевіряйте види. Простіше просити прощення, ніж просити дозволу.
S.Lott

10

Що ви також можете зробити, використовуючи type() Приклад:

if type(inNumber) == int : print "This number is an int"
elif type(inNumber) == float : print "This number is a float"

1
У випадку [допустимо, рідкісного] цього випадку не вдасться, що вказане число є ПІДКЛЮЧЕННЮ int або float. (Отже, чому "істота" вважатиметься "кращою", IMO.)
Dan H

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 - це шлях

import numbers

isinstance(yourNumber, numbers.Real)

6

як щодо цього рішення?

if type(x) in (float, int):
    # do whatever
else:
    # do whatever

6

Я знаю, що це стара нитка, але це те, що я використовую, і я думав, що це може допомогти.

Він працює в 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
    """
    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))

5

Ви можете використовувати модуль, щоб визначити, чи x є цілим числом. 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. Про що говорити, Віллі (з | ранку)? Крім того, ви отримаєте, TypeErrorякщо x - це не число, для початку ваша програма вийде передчасно, якби ви дотримувались цієї поради ...
dylnmc

@dylnmc Тоді ви можете використовувати метод isin substance (), щоб визначити, чи x - це число. Також 3,2% 1 дає 0,2. Якщо число рівномірно ділиться на 1, воно є цілим числом. Цей метод був для мене корисним, навіть якщо він не був для вас.
Вільям Герекке

це правда; x%1 == 0має бути істинним лише для ints (але це також буде правдою для поплавків, що мають лише нуль після десяткової крапки). Якщо ви знаєте, що це буде int (наприклад, якщо це параметр функції), ви можете просто перевірити модуль. Б'юсь об заклад, що швидше, ніж Math.floor(x) == x. Що стосується не дуже яскравої сторони, це буде, Trueякщо ви передасте поплавок на кшталт 1.0або 5.0, і ви зіткнетесь з тією ж проблемою, використовуючи те, що в оригінальному плакаті було зазначено у його / її питанні.
dylnmc

5

Пробували в Python версії 3.6.3 Shell

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

Не вдалося зрозуміти, для чого працювати.


4

Просимо перевірити це: імпортувати номери

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

Хоча X є плаваючою, але значення є цілим, тому якщо ви хочете перевірити значення ціле, ви не можете використовувати isin substance, і вам потрібно порівняти значення, а не типи.



0

Оновлення: Спробуйте це


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)

Так, я зробив, і це не спрацювало. І я впевнений, що ви цього не дуже пробували. Тому що це не працює.
JJJ

Звичайно, є менш образливий спосіб реагувати. Хоча ти маєш рацію, я просто запускаю більше тестів, але це не працює в кожному випадку.
Маготта

@JJJ Як щодо цього рішення?
Маготта

0

Ви можете зробити це за допомогою простого оператора if

Щоб перевірити наявність поплавця

якщо тип (а) == тип (1.1)

Щоб перевірити цілісний тип

якщо тип (а) == тип (1)


-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

func перевіряє на ints, але також повертає true для поплавків, які є .0
Gideon Lytes

Поясніть, будь ласка, чому / як ваш внесок вирішує питання щодо ОП.
Хері

@Heri він хоче перевірити, чи є число int чи float, функція, яку я визначив, може це зробити, abs - це вбудований функція python, який повертає абсолютне значення числа, круглий також є вбудованим функцією, який округляє число, якщо я віднімаю округлене число від абсолютного, і я отримую нуль, то число є цілим, або воно має нуль, як після його десяткових знаків
Gideon Lytes


-5

variable.isnumeric перевіряє, чи значення є цілим числом:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.