Python 2.7'de basılı parantez neden isteğe bağlıdır?


98

Python 2.7'de aşağıdakilerin ikisi de aynı şeyi yapacak

print("Hello, World!") # Prints "Hello, World!"

print "Hello, World!" # Prints "Hello, World!"

Ancak aşağıdakiler olmayacak

print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")

print "Hello,", "World!" # Prints the words "Hello, World!"

Python 3.x'te parantez printzorunludur, temelde onu bir işlev yapar, ancak 2.7'de her ikisi de farklı sonuçlarla çalışacaktır. printPython 2.7'de başka ne bilmeliyim ?


7
Python 2.x printaslında bir işlev değil, özel bir ifadedir. : Gibi kullanılamaz nedeni de budur lambda x: print xo Not (expr)bir Tuple (o sonuçlanır yaratmaz expr), ancak ,yapar.

Bir işlev olarak yazdırma ve ifade olarak yazdırma desteğinin, python'un eski sürümleriyle geriye dönük uyumluluğu sürdürmek olduğunu ve insanları python 3'e geçmek için yeni sözdizimini kullanmaya teşvik ettiğini varsayıyorum.
GWW

11
ps, 2.7'de yazdırma işlevini etkinleştirmek için (ve yazdırma ifadesi davranışına sahip olmamak), gelecekte bir içe aktarma yapmanız gerekir:from __future__ import print_function
Jeff Mercado

İkinci örnek aslında "Merhaba Dünya!" (boşluk olmadan) yoksa "Merhaba, Dünya!" (boşluk ile) örnekteki gibi.
kapad

Yanıtlar:


107

Python 2.x printaslında özel bir ifadedir ve bir işlev değildir *.

Bu aynı zamanda şu şekilde kullanılamama nedenidir: lambda x: print x

Bunun (expr)bir Tuple oluşturmadığını (sonuçlanır expr), ancak yarattığını unutmayın ,. Bu muhtemelen Python 2.7 arasında print (x)ve print (x, y)içinde karışıklığa neden olur

(1)   # 1 -- no tuple Mister!
(1,)  # (1,)
(1,2) # (1, 2)
1,2   # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]

Ancak bu yana printbir olan özel bir sözdizimi beyanı / dilbilgisi yapısı daha sonra Python 2.x o davranır, parantez olmadan ,ve - 'özel biçimde s gelmez bir Tuple oluşturun. İfadenin bu özel muamelesi print, bir takip olup olmadığına bakılmaksızın farklı davranmasını sağlar ,.

Mutlu kodlamalar.


* printPython 2'deki bu davranış Python 3'ün davranışına değiştirilebilir:

from __future__ import print_function

3
(expr) != tupleAçıklama için teşekkürler :-)
Hubro

5

Hepsi çok basit ve ileriye ya da geriye dönük uyumlulukla ilgisi yok.

printSürüm 3'ten önceki tüm Python sürümlerindeki ifadenin genel formu şöyledir:

print expr1, expr2, ... exprn

(Her ifade sırayla değerlendirilir, bir dizeye dönüştürülür ve aralarında boşluk bırakılarak görüntülenir.)

Ancak bir ifadenin etrafına parantez koymanın hala aynı ifade olduğunu unutmayın.

Yani bunu şu şekilde de yazabilirsiniz:

print (expr1), (expr2), ... (expr3)

Bunun bir işlevi çağırmakla ilgisi yoktur.


Bu tamamen doğru bir cevap, neden bu kadar olumsuz oy verildiğinden de emin değilim.
Martijn Pieters

Konu değil print (expr1), (expr2), ... (expr3), print (expr1, expr2, ... , expr3)python 2.x'te neden yasal olduğu ve 2.x standartlarına göre olmaması gerektiği ile ilgili.
vinnief

5

UTF-8 söz konusu olduğunda burada ilginç bir yan etkimiz var.

>> greek = dict( dog="σκύλος", cat="γάτα" )
>> print greek['dog'], greek['cat']
σκύλος γάτα
>> print (greek['dog'], greek['cat'])
('\xcf\x83\xce\xba\xcf\x8d\xce\xbb\xce\xbf\xcf\x82', '\xce\xb3\xce\xac\xcf\x84\xce\xb1')

Son baskı onaltılık bayt değerlerine sahip tuple'dır.


7
Sanırım bunun nedeni print UTF-8'i doğru şekilde yazdırıyor, ancak son baskınız gibi bir demet aldığında reprüzerinde çalışıyor, bu noktada muhtemelen diktedeki tüm dizeleri ASCII'ye kodluyor.
Hubro

3
@Codemonkey, repr konusunda haklısınız . ASCII hakkında yanılıyorsunuz. ASCII, Python için varsayılan kodlamadır. Ama Python betiğinin başında #encoding=utf-8linux env var LANG=en_US.UTF-8. Dolayısıyla repr kodlaması varsayılan ASCII'yi değil, utf-8 kodlamasını kullanır.
Karlo Smid

1
Repr kodlaması strözel string_escapekodlama ile yapılır. Dize zaten UTF-8 olarak unicode olarak kodlanmıştı.
tzot

@KarloSmid: Demek istediğim ne oldu reprmuhtemelen metin sağlamak için adımlar atıyor olabilir dize olmasının gerekmediği, (ASCII olmayan semboller kaçan vasıtasıyla) ASCII ile temsil edilebilir olduğu ASCII olarak kodlanmış. Yine de bunun tamamen doğru olup olmadığını hala bilmiyorum.
Hubro

Tüm Python kapsayıcıları (list, dict, tuple, set), repr()bir dizeye dönüştürüldüğünde içeriklerini çıktı olarak dahil eder ( __str__yalnızca uygulamazlar __repr__). Gördükleriniz UTF-8'e özel değildir; repr()Bir dize size ASCII güvenli geçerli Python dize hazır verir.
Martijn Pieters

2

Temel olarak Python 3'ten önceki Python'da print, argüman olarak alındığında tüm dizeleri yazdıran özel bir ifadeydi. Yani print "foo","bar"basitçe "print 'foo' ve ardından 'bar'" demek istedim. Sorun şu ki bu baskı bir işlev gibi davranmaya cazip oldu, ve o zamandan beri Python dilbilgisi, bu konuda belirsiz (a,b)içeren bir başlık olur ave bancak foo(a,b)iki bağımsız değişkenlerin bir fonksiyonu için bir çağrıdır.

Böylece, programları daha az belirsiz ve daha düzenli hale getirmek için 3 için uyumsuz değişikliği yaptılar.

(Aslında bence 2.7, 2.6'nın bu konuda yaptığı gibi davranıyor, ancak emin değilim.)


Hayır, onu bir işlev olarak kullanmak "cazip" değildi. :) Ancak, bunu bir işlev olarak kullanmak imkansızdı, bu nedenle örneğin [alist'te x için x'i yazdır] yapamazsınız.
Lennart Regebro
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.