Dalam Python 2.7, kedua hal berikut akan melakukan hal yang sama
print("Hello, World!") # Prints "Hello, World!"
print "Hello, World!" # Prints "Hello, World!"
Namun berikut ini tidak akan
print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")
print "Hello,", "World!" # Prints the words "Hello, World!"
Di Python 3.x, tanda kurung on print
adalah wajib, pada dasarnya menjadikannya sebuah fungsi, tetapi di 2.7 keduanya akan bekerja dengan hasil yang berbeda. Apa lagi yang harus saya ketahui tentang print
Python 2.7?
python
printing
python-3.x
python-2.7
Hubro
sumber
sumber
print
sebenarnya pernyataan khusus, bukan fungsi. Ini juga mengapa itu tidak bisa digunakan seperti:lambda x: print x
Catatan itu(expr)
tidak membuat Tuple (itu menghasilkanexpr
), tetapi,
tidak.from __future__ import print_function
Jawaban:
Dalam Python 2.x
print
sebenarnya pernyataan khusus dan bukan fungsi *.Ini juga mengapa tidak bisa digunakan seperti:
lambda x: print x
Perhatikan bahwa
(expr)
tidak membuat Tuple (itu menghasilkanexpr
), tetapi,
tidak. Ini mungkin menghasilkan kebingungan antaraprint (x)
danprint (x, y)
dengan Python 2.7Namun, karena
print
merupakan sintaks khusus pernyataan / tata bahasa konstruksi di Python 2.x kemudian, tanpa kurung, itu memperlakukan,
's dengan cara khusus - dan tidak membuat Tuple. Perlakuan khusus terhadapprint
pernyataan tersebut memungkinkannya untuk bertindak secara berbeda jika ada jejak,
atau tidak.Selamat membuat kode.
*
print
Perilaku di Python 2 ini dapat diubah menjadi perilaku Python 3:sumber
(expr) != tuple
penjelasannya :-)Semuanya sangat sederhana dan tidak ada hubungannya dengan kompatibilitas maju atau mundur.
Bentuk umum
print
pernyataan di semua versi Python sebelum versi 3 adalah:(Setiap ekspresi pada gilirannya dievaluasi, diubah menjadi string dan ditampilkan dengan spasi di antara ekspresi tersebut.)
Tapi ingat bahwa meletakkan tanda kurung di sekitar ekspresi masih merupakan ekspresi yang sama.
Jadi Anda juga bisa menulis ini sebagai:
Ini tidak ada hubungannya dengan memanggil suatu fungsi.
sumber
print (expr1), (expr2), ... (expr3)
, ini tentang mengapaprint (expr1, expr2, ... , expr3)
legal di python 2.x sementara seharusnya tidak sesuai dengan standar 2.x.Di sini kami memiliki efek samping yang menarik dalam hal UTF-8.
Cetakan terakhir adalah tupel dengan nilai byte heksadesimal.
sumber
repr
di atasnya, pada titik itu mungkin mengkodekan semua string dalam dict ke ASCII.#encoding=utf-8
, linux envLANG=en_US.UTF-8
. Jadi encoding repr tidak menggunakan default ASCII, tetapi encoding utf-8.str
denganstring_escape
pengkodean khusus . String tersebut sudah dienkode unicode sebagai UTF-8.repr
mungkin mengambil langkah-langkah untuk memastikan bahwa teks dapat diwakili oleh ASCII (dengan cara melarikan diri simbol non-ASCII), belum tentu bahwa string adalah dikodekan sebagai ASCII. Saya masih tidak tahu apakah itu sepenuhnya akurat.repr()
output ketika diubah menjadi string (mereka tidak diimplementasikan__str__
, hanya__repr__
). Apa yang Anda lihat tidak istimewa bagi UTF-8; therepr()
of a string memberi Anda literal string Python yang valid yang aman ASCII.Pada dasarnya di Python sebelum Python 3, print adalah pernyataan khusus yang mencetak semua string jika didapat sebagai argumen. Jadi
print "foo","bar"
sederhananya berarti "cetak 'foo' diikuti dengan 'bar'". Masalahnya adalah tergoda untuk bertindak seolah-olah print adalah sebuah fungsi, dan tata bahasa Python ambigu tentang itu, karena(a,b)
tupel berisia
danb
tetapifoo(a,b)
merupakan panggilan ke fungsi dari dua argumen.Jadi mereka membuat perubahan yang tidak kompatibel untuk 3 agar program tidak terlalu ambigu dan lebih teratur.
(Sebenarnya, saya pikir 2,7 berperilaku seperti yang dilakukan 2,6 dalam hal ini, tapi saya tidak yakin.)
sumber