Perbezaan antara versi Python2.x dan 3.x


Versi 3.0 Python selalunya dipanggil Python 3000, atau singkatannya Py3k. Ini adalah peningkatan besar berbanding dengan versi Python yang lebih awal.

Untuk tidak membawa terlalu banyak beban, Python 3.0 tidak direka bentuk dengan mengambil kira keserasian ke bawah.

Banyak atur cara yang direka untuk versi Python terdahulu tidak dapat dijalankan dengan betul pada Python 3.0.

Untuk menjaga atur cara sedia ada, Python 2.6 ialah versi peralihan yang pada asasnya menggunakan sintaks dan perpustakaan Python 2.x Ia juga mempertimbangkan pemindahan kepada Python 3.0 dan membenarkan penggunaan beberapa Python 3.0 sintaks dan fungsi.


Atur cara Python baharu disyorkan untuk menggunakan sintaks Python versi 3.0.


Melainkan persekitaran pelaksanaan tidak dapat memasang Python 3.0 atau program itu sendiri menggunakan perpustakaan pihak ketiga yang tidak menyokong Python 3.0. Perpustakaan pihak ketiga yang pada masa ini tidak menyokong Python 3.0 termasuk Twisted, py2exe, PIL, dll.

Kebanyakan perpustakaan pihak ketiga bekerja keras untuk serasi dengan versi Python 3.0. Walaupun Python 3.0 tidak boleh digunakan serta-merta, adalah disyorkan untuk menulis program yang serasi dengan Python 3.0 dan kemudian melaksanakannya menggunakan Python 2.6 atau Python 2.7.

Perubahan dalam Python 3.0 terutamanya dalam aspek berikut:


fungsi cetak

Pernyataan cetakan hilang dan digantikan dengan fungsi print(). Python 2.6 dan Python 2.7 sebahagiannya menyokong bentuk sintaks cetakan ini. Dalam Python 2.6 dan Python 2.7, tiga bentuk berikut adalah setara:

print "fish"
print ("fish") #注意print后面有个空格
print("fish") #print()不能带有任何其它参数

Walau bagaimanapun, Python 2.6 sebenarnya menyokong sintaks print() baharu:

from __future__ import print_function
print("fish", "panda", sep=', ')

Unicode

Python 2 mempunyai jenis ASCII str(), unicode() adalah berasingan, bukan jenis byte.

Kini, dalam Python 3, kami akhirnya mempunyai rentetan Unicode (utf-8), dan kelas bait: bait dan bait.


Memandangkan fail kod sumber Python3.X menggunakan pengekodan utf-8 secara lalai, ini menjadikan kod berikut sah:

>>> 中国 = 'china' 
>>>print(中国) 
china

Python 2.x

>>> str = "我爱北京天安门"
>>> str
'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
>>> str = u"我爱北京天安门"
>>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'

Python 3.x

>>> str = "我爱北京天安门"
>>> str
'我爱北京天安门'

Operasi pembahagian

Pembahagian dalam Python adalah sangat canggih berbanding bahasa lain, dan mempunyai set peraturan yang sangat rumit. Bahagian dalam Python mempunyai dua pengendali, / dan //

Pertama sekali, /division:

Dalam python 2.x, /division sama seperti kebanyakan bahasa​​​yang biasa kita kenali dengan, seperti Java dan C adalah serupa Hasil pembahagian integer ialah integer, dan bahagian perpuluhan diabaikan sepenuhnya.

Dalam python 3.x/division tidak lagi melakukan ini untuk pembahagian antara integer, hasilnya juga akan menjadi nombor titik terapung.

Python 2.x:

>>> 1 / 2
0
>>> 1.0 / 2.0
0.5

Python 3.x:

>>> 1/2
0.5

Bagi //pembahagian, bahagian ini dipanggil pembahagian lantai, dan hasil pembahagian akan dilakukan secara automatik Operasi lantai yang konsisten dalam Python 2.x dan Python 3.x.

python 2.x:

>>> -1 // 2
-1

python 3.x:

>>> -1 // 2
-1

Perhatikan bahawa bahagian perpuluhan tidak dibuang, tetapi operasi lantai dilakukan jika anda mahu memintas bahagian perpuluhan , maka anda perlu menggunakan fungsi trunc modul matematik

python 3.x:

>>> import math
>>> math.trunc(1 / 2)
0
>>> math.trunc(-1 / 2)
0

Exception

Pengendalian pengecualian juga telah berubah sedikit dalam Python 3. Dalam Python 3 kini kita gunakan sebagai kata kunci. Sintaks untuk menangkap pengecualian dalam

ditukar daripada kecuali exc, var kepada kecuali exc sebagai var.

Gunakan sintaks kecuali (exc1, exc2) sebagai var untuk menangkap berbilang kategori pengecualian pada masa yang sama. Python 2.6 sudah menyokong kedua-dua sintaks.

  • 1 Dalam era 2.x, semua jenis objek boleh dilontar secara langsung Dalam era 3.x, hanya objek yang diwarisi daripada BaseException.

  • 2.x raise statement menggunakan koma untuk memisahkan jenis objek yang dilemparkan dan parameter 3.x membatalkan kaedah penulisan pelik ini dan terus memanggil pembina untuk membuang objek .


