web-gelistirme-sc.com

Python ile başlayan sayılar ne anlama geliyor?

Pythonun önünde 0 olan küçük tamsayılar yazdığımda, garip sonuçlar veriyorlar. Bu neden?

>>> 011
9
>>> 0100
64
>>> 027
23

Not: Python sürüm 2.7.3 Bunu Python 3.0'da test ettim ve görünüşe göre bu şimdi bir hata. Bu yüzden versiyona özgü bir şey. 

Düzenleme: görünüşe göre hala tamsayılar:

>>> type(027)
`<type 'int'>`
50
Rob Volgman

Bunlar baz 8'de gösterilen sayılardır (sekizli sayılar) .

0111*(8**1) + 1*(8**0) = 9'a eşittir,

0100, 1*(8**2) + 0*(8**1) + 0*(8**0) = 64 değerine eşittir,

0272*(8**1) + 7*(8**0) = 16 + 7 = 23’e eşittir.

49
unutbu

Python 2'de (ve birkaç programlama dilinde), bunlar sekizli sayıları temsil eder.

Python 3'te artık 011 çalışmıyor ve bunun yerine 0o11 kullanırsınız.

Düzenlemeye cevap olarak: bunlar normal tamsayılardır. Sadece farklı yollarla belirtilmişlerdir; ve bunlar Python tarafından otomatik olarak dahili bir tamsayı temsiline dönüştürülür (bu aslında base-2'dir, bu nedenle hem 9 hem 011 dahili olarak 0b1001'a dönüştürülür).

42
Michał Górny

Sekizli sayısal sistemde sayılar. Diğer önekler onaltılık için 0x ve ikili dosya için 0b.

7
Zaur Nasibov

Her iki Python sürüm 2 ve 3, öncü '0o' ve '0O' (Büyük harf o) ile yazılmış sekizlikten anlıyor, bu yüzden Python 2.x ile çalışırken de kullanma alışkanlığı içinde olun. 

Dizelerdeki sayılarda yalnızca baştaki sıfırları kullanın.

Tamsayıları, diğer taban sistemlerinden herhangi birinden int () ile dönüştürebilirsiniz.

>>> int(0o20)

16

Çıktınızın satır başında sıfırlarla gösterilmesini istiyorsanız, bu cevaba göre tanımlayın: Sıfır satırlı ekran numarası

Posta Kodlarıyla çalışmayı planlıyorsanız, bunlara tüm yollarla dizeler olarak davranmak en iyisidir.

6
ionn

Bunlar sekizlik sayılardır (temel 8, değerler 0 - 7)

oct () işleviyle ondalık sayıyı octata dönüştürebilirsiniz.

In [125]: for i in range(10):
   .....:     print '{:5} {:5}'.format(i, oct(i))
   .....:
    0 0
    1 01
    2 02
    3 03
    4 04
    5 05
    6 06
    7 07
    8 010
    9 011

ve bir sekizli değeri int () işleviyle uygun bir tamsayıya dönüştürün (bu durumda 8):

int(str(17), 8)
Out[129]: 15

Benzer kurallar/işlevler hex () işlevini kullanarak onaltılık sayılar (taban 16) için de geçerlidir.

6
Levon

Bu çok kolay. Sekizlik sayılardır.

http://en.wikipedia.org/wiki/Octal

Ayrıca 0x ile başlayan sayılar vardır. Onaltılık sayılardır:

>>> 0x51
81
4
Igor Chubin

Görünüşe göre sekizlik (temel 8) sayılardır ve 0 sadece Python 2'nin kullandığı eski bir önekdir. 

Python 3'te şunu yazmanız gerekir: bunun yerine 0o11.

Hala tamsayılılar ancak onlarla işlem yapmak normal 10 tabanlı bir sonuç verecek.

2
Rob Volgman

Denedim. Biraz öğrendim. Java'dan bunu bir tuzak olarak biliyorum: Önde gelen bir sıfır, sekizli bir sayı verir. Cevap vermeyen meslektaşlarım var. Bunu yıllar sonra Java’da edindiğim tecrübeyle bilmiyorum.

Şimdi Python'daki davranışın ne olduğu ilginçti. Python 2'den Python 3'e geçtiğini takdir ediyorum. Java'nın ("arılara kolay" odaklı genç bir dil) neden C'nin bu aptal çözümünü alabileceğini hiç anlamadım.

Önek olarak baştaki sıfır, yanlışlıkla yazılabilir (hatalı çözüm). Onaltılık bir sayı için 0x, asla yanlışlıkla yazılmaz (iyi bir çözüm). Fakat 0 ve o benzerdir, bu yüzden Python'daki 0o23'ün mükemmel bir çözüm olmadığını düşünüyorum. 0c23 (o c tal) bence daha iyi bir çözüm olacaktır.

0
Rudi

Rakam değişmezleri için en son Python belirtimi/ PEP-3127 "Tamsayı Hazırlama Desteği ve Sözdizimi"

011 sözdizimi Python 3.0'da kaldırılmıştır. 011 için sözdizimi Python 2.6'da eklenmiştir ve Python 3.0'dan sonra desteklenen tek kişidir. Python 2'de, sıfır olan veya en az sıfır olan harflerin sayısı konusunda uyarıda bulunan hiçbir __future__ içe aktarma işlemi yoktur, bu nedenle geliştiriciler 011'in ne anlama geldiğini ve kaçınılması gerektiğini bilmek zorundadır (ve bundan kaçınılabilir).

0
Guido U. Draheim