Bir sayının int veya float olup olmadığını kontrol edin


200

İşte böyle yaptım:

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

Bunun gibi bir şey.
Bunu yapmanın daha hoş bir yolu var mı?


4
İşin püf noktası, bu soru sorulan diğer zamanlarda SO'da arama yapmaktır. Bunların her biri aynı standart cevabın tekrarını sağlayacaktır.
S.Lott

1
... Ve neden bilmen gerekiyor?
Karl Knechtel


@Wooble: büyük sayılar için başarısız olur .
jfs

assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)Google ile bu soruyu bulduğumda aradığım şey buydu.
Martin Thoma

Yanıtlar:


286

İsinstance kullanın .

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

Yani:

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

x is a int!

_DÜZENLE:_

Belirtildiği gibi, uzun tamsayılarda, yukarıdaki işe yaramaz. Yani yapmanız gerekenler:

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

issubclassdaha genel olmaz mıydı ?
David Heffernan

3
@David: issubclasssınıflar üzerinde çalıştığı için bir hata olur. isinstancebelirli bir nesnenin bir sınıfın örneği mi yoksa o sınıfın alt sınıflarından biri mi olduğunu kontrol eder ; Galiba isinstance(obj, cls)eşdeğerdirissubclass(obj.__class__, cls)

7
Bu, örneğin tamsayı türleri için çalışmaz x = 12L. Sadece intistendiğini biliyorum , ama gerçekleşmeden önce diğer sorunları düzeltmek güzel. En genel olanı muhtemelen isinstance(x, numbers.Integral).
Scott Griffiths

9
Python 2 için, aynı zamanda doğrudan çifte kontrol vardır: isinstance(x, (int, long)).
Eric O Lebigot

1
UYARI: bools da tamsayıların örnekleridir. Bkz.isinstance(True, int)
jtschoonhoven

96

@ Ninjagecko'nun cevabını en çok seviyorum.

Bu da işe yarar:

Python 2.x için

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

Python 3.x uzun sürmedi

isinstance(n, (int, float))

orada da yazın olduğu karmaşık karmaşık sayılar için


Bir sidenote, çünkü boolelar True (örneğin isinstance(False, (int, float)) = True) olarak çözülecek , not isinstance(n, bool) and isinstance(n, (int, float))bunun yerine ihtiyacım vardı
YTZ

54

Tek astarı:

isinstance(yourNumber, numbers.Real)

Bu bazı sorunları önler:

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

Demo:

>>> 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 de isinstance(99**10,int)öyle True.
Carlos A. Gómez

12

Affetmek, izin istemekten daha kolaydır. Sadece işlemi gerçekleştirin. Çalışırsa, nesne kabul edilebilir, uygun, uygun bir türdeydi. İşlem çalışmazsa, nesne uygun türde değildi. Türü bilmek nadiren yardımcı olur.

Sadece işlemi deneyin ve çalışıp çalışmadığına bakın.

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
İşi ne zaman typeve isinstanceyapabileceğini yapmak için herhangi bir neden var mı ?
user225312

9
int (1.5) ValueError değerini yükseltmez ve açıkça biliyorsunuz - bilerek yanlış bir cevap vermek? Ciddi anlamda?
Glenn Maynard

4
@Glenn: S.Lott'un soruyu "bir stringin int veya float olup olmadığını kontrol et" olarak anladığını varsayıyorum (bu durumda aslında iyi bir çözüm olacaktır).

@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Kötü sözdizimi için özür dilerim, ancak bir satırda daha fazlasını yapamam.)
mg.

2
@AA: Evet. Nedeni, bunun daha basit ve daha güvenilir olmasıdır. Arasındaki ayrım intve floathatta pek çok algoritma için geçerli olmayabilir. Tipin açıkça talep edilmesi genellikle kötü polimorfizmin veya daha ciddi bir tasarım probleminin işaretidir. Kısacası. Türleri Kontrol Etmeyin. Affetmek, İzin Vermekten Daha Kolaydır.
S.Lott

10

Siz de ne yapabilirsiniz type() Örnek:

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

1
[Kuşkusuz nadiren] söz konusu sayının int veya float ın SUBCLASS olması durumunda bu başarısız olur. (Dolayısıyla "isinstance" neden "daha iyi" olarak kabul edilir, IMO.)
Dan H

7

İşte bir sayının tamsayı olup olmadığını kontrol eden bir kod parçası, hem Python 2 hem de Python 3 için çalışır.

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'de her iki türün intve longPython 3'te yalnızca türün bulunduğuna dikkat edin int. Kaynak .

