Memeriksa apakah sebuah variabel integer atau tidak

Bagaimana cara memeriksa apakah sebuah variabel adalah bilangan bulat?

Mengomentari pertanyaan (15)
Larutan

Jika anda perlu untuk melakukan hal ini, lakukan

isinstance(, int)

kecuali anda berada dalam Python 2.x dalam hal ini anda inginkan

isinstance(, (int, long))

Jangan gunakan jenis. Hal ini hampir tidak pernah jawaban yang tepat dalam Python, karena itu blok semua fleksibilitas polimorfisme. Misalnya, jika anda subclass int, kelas baru anda harus mendaftar sebagai int, yang jenis tidak akan melakukan:

class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True

Ini menganut Python's sangat polimorfisme: anda harus memungkinkan setiap objek yang berperilaku seperti int, bukan mewajibkan bahwa itu menjadi satu.

TAPI

Klasik Python mentalitas, meskipun, adalah bahwa hal itu's lebih mudah untuk meminta pengampunan dari izin. Dengan kata lain, don't memeriksa apakah x adalah integer; berasumsi bahwa hal ini dan menangkap pengecualian hasil jika isn't:

try:
    x += 1
except TypeError:
    ...

Mentalitas ini perlahan-lahan disusul oleh penggunaan abstrak dasar kelas, yang memungkinkan anda daftarkan apa sifat objek harus memiliki (menambahkan? mengalikan? dua kali lipat?) dengan membuatnya mewarisi dari yang dibangun khusus kelas. Yang akan menjadi solusi terbaik, karena itu akan mengizinkan persis benda-benda dengan yang diperlukan dan memadai atribut, tetapi anda akan memiliki untuk membaca dokumen tentang cara menggunakannya.

Komentar (14)

Semua jawaban yang diusulkan sejauh ini tampaknya melewatkan fakta bahwa ganda (mengapung di python adalah benar-benar ganda) juga dapat menjadi integer (jika telah ada setelah titik desimal). Saya menggunakan built-in is_integer() metode ganda untuk memeriksa ini.

Contoh (untuk melakukan sesuatu setiap xth waktu untuk loop):

for index in range(y): 
    # do something
    if (index/x.).is_integer():
        # do something special

Edit:

Anda selalu dapat mengkonversi ke float sebelum memanggil metode ini. Tiga kemungkinan:

>>> float(5).is_integer()
True
>>> float(5.1).is_integer()
False
>>> float(5.0).is_integer()
True

Jika tidak, anda bisa memeriksa apakah itu adalah int pertama seperti Agostino berkata:

def is_int(val):
    if type(val) == int:
        return True
    else:
        if val.is_integer():
            return True
        else:
            return False
Komentar (8)

Jika anda benar-benar ** perlu memeriksa maka's baik untuk menggunakan abstrak dasar kelas daripada beton kelas. Untuk integer yang berarti:

>>> import numbers
>>> isinstance(3, numbers.Integral)
True

Ini doesn't membatasi cek untuk hanya int, atau int dan panjang, tetapi juga memungkinkan pengguna lain ditetapkan jenis yang berperilaku sebagai bilangan bulat untuk bekerja.

Komentar (13)

Berikut ini's rangkuman dari berbagai metode yang disebutkan di sini:

  • int(x) == x
  • coba x = operator.index(x)
  • isinstance(x, int)
  • isinstance(x, nomor.Integral)

dan berikut's bagaimana mereka berlaku untuk berbagai numerik jenis yang memiliki nilai integer:

Anda dapat melihat mereka aren't 100% konsisten. Fraksi dan Rasional secara konseptual yang sama, tapi salah satu persediaan .index() metode dan lain doesn't. Jenis kompleks don't ingin mengkonversi ke int bahkan jika bagian nyata merupakan bagian integral dan bagian imajiner adalah 0.

(np.int8|16|32|64(5) berarti bahwa np.int8(5), np.int32(5), dll. semua berperilaku identik)

Komentar (6)
>>> isinstance(3, int)
True

Lihat di sini untuk lebih lanjut.

Catatan bahwa ini tidak membantu jika anda'kembali mencari int-seperti atribut. Dalam hal ini anda mungkin juga ingin memeriksa untuk lama:

>>> isinstance(3L, (long, int))
True

I've melihat cek semacam ini terhadap array/index ketik Python sumber, tapi aku don't berpikir bahwa's terlihat luar C.

Tanda JADI balas: Apakah anda yakin anda harus memeriksa jenis? Baik don't lulus tipe yang dapat anda't menangani, atau don't mencoba untuk mengakali potensi kode reusers, mereka mungkin memiliki alasan yang baik untuk tidak lulus int untuk fungsi anda.

