Saya mencari nilai minimum dan maksimum untuk integer dalam python. Misalnya, di Jawa, kita memiliki Integer.MIN_VALUEdan Integer.MAX_VALUE. Apakah ada yang seperti ini dengan python?
Perhatikan bahwa pada Python 3 intjenisnya pada dasarnya sama dengan longjenis pada Python 2, sehingga gagasan maksimum atau minimum intmenghilang sepenuhnya. Ini pada dasarnya tidak relevan bahkan pada Python 2.
agf
8
@agf: ini bisa relevan dengan berbagai cara. Misalnya dalam algoritma apa pun yang perlu menyimpan nilai min yang ditemukan (seperti algoritma pengurutan). Nilai min dapat diinisialisasi di sys.maxint sehingga menjamin bahwa nilai pertama yang ditemukan diambil sebagai min
Basile Perrenoud
@Toaster, kecuali bahwa Anda dapat memiliki daftar di mana semua nilai lebih besar daripada sys.maxintkarena hanya maksimum untuk intjenis pada Python 2, yang Python akan diam-diam mempromosikan ke a long.
agf
30
Jika Anda perlu menggunakan "nilai yang sangat besar" dalam suatu algoritma, mis. Menemukan minimum atau maksimum koleksi generik, float('inf')atau float('-inf')bisa sangat membantu.
Dalam Python 3, pertanyaan ini tidak berlaku. intJenis polos tidak terikat.
Namun, Anda mungkin sebenarnya mencari informasi tentang ukuran kata juru bahasa saat ini , yang akan sama dengan ukuran kata mesin dalam banyak kasus. Informasi itu masih tersedia dalam Python 3 sys.maxsize, yang merupakan nilai maksimum yang diwakili oleh kata yang ditandatangani. Secara ekuivalen, itu adalah ukuran dari daftar terbesar atau urutan dalam memori .
Secara umum, nilai maksimum yang diwakili oleh kata yang tidak ditandatangani akan menjadi sys.maxsize * 2 + 1, dan jumlah bit dalam sebuah kata akan math.log2(sys.maxsize * 2 + 2). Lihat jawaban ini untuk informasi lebih lanjut.
Python 2
Dalam Python 2, nilai maksimum untuk intnilai polos tersedia sebagai sys.maxint:
>>> sys.maxint
9223372036854775807
Anda dapat menghitung nilai minimum dengan -sys.maxint - 1seperti yang ditunjukkan di sini .
Python beralih dari integer polos ke panjang setelah Anda melebihi nilai ini. Jadi sebagian besar waktu, Anda tidak perlu mengetahuinya.
Angka ini mungkin tampak sewenang-wenang, tetapi tidak. 9223372036854775807 persis 2^63 - 1, jadi Anda punya int 64-bit. Secara umum, integer n-bit memiliki nilai mulai dari -2^(n-1)hingga 2^(n-1) - 1.
NullUserException
22
Perhatikan bahwa jika Anda menggunakan runtime Python 32-bit, sys.maxint akan kembali 2^31 - 1, meskipun Python akan melompat ke 64-bit secara mulus dengan longdatatype.
Scott Stafford
19
Gunakan sys.maxsizesebaliknya, seperti yang disarankan oleh @Akash Rana. Itu hadir juga dalam Python 2, sepertisys kata docs . Ini akan membuat kode lebih kompatibel dengan kedua versi Python.
Ioannis Filippidis
6
Anda dan saya memiliki interpretasi berbeda tentang garis itu dari dokumen. Penggantian dalam 2to3adalah heuristik cepat dan kotor yang bagus yang tidak akan merusak sebagian besar waktu - tetapi perbedaan antara kedua nilai ini penting. Praktik terbaik adalah menggunakan nilai yang Anda maksudkan sebenarnya. Jika Anda benar-benar membutuhkansys.maxint Python 2, Anda tidak akan memerlukannya lagi di Python 3, dan itu harus benar-benar dihapus seluruhnya, tidak diubah menjadi sys.maxsize.
pengirim
3
minsize - Mengalikan dengan operator min Bitwise memberikan minsize ~ sys.maxsize
om471987
238
Jika Anda hanya membutuhkan angka yang lebih besar dari yang lainnya, Anda dapat menggunakannya
float('inf')
dengan cara yang sama, jumlah yang lebih kecil dari yang lainnya:
Hanya sebuah catatan yang (tidak relevan, tapi tetap saja): float ('inf')> float ('inf') menghasilkan 'false'. Angka tak hingga harus lebih besar dari angka tak terbatas lainnya :-D ... mind snaps
Scre
11
@ Scre Apa lagi yang Anda harapkan? x > xbiasanya False, dan tak terbatas seharusnya tidak terkecuali. ( float('NaN), di sisi lain ...)
jamesdlin
6
Ini sebenarnya tidak berlaku untuk intcauze cannot convert infinite float to int... tetapi berfungsi untuk sebagian besar kasus
Leighton
5
Perhatikan itu int('inf')tidak berhasil.
Tom Hale
4
Ini bukan jawaban untuk pertanyaan OP
ghosh
225
The sys.maxintkonstan telah dihapus dari Python 3.0 dan seterusnya, bukan menggunakansys.maxsize .
Integer
PEP 237: Intinya, lama berganti nama menjadi int. Artinya, hanya ada satu tipe integral bawaan, bernama int; tetapi sebagian besar berperilaku seperti tipe lama yang lama.
PEP 238: Ekspresi seperti 1/2 mengembalikan float. Gunakan 1 // 2 untuk mendapatkan perilaku pemotongan. (Sintaks terakhir sudah ada selama bertahun-tahun, setidaknya sejak Python 2.2.)
Konstanta sys.maxint dihapus, karena tidak ada lagi batas nilai integer. Namun, sys.maxsize dapat digunakan sebagai bilangan bulat yang lebih besar daripada daftar praktis atau indeks string. Ini sesuai dengan ukuran integer "alami" implementasi dan biasanya sama dengan sys.maxint dalam rilis sebelumnya pada platform yang sama (dengan asumsi opsi build yang sama).
Repr () dari integer panjang tidak lagi menyertakan trailing L, jadi kode yang tanpa syarat akan menghapus karakter yang akan memotong digit terakhir. (Gunakan str () sebagai gantinya.)
Literal oktal tidak lagi berbentuk 0720; gunakan 0o720 sebagai gantinya.
Benar. Memang, dari help(sys): maxsize - panjang kontainer terbesar yang didukung . Ini harus menjadi jawaban yang diterima.
Marco Sulla
77
Dalam Python integer akan secara otomatis beralih dari intrepresentasi ukuran tetap ke representasi lebar variabel longsetelah Anda melewati nilai sys.maxint, yang merupakan 2 31 - 1 atau 2 63 - 1 tergantung pada platform Anda. Perhatikan Lyang ditambahkan di sini:
Angka dibuat oleh literal angka atau sebagai hasil dari fungsi dan operator bawaan. Literer integer tanpa hiasan (termasuk bilangan biner, hex, dan oktal) menghasilkan bilangan bulat polos kecuali jika nilai yang ditunjukkannya terlalu besar untuk diwakili sebagai bilangan bulat biasa, dalam hal ini mereka menghasilkan bilangan bulat panjang. Bilangan bulat integer dengan 'L'atau 'l'suffix menghasilkan bilangan bulat panjang ( 'L'lebih disukai karena 1lterlihat sangat mirip dengan sebelas!).
Python berusaha sangat keras untuk berpura-pura bahwa bilangan bulatnya adalah bilangan bulat matematika dan tidak terikat. Misalnya, dapat menghitung googol dengan mudah:
yah, python 3 memang ada , untungnya (!); tetapi sys.maxinttidak ada di python 3 (tl; dr: " sys.maxintkonstanta dihapus (dalam python3), karena tidak ada lagi batas nilai integer. Namun, sys.maxsizedapat digunakan sebagai bilangan bulat yang lebih besar daripada daftar praktis atau string index. " )
michael
2
Mengapa membuat variabel yang membangun bayangan seperti min()dan max()?
RoadRunner - MSFT
1
Cari biner pujian 2
netskink
2
min = ~sys.maxsize
Andrew
10
Anda dapat menggunakan 'inf' seperti ini:
import math
bool_true =0< math.inf
bool_false =0<-math.inf
No - maxsize hanyalah indeks kontainer terbesar yang mungkin. Python akan dengan senang hati bekerja dengan bilangan bulat 100 digit dan lebih banyak lagi
int
jenisnya pada dasarnya sama denganlong
jenis pada Python 2, sehingga gagasan maksimum atau minimumint
menghilang sepenuhnya. Ini pada dasarnya tidak relevan bahkan pada Python 2.sys.maxint
karena hanya maksimum untukint
jenis pada Python 2, yang Python akan diam-diam mempromosikan ke along
.float('inf')
ataufloat('-inf')
bisa sangat membantu.Jawaban:
Python 3
Dalam Python 3, pertanyaan ini tidak berlaku.
int
Jenis polos tidak terikat.Namun, Anda mungkin sebenarnya mencari informasi tentang ukuran kata juru bahasa saat ini , yang akan sama dengan ukuran kata mesin dalam banyak kasus. Informasi itu masih tersedia dalam Python 3
sys.maxsize
, yang merupakan nilai maksimum yang diwakili oleh kata yang ditandatangani. Secara ekuivalen, itu adalah ukuran dari daftar terbesar atau urutan dalam memori .Secara umum, nilai maksimum yang diwakili oleh kata yang tidak ditandatangani akan menjadi
sys.maxsize * 2 + 1
, dan jumlah bit dalam sebuah kata akanmath.log2(sys.maxsize * 2 + 2)
. Lihat jawaban ini untuk informasi lebih lanjut.Python 2
Dalam Python 2, nilai maksimum untuk
int
nilai polos tersedia sebagaisys.maxint
:Anda dapat menghitung nilai minimum dengan
-sys.maxint - 1
seperti yang ditunjukkan di sini .Python beralih dari integer polos ke panjang setelah Anda melebihi nilai ini. Jadi sebagian besar waktu, Anda tidak perlu mengetahuinya.
sumber
2^63 - 1
, jadi Anda punya int 64-bit. Secara umum, integer n-bit memiliki nilai mulai dari-2^(n-1)
hingga2^(n-1) - 1
.2^31 - 1
, meskipun Python akan melompat ke 64-bit secara mulus denganlong
datatype.sys.maxsize
sebaliknya, seperti yang disarankan oleh @Akash Rana. Itu hadir juga dalam Python 2, sepertisys
kata docs . Ini akan membuat kode lebih kompatibel dengan kedua versi Python.2to3
adalah heuristik cepat dan kotor yang bagus yang tidak akan merusak sebagian besar waktu - tetapi perbedaan antara kedua nilai ini penting. Praktik terbaik adalah menggunakan nilai yang Anda maksudkan sebenarnya. Jika Anda benar-benar membutuhkansys.maxint
Python 2, Anda tidak akan memerlukannya lagi di Python 3, dan itu harus benar-benar dihapus seluruhnya, tidak diubah menjadisys.maxsize
.Jika Anda hanya membutuhkan angka yang lebih besar dari yang lainnya, Anda dapat menggunakannya
dengan cara yang sama, jumlah yang lebih kecil dari yang lainnya:
Ini berfungsi di kedua python 2 dan 3.
sumber
x > x
biasanyaFalse
, dan tak terbatas seharusnya tidak terkecuali. (float('NaN)
, di sisi lain ...)int
cauzecannot convert infinite float to int
... tetapi berfungsi untuk sebagian besar kasusint('inf')
tidak berhasil.The
sys.maxint
konstan telah dihapus dari Python 3.0 dan seterusnya, bukan menggunakansys.maxsize
.Rujuk: https://docs.python.org/3/whatsnew/3.0.html#integers
sumber
help(sys)
: maxsize - panjang kontainer terbesar yang didukung . Ini harus menjadi jawaban yang diterima.Dalam Python integer akan secara otomatis beralih dari
int
representasi ukuran tetap ke representasi lebar variabellong
setelah Anda melewati nilaisys.maxint
, yang merupakan 2 31 - 1 atau 2 63 - 1 tergantung pada platform Anda. PerhatikanL
yang ditambahkan di sini:Dari manual Python :
Python berusaha sangat keras untuk berpura-pura bahwa bilangan bulatnya adalah bilangan bulat matematika dan tidak terikat. Misalnya, dapat menghitung googol dengan mudah:
sumber
long
tidak seperti Javalong
- itu agak dekatBigInteger
.L
suffix, dan itu hanyaint
, tidaklong
, tidak peduli seberapa besar jumlahnya.Untuk Python 3, itu
sumber
sys.maxint
tidak ada di python 3 (tl; dr: "sys.maxint
konstanta dihapus (dalam python3), karena tidak ada lagi batas nilai integer. Namun,sys.maxsize
dapat digunakan sebagai bilangan bulat yang lebih besar daripada daftar praktis atau string index. " )min()
danmax()
?min = ~sys.maxsize
Anda dapat menggunakan 'inf' seperti ini:
Rujuk: matematika - Fungsi matematika
sumber
math.inf
setara denganfloat('inf')
Jika Anda ingin maksimum untuk array atau daftar indeks (setara dengan
size_t
dalam C / C ++), Anda dapat menggunakan numpy:Ini sama karena
sys.maxsize
bagaimanapun keuntungannya adalah Anda tidak perlu mengimpor sistem hanya untuk ini.Jika Anda ingin maks untuk int asli pada mesin:
Anda dapat melihat jenis lain yang tersedia di dokumen .
Untuk mengapung Anda juga bisa menggunakan
sys.float_info.max
.sumber
Saya sangat bergantung pada perintah seperti ini.
Maks int dikembalikan: 9223372036854775807
Untuk referensi lebih lanjut untuk 'sistem' Anda harus mengakses
https://docs.python.org/3/library/sys.html
https://docs.python.org/3/library/sys.html#sys.maxsize
sumber