Numaranızın floata'yı temsil eden bir sayı olup olmadığını kontrol etmek istiyorsanız int, bunu yapın

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

İnt ve float arasında ayrım yapmanız gerekmiyorsa ve ikisinde de sorun yoksa, ninjagecko'nun cevabı gitmenin yolu

import numbers

isinstance(yourNumber, numbers.Real)

6

bu çözüme ne dersin?

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

6

Eski bir iş parçacığı olduğunu biliyorum ama bu kullandığım bir şey ve ben yardımcı olabilir düşündüm.

Python 2.7 ve python 3 <'de çalışır.

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'in sayısal olarak bir tam sayı olup olmadığını belirlemek için modulo kullanabilirsiniz. isinstance(x, int)X türü bir tam sayı olduğu, bu yöntem, sadece belirler:

def isInt(x):
    if x%1 == 0:
        print "X is an integer"
    else:
        print "X is not an integer"

3.2 % 2verim 1.4. Ne diyorsun, Willi (s | am)? Ayrıca, TypeErroreğer x ile başlamak için bir sayı değilse, bu tavsiyeye
uyursanız

@dylnmc Daha sonra x'in bir sayı olup olmadığını belirlemek için isinstance () yöntemini kullanabilirsiniz. Ayrıca% 3.2 1, 0.2 verir. Bir sayı 1 ile eşit olarak bölünebiliyorsa, sayısal olarak bir tamsayıdır. Bu yöntem sizin için olmasa bile benim için yararlı oldu.
William Gerecke

Bu doğru; x%1 == 0yalnızca ints için geçerli olmalıdır (ancak ondalık noktasını takip eden yalnızca sıfır olan şamandıralar için de geçerli olacaktır). Bunun bir int olacağını biliyorsanız (örneğin, bu bir işlevin parametresi ise), o zaman sadece modulo ile kontrol edebilirsiniz. Eminim bundan daha hızlıdır Math.floor(x) == x. Değil çok parlak tarafında, bu olacak Truesen gibi bir float geçirirseniz 1.0veya 5.0ve özgün afiş onun / onun sorudaki neyi kullanarak aynı sorunla karşılaşacak.
dylnmc

5

Python 3.6.3 Kabuğu'nda denendi

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

Çalışacak bir şey bulamadım.


4

pls bunu kontrol edin: ithalat numaraları

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 float olsa da değer tamsayı olsa da, değerin tamsayı olup olmadığını kontrol etmek isterseniz isinstance değerini kullanamazsınız ve tür değil değerleri karşılaştırmanız gerekir.


1
absolute = abs(x)
rounded = round(absolute)
if absolute - rounded == 0:
  print 'Integer number'
else:
  print 'notInteger number'

0

Güncelleme: Bunu deneyin


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)

Evet yaptım ve işe yaramadı. Ve gerçekten denemediğinizden eminim. Çünkü işe yaramıyor.
JJJ

Elbette, yanıt vermenin daha az rahatsız edici bir yolu var. Haklı olmanıza rağmen, daha fazla test yapıyorum, her durumda işe yaramıyor.
Magotte

@JJJ Bu çözüme ne dersiniz?
Magotte

0

Basit if ifadesi ile yapabilirsiniz

Şamandıra olup olmadığını kontrol etmek için

eğer tip (a) == tip (1.1)

Tam sayı türünü kontrol etmek için

eğer tip (a) == tip (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 kontrol eder, aynı zamanda .0 şamandıralar için true döndürür
Gideon Lytes

Lütfen katkınızın OP sorusunu neden / nasıl çözdüğünü açıklayınız.
Heri

@Heri bir sayının int veya float olup olmadığını kontrol etmek istiyor, tanımladığım fonksiyon bunu yapabilir, abs sayının mutlak değerini döndüren dahili bir python fonk, yuvarlak da yuvarlanan dahili bir fonk sayı, yuvarlanmış sayıyı mutlak olandan çıkarırsam ve sıfır alırsam, sayı bir int olur veya ondalık basamaklarından sonra olduğu gibi sıfır olur
Gideon

-1

Bunu dene...

def is_int(x):
  absolute = abs(x)
  rounded = round(absolute)
  return absolute - rounded == 0

-5

variable.isnumeric bir değerin bir tam sayı olup olmadığını kontrol eder:

 if myVariable.isnumeric:
    print('this varibale is numeric')
 else:
    print('not numeric')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.