Komentar (8)

Mengapa tidak mencoba sesuatu seperti:

if x%1 == 0: 
Komentar (4)

Bukan dari hal-hal rumit, mengapa tidak hanya sederhana

if type(var) is int:
Komentar (1)

Sebuah metode sederhana yang saya gunakan di semua perangkat lunak saya ini. Memeriksa apakah variabel terdiri dari angka-angka.

test = input("Enter some text here: ")
if test.isdigit() == True:
   print("This is a number.")
else:
   print("This is not a number.")
Komentar (2)

it's benar-benar mengejutkan untuk melihat seperti diskusi panas datang ketika dasar seperti, valid dan, saya percaya, biasa pertanyaan yang diajukan.

beberapa orang telah menunjukkan bahwa jenis-pemeriksaan terhadap int (dan panjang) mungkin longgar kasus-kasus di mana besar angka desimal yang dihadapi. cukup tepat.

beberapa orang telah menunjukkan bahwa anda harus 'hanya melakukan x + 1 dan melihat apakah itu gagal. nah, untuk satu hal, ini bekerja pada mengapung juga, dan, di sisi lain, it's mudah untuk membangun sebuah kelas yang pasti tidak sangat numerik, belum mendefinisikan + operator dalam beberapa cara.

saya bertentangan dengan banyak posting dengan penuh semangat menyatakan bahwa anda tidak harus memeriksa jenis. nah, GvR pernah mengatakan sesuatu kepada efek yang dalam teori murni, yang mungkin benar, tetapi dalam prakteknya, isinstance sering melayani tujuan yang berguna (yang's beberapa saat yang lalu, don't memiliki link; anda dapat membaca apa yang GvR kata tentang isu-isu terkait di posting seperti ini).

apa yang lucu adalah berapa banyak orang tampaknya menganggap bahwa OP's tujuannya adalah untuk memeriksa apakah jenis yang diberikan x adalah numerik integer tipe—apa yang saya mengerti adalah apa yang biasanya saya maksud ketika menggunakan OP's kata-kata: apakah x merupakan bilangan bulat. dan ini dapat menjadi sangat penting: seperti meminta seseorang berapa banyak barang-barang mereka'd ingin memilih, anda mungkin ingin memeriksa anda mendapatkan non-negatif bilangan bulat kembali. menggunakan kasus-kasus seperti ini berlimpah.

it's juga, menurut saya, penting untuk melihat bahwa (1) jenis pemeriksaan, tetapi SATU—dan seringkali cukup kasar—ukuran program kebenaran, karena (2) hal ini sering dibatasi nilai-nilai yang masuk akal, dan out-of-batas nilai-nilai yang membuat omong kosong. kadang-kadang hanya beberapa intermiten nilai-nilai yang masuk akal—seperti mengingat semua angka, hanya yang nyata (non-kompleks), angka integer mungkin dalam kasus tertentu.

lucu tak seorang pun tampaknya untuk menyebutkan memeriksa x == math.floor( x ). jika itu harus memberikan kesalahan dengan beberapa besar desimal kelas, yah, mungkin itu's waktu untuk berpikir ulang paradigma OOP. ada juga PEP 357 yang menganggap cara menggunakan tidak begitu jelas-int-tapi-pasti-integer-seperti nilai-nilai yang akan digunakan sebagai daftar indeks. tidak yakin apakah aku seperti solusi.

Komentar (1)

Menemukan pertanyaan terkait di sini JADI itu sendiri.

Python developer lebih memilih untuk tidak memeriksa jenis, tetapi melakukan jenis operasi tertentu dan menangkap TypeError pengecualian. Tapi jika anda don't tahu jenis maka anda memiliki yang berikut.

>>> i = 12345
>>> type(i)

>>> type(i) is int
True
Komentar (3)

mengapa tidak hanya memeriksa jika nilai yang ingin anda periksa adalah sama dengan dirinya sendiri berperan sebagai integer seperti yang ditunjukkan di bawah ini?

def isInt(val):
    return val == int(val)
Komentar (3)

Jika anda ingin memastikan bahwa string yang hanya terdiri dari angka, tapi konversi ke int won't membantu, anda selalu dapat hanya menggunakan regex.

import re
x = "01234"
match = re.search("^\d+$", x)
try: x = match.group(0)
except AttributeError: print("not a valid number")

Result: x == "01234"

