Lebih
Memeriksa apakah sebuah variabel integer atau tidak
Bagaimana cara memeriksa apakah sebuah variabel adalah bilangan bulat?
826
42
Bagaimana cara memeriksa apakah sebuah variabel adalah bilangan bulat?
Jika anda perlu untuk melakukan hal ini, lakukan
kecuali anda berada dalam Python 2.x dalam hal ini anda inginkan
Jangan gunakan
jenis
. Hal ini hampir tidak pernah jawaban yang tepat dalam Python, karena itu blok semua fleksibilitas polimorfisme. Misalnya, jika anda subclassint
, kelas baru anda harus mendaftar sebagaiint
, yangjenis
tidak akan melakukan: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: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.
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):
Edit:
Anda selalu dapat mengkonversi ke float sebelum memanggil metode ini. Tiga kemungkinan:
Jika tidak, anda bisa memeriksa apakah itu adalah int pertama seperti Agostino berkata:
Jika anda benar-benar ** perlu memeriksa maka's baik untuk menggunakan abstrak dasar kelas daripada beton kelas. Untuk integer yang berarti:
Ini doesn't membatasi cek untuk hanya
int
, atauint
danpanjang
, tetapi juga memungkinkan pengguna lain ditetapkan jenis yang berperilaku sebagai bilangan bulat untuk bekerja.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 bahwanp.int8(5)
,np.int32(5)
, dll. semua berperilaku identik)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 untuklama
: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.
Mengapa tidak mencoba sesuatu seperti:
Bukan dari hal-hal rumit, mengapa tidak hanya sederhana
Sebuah metode sederhana yang saya gunakan di semua perangkat lunak saya ini. Memeriksa apakah variabel terdiri dari angka-angka.
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
(danpanjang
) 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: apakahx
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.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.mengapa tidak hanya memeriksa jika nilai yang ingin anda periksa adalah sama dengan dirinya sendiri berperan sebagai integer seperti yang ditunjukkan di bawah ini?
Jika anda ingin memastikan bahwa string yang hanya terdiri dari angka, tapi konversi ke int won't membantu, anda selalu dapat hanya menggunakan regex.
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:
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.
Anda juga dapat menggunakan
str.isdigit
. Mencoba mencaribantuan(str.isdigit)
Jika variabel yang dimasukkan adalah seperti string (mis.
'2010'
):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.Berikut ini adalah contoh sederhana bagaimana anda bisa menentukan integer
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!Di hadapan numpy periksa suka ..
.. (lambat) atau ..
.. 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
untuk kebenaran dan non-pengecualian mungkin menjadi taruhan yang baik. Demikian pula, memeriksa signed integer tipe eksklusif:
Jika anda ingin memeriksa dengan tidak memperhatikan Python versi (2.x vs 3.x), gunakan
enam
(PyPI) dan'sinteger_types
atribut:Dalam
enam
(sangat ringan single-file module), it's hanya melakukan ini: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.
Jika anda belum int anda dapat melakukan hal ini: