Ints için maksimum ve minimum değerler


745

Python tamsayıları için minimum ve maksimum değerleri arıyorum. Örneğin, Java'da, Integer.MIN_VALUEve var Integer.MAX_VALUE. Python'da böyle bir şey var mı?


14
Python 3'te inttürün temel olarak longPython 2'deki türle aynı olduğunu unutmayın , bu nedenle maksimum veya minimum fikri inttamamen ortadan kalkar. Python 2'de bile temelde alakasız.
agf

8
@ agf: çeşitli şekillerde alakalı olabilir. Örneğin, bulunan min değerinin kaydedilmesini gerektiren herhangi bir algoritmada (sıralama algoritması gibi). Min değeri sys.maxint değerinde başlatılabilir, böylece bulunan herhangi bir ilk değerin min olarak alınmasını garanti eder
Basile Perrenoud

@ Toaster , Python'un sessizce tanıtacağı Python 2'deki tür sys.maxintiçin yalnızca maksimum olduğundan , tüm değerlerin daha büyük olduğu bir listeniz olabilir . intlong
agf

30
Bir algoritma "çok büyük bir değer", bir jenerik koleksiyonu mesela bulgu minimum veya maksimum kullanmak gerekiyorsa float('inf')veya float('-inf')oldukça yararlı olabilir.
geoff

Yanıtlar:


853

Python 3

Python 3'te bu soru geçerli değildir. Düz inttip sınırsızdır.

Ancak, aslında şimdiki tercüman hakkında bilgi almak için arıyor olabilir kelime boyutu çoğu durumda makinenin kelime büyüklüğü aynı olacaktır. Bu bilgi, Python 3'te sys.maxsize, imzalı bir kelimenin temsil edebileceği maksimum değer olan hâlâ mevcuttur . Aynı şekilde, mümkün olan en büyük listenin veya bellek içi dizinin boyutudur .

Genellikle, imzasız bir kelimenin temsil edebileceği maksimum değer sys.maxsize * 2 + 1ve bir kelimedeki bit sayısı olacaktır math.log2(sys.maxsize * 2 + 2). Daha fazla bilgi için bu cevaba bakınız .

Python 2

Python 2'de, düz intdeğerler için maksimum değer şu şekilde kullanılabilir sys.maxint:

>>> sys.maxint
9223372036854775807

Minimum değeri burada-sys.maxint - 1 gösterildiği gibi hesaplayabilirsiniz .

Bu değeri aştığınızda Python düzden uzun tamsayılara sorunsuz bir şekilde geçer. Yani çoğu zaman, bunu bilmenize gerek kalmayacak.


177
Bu sayı keyfi gibi görünebilir, ancak değildir. 9223372036854775807 tam olarak 2^63 - 1, bu yüzden 64 bit int var. Genel olarak, bir n-bit tamsayı arasında değişen değerlere sahiptir -2^(n-1)için 2^(n-1) - 1.
NullUserException

22
32-bit Python çalışma zamanı kullanıyorsanız, Python veri tipiyle 2^31 - 1sorunsuz bir şekilde 64-bit'e atlasa bile sys.maxint'in geri döneceğini unutmayın long.
Scott Stafford

19
sys.maxsize@Akash Rana tarafından önerildiği gibi kullanın . Dokümanların söylediği gibisys Python 2'de de mevcuttur . Bu, kodu her iki Python sürümü ile daha uyumlu hale getirecektir.
Ioannis Filippidis

6
Sen ve ben o çizginin dokümanlardan farklı yorumları var. Bunun yerine, 2to3çoğu zaman hiçbir şeyi kırmayacak, hızlı ve kirli bir sezgisel tarama yapılır - ancak bu iki değer arasındaki fark önemlidir. En iyi uygulama, aslında kullanmak istediğiniz değeri kullanmaktır. Python 2'de gerçekten ihtiyacınız varsa sys.maxint, artık Python 3'te buna ihtiyacınız olmayacak ve tamamen kaldırılmalı, değiştirilmemelidir sys.maxsize.
senderle

3
minsize - Bitwise min operatörü ile çarpılması minsize ~ sys.maxsize verir
om471987

238

Sadece diğerlerinden daha büyük bir sayıya ihtiyacınız varsa,

float('inf')

benzer şekilde, diğerlerinden daha küçük bir sayı:

float('-inf')

Bu hem python 2 hem de 3'te çalışır.


9
Tho (önemsiz olduğu halde yine de) bir not: float ('inf')> float ('inf') 'false' ile sonuçlanır. Sonsuz sayı başka bir sonsuz sayıdan daha büyük olmalıdır :-D ... akıl
tutuyor