Dalam hal ini, jika x adalah "hello", konversi ke tipe numerik akan membuang ValueError, tetapi data juga akan hilang dalam proses. Menggunakan regex dan penangkapan AttributeError akan memungkinkan anda untuk mengkonfirmasi numerik karakter dalam string dengan, misalnya, terkemuka 0's.

Jika anda didn't ingin membuang AttributeError, melainkan hanya ingin mencari yang lebih spesifik masalah, anda bisa bervariasi regex dan hanya memeriksa pertandingan:

import re
x = "h01234"
match = re.search("\D", x)
if not match:
    print("x is a number")
else:
    print("encountered a problem at character:", match.group(0))

Result: "encountered a problem at character: h"

Yang benar-benar menunjukkan anda di mana masalah terjadi tanpa menggunakan pengecualian. Sekali lagi, ini bukan untuk pengujian jenis, melainkan karakter sendiri. Ini memberi anda lebih banyak fleksibilitas daripada hanya memeriksa jenis, terutama ketika mengkonversi antara jenis bisa kalah penting data string, seperti terkemuka 0's.

Komentar (1)

Anda juga dapat menggunakan str.isdigit. Mencoba mencari bantuan(str.isdigit)

def is_digit(str):
      return str.isdigit()
Komentar (1)

Jika variabel yang dimasukkan adalah seperti string (mis.'2010'):

if variable and variable.isdigit():
    return variable #or whatever you want to do with it. 
else: 
    return "Error" #or whatever you want to do with it.

Sebelum menggunakan ini saya bekerja keluar dengan mencoba/kecuali dan memeriksa (int(variabel)), tapi itu lagi kode. Aku bertanya-tanya jika ada's ada perbedaan dalam penggunaan sumber daya atau kecepatan.

Komentar (2)

Berikut ini adalah contoh sederhana bagaimana anda bisa menentukan integer

def is_int(x):
    print round(x),
    if x == round(x):
        print 'True',
    else:
        print 'False'

is_int(7.0)   # True
is_int(7.5)   # False
is_int(-1)    # True    
Komentar (0)

Jika anda hanya perlu nilai, operator.index (__naik__ khusus method) adalah cara untuk pergi dalam pendapat saya. Karena itu harus bekerja untuk semua jenis yang dapat dengan aman dilemparkan ke integer. I. e. mengapung gagal, bilangan bulat, bahkan fancy bilangan bulat kelas yang tidak menerapkan Integral kelas abstrak bekerja dengan bebek mengetik.

operator.index adalah apa yang digunakan untuk daftar pengindeksan, dll. Dan menurut saya itu harus digunakan untuk lebih/dipromosikan.

Bahkan saya berpendapat itu adalah satu-satunya cara yang benar untuk mendapatkan nilai integer jika anda ingin memastikan bahwa titik mengambang, karena untuk membatasi masalah, dll. ditolak dan bekerja dengan semua jenis integral (yaitu numpy, dll.) bahkan jika mereka mungkin tidak (belum) mendukung kelas abstrak.

Ini adalah apa yang __naik__ adalah diperkenalkan untuk!

Komentar (1)

Di hadapan numpy periksa suka ..

isinstance(var, numbers.Integral)

.. (lambat) atau ..

isinstance(var, (int, long, np.integer))

.. dalam rangka untuk mencocokkan semua jenis varian seperti np.int8, np.uint16, ...

(Drop lama di PY3)

Mengenali SETIAP integer-seperti objek dari mana saja adalah sulit menebak permainan. Memeriksa

var & 0 == 0 

untuk kebenaran dan non-pengecualian mungkin menjadi taruhan yang baik. Demikian pula, memeriksa signed integer tipe eksklusif:

var ^ -1 ==  -var - 1
Komentar (0)

Jika anda ingin memeriksa dengan tidak memperhatikan Python versi (2.x vs 3.x), gunakan enam (PyPI) dan's integer_types atribut:

import six

if isinstance(obj, six.integer_types):
    print('obj is an integer!')

Dalam enam (sangat ringan single-file module), it's hanya melakukan ini:

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    integer_types = int,
else:
    integer_types = (int, long)
Komentar (0)

Jika anda membaca dari sebuah file dan anda memiliki sebuah array atau kamus dengan nilai-nilai dari beberapa tipe data, berikut ini akan berguna. Hanya memeriksa apakah variabel dapat berupa tipe dicor ke int(atau lainnya datatype yang anda inginkan untuk menegakkan) atau tidak.

try :
    int(a);
    #Variable a is int
except ValueError : 
    # Variable a is not an int
Komentar (0)

Jika anda belum int anda dapat melakukan hal ini:

var = 15.4
if(var - int(var) != 0):
    print "Value is not integer"
Komentar (1)