SORU
16 Temmuz 2015, PERŞEMBE


Neden Python 3&; 00" harf için 0 olarak ama&; 01" izin quot; harf için 1 olarak izin ver " diyor?

Neden Python 3 "00" gibi bir edebi 0 ama "01" olarak 1 harf değil mi? izin veriyor mu İyi bir nedeni var mı? Bu tutarsızlık beni şaşırtıyor. (Ve Python bilerek geriye uyumluluk kıran 3, tutarlılık gibi hedeflere ulaşmak için bahsediyoruz.)

Örneğin:

>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
  File "<stdin>", line 1
    time(16, 01)
              ^
SyntaxError: invalid token
>>>

CEVAP
16 Temmuz 2015, PERŞEMBE


https://docs.python.org/3/reference/lexical_analysis.html#integer-literals: başına

Tam sayı rakamları aşağıdaki sözcük tanımları tarafından açıklanmıştır:

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0" 
nonzerodigit   ::=  "1"..."9"
digit          ::=  "0"..."9"
octinteger     ::=  "0" ("o" | "O") octdigit 
hexinteger     ::=  "0" ("x" | "X") hexdigit 
bininteger     ::=  "0" ("b" | "B") bindigit 
octdigit       ::=  "0"..."7"
hexdigit       ::=  digit | "a"..."f" | "A"..."F"
bindigit       ::=  "0" | "1"

Tamsayı uzunluğu dışında ne kadar hazır limit diye bir şey yok kullanılabilir bellekte saklanabilir.

Sıfır olmayan bir ondalık sayı öndeki sıfırları izin verilmez unutmayın. Bu Python C-stil sekizli rakamları ile anlam ayrımı için, 3.0 sürümü daha önce kullandım.

Burada da belirtildiği gibi, bir lider sıfırsıfırondalık sayı verilmez. "0" 17 ** çok özel bir durum, yasal olarak

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"
octinteger     ::=  "0" ("o" | "O") octdigit  | "0" octdigit 

SVN commit r55866 0<octal> eski sayılar yasaklar tokenizer, MORAL 3127 uygulanmaktadır. Ancak, ilginçtir ki, aynı zamanda bu not ekler:

/* in any case, allow '0' as a literal */

eğer basamak aşağıdaki sıra sıfırdan farklı bir rakam varsa sadece SyntaxError atar nonzero özel bir bayrakla.

Bu PEP 3127 bu durumda izin vermediğinden garip

Bu MORAL önünde sıfır kullanarak bir sayıyı sekizli belirtmek için yeteneği Python 3.0 (2.6 3.0 önizleme Python modu), ve bu dili silinecektir öneriyorbir SyntaxError "0", hemen başka bir rakam tarafından takip edilir . bir lider ne zaman dirilecek .

(vurgu benim)

Yani, birden fazla sıfır izin olmasıdırteknik olarakKEP ihlal ve temelde Georg Brandl tarafından özel bir kılıf olarak kullanılmıştır. İlgili belge değişikliği "0" decimalinteger için geçerli bir durum (daha önce octinteger kapsamında olmuştu) olduğunu not etti.

Muhtemelen hiçbir zaman bilemeyeceğiztam olarakGeorg "0" geçerli yapmak için seçtim - sonsuza kadar Python garip köşe bir durumda kalabilir.


GÜNCELLEME[28 Tem 2015]: Bu soruyu hangi Georg chimed in python-fikirler: lively discussion thread yol açtı

Steven D'Aprano yazdı:

Neden bu şekilde tanımlanmıştır? [...] Neden sıfır almak 0000 yazarız?

Sana söyleyebilirdim, ama o zaman seni öldürmek zorunda kalırım.

Georg

Daha sonra, iplik this bug report Bu özel durum kurtulmak amacıyla çıktı. , 23**: burada

Bu kasıtlı değişiklik docs değişikliği görüldüğü gibi) nedenini hatırlamıyorum.

Bu değişim için iyi bir neden bulamayan şimdi ben [...]

ve böylece biz bu tutarsızlık arkasında kesin nedeni zaman kaybolur.

Son olarak, hata raporu reddedildi not: sıfırları Python 3 geri kalanı için sıfır tamsayılar sadece kabul edilmeye devam edecek.x.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • bobinire

    bobinire

    24 EYLÜL 2006
  • ehowhome

    ehowhome

    22 NİSAN 2009