11
@Scre Başka ne beklersiniz? x > xgenellikle Falseve sonsuzluk bir istisna olmamalıdır. ( float('NaN), diğer taraftan ...)
jamesdlin

6
Bu aslında intcauze için geçerli değildir cannot convert infinite float to int... ancak çoğu durumda işe yarar
Leighton

5
Bunun int('inf')işe yaramadığını unutmayın.
Tom Hale

4
Bu OP sorusuna bir cevap değil
ghosh

225

sys.maxintSabiti ileriye yerine kullanmak Python 3.0 kaldırıldı sys.maxsize.

tamsayılar

  • PEP 237: Esasen uzun süredir int. Yani, int adında yalnızca bir yerleşik integral türü vardır; ama çoğunlukla eski uzun tip gibi davranır.
  • PEP 238: 1/2 gibi bir ifade bir kayan nokta döndürür. Kesilme davranışını elde etmek için 1 // 2 kullanın. (İkinci sözdizimi, en azından Python 2.2'den beri yıllardır var olmuştur.)
  • Sys.maxint sabiti, tamsayıların değeri için bir sınır olmadığından kaldırıldı. Ancak, sys.maxsize herhangi bir pratik liste veya dize dizininden daha büyük bir tamsayı olarak kullanılabilir. Uygulamanın "doğal" tamsayı boyutuna uygundur ve genellikle aynı platformda önceki sürümlerde sys.maxint ile aynıdır (aynı oluşturma seçeneklerini varsayarak).
  • Uzun bir tamsayının repr () işlevi artık arkadaki L'yi içermez, bu nedenle bu karakteri koşulsuz olarak dizen kod, bunun yerine son basamağı keser. (Bunun yerine str () kullanın.)
  • Sekizlik değişmez değerler artık 0720 biçiminde değildir; bunun yerine 0o720 kullanın.

Bakınız: https://docs.python.org/3/whatsnew/3.0.html#integers


1
Doğru. Gerçekten de help(sys): maxsize - desteklenen en büyük konteyner uzunluğu . Bu kabul edilen cevap olmalı.
Marco Sulla

77

Python'da , değeri platformunuza bağlı olarak 2 31 - 1 veya 2 63 - 1 değerini geçtikten sonra otomatik olarak sabit boyutlu bir intgösterimden değişken genişlikte bir longgösterime geçecektir . Buraya eklenenlere dikkat edin :sys.maxintL

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Gönderen Python kılavuzda :

Sayılar sayısal değişmez değerler tarafından veya yerleşik işlevler ve işleçlerin sonucu olarak oluşturulur. Süslenmemiş tamsayı değişmez değerleri (ikili, onaltılık ve sekizli sayılar dahil), belirttikleri değer düz bir tamsayı olarak gösterilemeyecek kadar büyük olmadıkça düz tamsayılar verir, bu durumda uzun bir tamsayı verir. Bir 'L'veya 'l'soneki tamsayı değişmezleri uzun tamsayılar verir ( onbire çok benzediği 'L'için tercih edilir 1l!).

Python, tamsayılarının matematiksel tamsayılar ve sınırsız olduğunu iddia etmek için çok uğraşmaktadır. Örneğin, bir googolü kolayca hesaplayabilir :

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

36
Karışıklığa eklemek için Python'lar longJava'nınki gibi değil long- daha yakın BigInteger.
NullUserException

Python3'te, Lsonek yok gibi görünüyor ve sayı ne kadar büyük olursa olsun, sadece intdeğil long.
Eric Wang

39

Python 3 için,

import sys
max = sys.maxsize
min = -sys.maxsize - 1

3
python 3 mevcut değil. bkz. stackoverflow.com/questions/13795758/…
netskink

34
neyse , python 3 var , neyse ki (!); ancak sys.maxintpython 3'te mevcut değildir (tl; dr: " sys.maxintsabiti tamsayıların değerinde bir sınır olmadığından (python3'te) kaldırılmıştır. Ancak, sys.maxsizeherhangi bir pratik liste veya dizeden daha büyük bir tamsayı olarak kullanılabilir endeksi. " )
michael

2
Neden min()ve gibi gölgelerin oluşturduğu değişkenler yaratılmalı max()?
RoadRunner - MSFT

1
2'nin iltifat ikili bak
netskink

2
min = ~sys.maxsize
Andrew


5

Dizi veya liste indeksleri için maks. ( size_tC / C ++ ile eşdeğer ) istiyorsanız, numpy'yi kullanabilirsiniz:

np.iinfo(np.intp).max

Bu aynıdır sys.maxsizeavantajı sadece bunun için import sys gerek kalmamasıdır ancak.

Makinedeki yerel int için maksimum değer istiyorsanız:

np.iinfo(np.intc).max

Doc'deki diğer kullanılabilir türlere bakabilirsiniz .

Şamandıralar için de kullanabilirsiniz sys.float_info.max.


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.