Dalam era 2.x, pengecualian dalam kod bukan sahaja mewakili ralat program, tetapi juga sering melakukan perkara yang struktur kawalan biasa perlu lakukan. Dalam 3 Ia boleh dilihat daripada .x bahawa pereka bentuk telah membuat pengecualian lebih khusus Hanya apabila ralat berlaku, ia boleh dikendalikan dengan pernyataan penangkapan pengecualian.


xrange

Dalam Python 2, penggunaan xrange() untuk mencipta objek boleh lelaran adalah sangat popular. Contohnya: untuk pemahaman gelung atau senarai/set/kamus.

Ini berkelakuan seperti penjana (iaitu "penilaian malas"). Tetapi xrange-iterable ini adalah tidak terhingga, bermakna anda boleh melintasi tanpa had.

Disebabkan penilaiannya yang malas, fungsi xrange() adalah lebih pantas daripada range() jika anda perlu mengulanginya sekali sahaja (seperti gelung for). Walau bagaimanapun, daripada mengulang sekali, anda tidak disyorkan untuk mengulang beberapa kali kerana penjana bermula dari awal setiap kali.

Dalam Python 3, range() dilaksanakan seperti xrange() supaya fungsi xrange() khusus tidak lagi wujud (dalam Python 3 xrange() membuang pengecualian bernama).

import timeit

n = 10000
def test_range(n):
    return for i in range(n):
        pass

def test_xrange(n):
    for i in xrange(n):
        pass

Python 2

print 'Python', python_version()

print '\ntiming range()' 
%timeit test_range(n)

print '\n\ntiming xrange()' 
%timeit test_xrange(n)

Python 2.7.6

timing range()
1000 loops, best of 3: 433 µs per loop


timing xrange()
1000 loops, best of 3: 350 µs per loop

Python 3

print('Python', python_version())

print('\ntiming range()')
%timeit test_range(n)

Python 3.4.1

timing range()
1000 loops, best of 3: 520 µs per loop
rrree

Perwakilan literal oktal

Nombor oktal mesti ditulis sebagai 7 tidak boleh dalam bentuk 777, digunakan ; binari mesti ditulis sebagai 0b111.

Fungsi bin() baharu ditambah untuk menukar integer kepada rentetan binari. Python 2.6 sudah menyokong kedua-dua sintaks.

Dalam Python 3.x, hanya ada satu cara untuk mewakili literal oktal, iaitu 0o1000.

python 2.x

print(xrange(10))
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-5d8f9b79ea70> in <module>()
----> 1 print(xrange(10))

NameError: name 'xrange' is not defined

python 3.x

>>> 0o1000
512
>>> 01000
512

operator ketidaksamaan

Terdapat dua operator ketaksamaan dalam Python 2.x Di sana ialah dua cara penulisan != dan <>

Dalam Python 3.x, <> dialih keluar dan hanya ada satu cara penulisan != tabiat menggunakan <>


Ungkapan repr ``

Kunci belakang `` dalam Python 2.x adalah bersamaan dengan peranan fungsi repr

Ini telah dialih keluar dalam Python 3.x Cara penulisan ini hanya membenarkan penggunaan fungsi repr Adakah ini dilakukan untuk menjadikan kod kelihatan lebih jelas? Walau bagaimanapun, saya merasakan bahawa terdapat sangat sedikit peluang untuk menggunakan repr Ia biasanya hanya digunakan apabila menyahpepijat Kebanyakan masa, fungsi str masih digunakan untuk menerangkan objek dengan rentetan.

>>> 01000
  File "<stdin>", line 1
    01000
        ^
SyntaxError: invalid token
>>> 0o1000
512

Berbilang modul telah dinamakan semula (mengikut PEP8)

旧的名字新的名字
_winregwinreg
ConfigParserconfigparser
copy_regcopyreg
Queuequeue
SocketServersocketserver
reprreprlib

Modul StringIO kini digabungkan ke dalam modul io baharu. Modul baharu, md5, gopherlib dan lain-lain telah dipadamkan. Python 2.6 sudah pun menyokong modul io baharu.

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib digabungkan ke dalam pakej http.

Penyata exec dibatalkan, hanya meninggalkan fungsi exec(). Python 2.6 sudah menyokong fungsi exec().


5. Jenis data

1) Py3.X telah mengalih keluar jenis panjang, dan kini hanya terdapat satu jenis integer - int, tetapi ia berkelakuan seperti versi 2.X panjang

2) Jenis bait baharu ditambah, sepadan dengan rentetan oktet versi 2.X Kaedah mentakrifkan literal bait adalah seperti berikut:

def sendMail(from_: str, to: str, title: str, body: str) -> bool:
    pass

objek str dan objek bait. boleh digunakan. Kaedah encode() (str -> bytes) atau .decode() (bait -> str) menukar satu sama lain.

>>> b = b'china' 
>>> type(b) 
<type 'bytes'>

3) kaedah .keys(), .items dan .values() dict mengembalikan iterator, manakala iterkeys() dan fungsi lain telah ditinggalkan. Turut dikeluarkan ialah dict.has_key(), gantikan dengan in.