Perubahan Python 2.x.x dengan Python 3.x.x & Cara menukar Python 2.x.x kepada Python 3.x.x

Penulis:Mimpi kecil, Dicipta: 2016-10-09 12:36:49, Dikemas kini: 2017-10-11 10:18:05

Perbezaan, perubahan, dan sintaks antara python2 dan Python3

Hampir semua program Python 2 memerlukan beberapa pengubahsuaian untuk berjalan dengan baik dalam persekitaran Python 3. Untuk mempermudah proses penukaran ini, Python 3 membawa skrip utiliti yang dipanggil 2to3, yang akan mengambil fail sumber program Python 2 anda sebagai input dan kemudian mengubahnya secara automatik ke bentuk Python 3. Kajian kes: memindahkan chardet ke Python 3 menerangkan bagaimana menjalankan skrip ini, dan kemudian menunjukkan beberapa keadaan yang tidak dapat diperbaiki secara automatik. Lampiran ini menerangkan apa yang dapat diperbaiki secara automatik.

  • Perkataan print

Dalam Python 2, print adalah satu statement. Apa sahaja yang anda ingin keluarkan, anda boleh meletakkan mereka di belakang kata kunci print. Dalam Python 3, print adalah fungsi. Seperti fungsi lain, print memerlukan anda untuk menghantar apa yang anda ingin keluarkan sebagai parameter.

Nota Python 2 Python 3
cetakan print ((()
cetak 1 cetakan ((1)
1,2 cetakan cetakan ((1,2)
cetak 1,2, print ((1,2,end= ")
print >>sys.stderr,1,2,3 print ((1,2,3, fail=sys.stderr)

1, untuk mengeluarkan baris kosong, print tanpa parameter perlu dipanggil. 2, Untuk mengeluarkan nilai yang berasingan, anda perlu menggunakan nilai ini sebagai parameter print (). 3. Untuk output menggunakan dua nilai yang dipisahkan oleh ruang kosong, anda boleh memanggil print ((() dengan dua parameter. Contoh ini mempunyai beberapa trik. Pada Python 2, jika anda menggunakan koma sebagai akhir print statement, ia akan mengeluarkan hasil dengan ruang terpisah dan kemudian mengeluarkan ruang yang diteruskan tanpa mengeluarkan carriage return. Pada Python 3, kesan yang sama dapat dicapai dengan menyampaikan end= sebagai parameter kata kunci kepada print. Nilai lalai parameter end adalah \n, jadi dengan menetapkan semula nilai parameter end, anda boleh membatalkan tanda keluar pada akhir. 5. Dalam Python 2, anda boleh mengalihkan output ke paip dengan menggunakan tatabahasa >pipe_name, seperti sys.stderr. Dalam Python 3, anda boleh melakukan perkara yang sama dengan menyampaikan paip sebagai nilai file parameter kata kunci kepada print. Nilai lalai file parameter adalah std.stdout, jadi menetapkan semula nilainya akan membuat output print () ke paip lain.

  • Senar Unicode

Python 2 mempunyai dua jenis tali:Senar UnicodedanSenar bukan Unicode◎ Python 3 hanya mempunyai satu jenis:String Unicode

Nota Python 2 Python 3
Papaya Whip Papaya Whip
urPapayaWhip\foo rPapayaWhip\foo

String Unicode dalam Python 2 adalah strings biasa dalam Python 3, kerana dalam Python 3 strings sentiasa dalam bentuk Unicode. Senar asli Unicode ((raw string) ((dengan menggunakan senar ini, Python tidak akan secara automatik menterjemahkan kebalik slope") juga digantikan sebagai senar biasa, kerana di Python 3, semua senar asli dikodkan dalam Unicode.

  • Fungsi Unicode global

Python 2 mempunyai dua fungsi global yang boleh memaksa objek untuk ditukar menjadi tali: unicode (() mengubah objek menjadi tali Unicode, dan str (() mengubah objek menjadi tali bukan Unicode. Python 3 hanya mempunyai satu jenis tali, tali Unicode, jadi str (() berfungsi untuk menyelesaikan semua fungsi.Fungsi unicode ((() tidak lagi wujud di Python 3.)

Nota Python 2 Python 3
Unicode ((apa sahaja) apa-apa pun.
  • long bentuk bulat panjang

Python 2 mempunyai jenis int dan long yang disediakan untuk bilangan tidak berpendar. Maksimum jenis int tidak boleh melebihi sys.maxint, dan maksimum ini berkaitan platform. Integer panjang boleh ditakrifkan dengan menambahkan L di akhir nombor, yang jelas lebih besar daripada jumlah yang dinyatakan oleh jenis int. Dalam Python 3, hanya ada satu jenis integer int, yang dalam kebanyakan kes menyerupai integer panjang dalam Python 2. Oleh kerana kedua-dua jenis integer tidak ada lagi, tidak perlu menggunakan tatabahasa khas untuk membezakan mereka.

Baca lebih lanjut: PEP 237: Kesatuan bentuk panjang dan bentuk keseluruhan.

Nota Python 2 Python 3
x = 1000000000000L x = 1000000000000
x = 0xFFFFFFFFFFFFL x = 0xFFFFFFFFFF
panjang ((x) int(x)
jenis ((x) adalah panjang jenis ((x) ialah int
isinstance ((x,panjang) isinstance ((x,int)

Dalam Python 2, integer decimal telah digantikan dengan bilangan bulat biasa decimal pada Python 3. Integer berangka 16 dalam Python 2 digantikan dengan integer biasa berangka 16 dalam Python 3. Dalam Python 3, kerana bentuk bulat tidak lagi wujud, bentuk bulat tidak lagi wujud.Fungsi long ((() semula jadi juga tidak ada. Untuk memaksa penukaran suatu pembolehubah kepada integer, fungsi int ((() boleh digunakan.Saya tidak tahu. Memeriksa sama ada satu pembolehubah adalah bulat, mendapatkan jenis datanya, dan membandingkannya dengan jenis int (bukan panjang). Anda juga boleh menggunakan fungsi istance (() untuk memeriksa jenis data; sekali lagi, int, bukan long, digunakan untuk memeriksa jenis integer.

  • Operator perbandingan <>

Python 2 menyokong <> sebagai sinonim!=. Python 3 hanya menyokong!=, dan tidak lagi menyokong <>.

Nota Python 2 Python 3
jika x <> y: jika x!= y:
jika x <> y <> z: jika x!= y!= z:

1, perbandingan mudah. 2, perbandingan antara tiga nilai yang agak kompleks.

  • Kaedah kelas kamus has_key ((()

Dalam Python 2, kaedah has_key untuk objek kamus digunakan untuk menguji sama ada kamus mengandungi kunci tertentu. Python 3 tidak lagi menyokong kaedah ini.dalamOperator.

Nota Python 2 Python 3
a_dictionary.has_key ((PapayaWhip) PapayaWhip dalam kamus
a_dictionary.has_key ((x) atau a_dictionary.has_key ((y) x dalam kamus atau y dalam kamus
a_dictionary.has_key ((x atau y) (x atau y) dalam kamus
a_dictionary.has_key ((x + y) (x + y) dalam kamus
x + a_dictionary.has_key(y) x + (y dalam kamus)

1, bentuk yang paling mudah. 2 ∞, dan keutamaan operator or adalah lebih rendah daripada operator in, jadi tidak perlu menambahkan tanda kurung di sini. 3. Sebaliknya, untuk sebab yang sama, keutamaan or adalah lebih rendah daripada in, di mana kurung perlu ditambahkan. Nota: Kod di sini sama sekali berbeza dengan baris sebelumnya. Python akan menerangkan x atau y terlebih dahulu dan mendapat hasil x (jika nilai x dalam konteks boolean adalah benar) atau y. Kemudian Python memeriksa sama ada hasil ini adalah kunci dalam a_dictionary). Operator in mempunyai keutamaan yang lebih rendah daripada operator +, jadi bentuk ini dalam kod secara teknikal tidak memerlukan tanda kurung, tetapi 2to3 masih ditambah. 5, bentuk ini mesti memerlukan tanda kurung kerana keutamaan in adalah lebih rendah daripada +.

  • Kaedah kelas kamus untuk mengembalikan senarai

Dalam Python 2, nilai pulangan banyak kaedah dictionary adalah senarai; yang paling biasa digunakan ialah kunci, item, dan nilai; dalam Python 3, nilai pulangan semua kaedah di atas ditukar kepada pandangan dinamik; dalam beberapa persekitaran konteks, perubahan ini tidak memberi kesan; jika nilai pulangan kaedah tersebut dihantar kepada fungsi lain dengan segera, dan fungsi itu akan melintasi seluruh barisan, maka nilai pulangan kaedah tersebut adalah senarai atau pandangan dan tidak akan menghasilkan apa-apa perbezaan; dalam beberapa kes lain, hubungan Python 3; harapan yang besar adalah bahawa jika anda mempunyai senarai elemen yang boleh dihubungi secara bebas, maka perubahan dalam Python 3 akan membuat kod anda terjebak, kerana pandangan grafik tidak menyokong indeksasi.

Nota Python 2 Python 3
a_dictionary.keys() senarai (a_dictionary.keys)
a_dictionary.items() senarai ((a_dictionary.items())
a_dictionary.iterkeys() iter ((a_dictionary.keys())
[i untuk iin a_dictionary.iterkeys() ] [i untuk iin a_dictionary.keys() ]
min(a_dictionary.keys()) tiada perubahan

1, menggunakan fungsi list ((() untuk menukar nilai pulangan keys ((() ke dalam senarai statik. Untuk alasan keselamatan, 2to3 mungkin akan memberikan kesalahan. Kod ini berkesan, tetapi ia agak kurang cekap untuk menggunakan pandangan. Anda harus memeriksa kod yang ditukar untuk melihat sama ada anda pasti memerlukan senarai, dan mungkin pandangan juga dapat melakukan kerja yang sama. 2, ini adalah pandangan lain (untuk kaedah item) untuk menukar ke dalam senarai. Cara 2to3 untuk nilai juga akan mengembalikan nilai. 3, Python 3 tidak lagi menyokong iterkeys. Jika perlu, gunakan iter untuk menukar nilai pulangan keys ke iterator. 4, 2to3 dapat mengenal pasti kaedah iterkeys (,) yang digunakan dalam analisis senarai, dan mengubahnya menjadi keys (,) kaedah ( (,) yang tidak memerlukan penggunaan tambahan iter (,) untuk membungkus nilai pulangnya). 5, 2to3 juga dapat mengenal pasti bahawa nilai pulangan dari kaedah keys (() akan dihantar kepada fungsi lain yang akan melintasi keseluruhan siri, jadi tidak perlu menukar nilai pulangan keys (() ke senarai terlebih dahulu. Sebaliknya, fungsi min (()) akan dengan senang hati melintasi pandangan. Proses ini sama berkesan untuk min ((), max ((), sum ((), tuple ((), setlist ((), sorted ((), any (() dan all (()).

  • Modul yang dinamakan semula atau disusun semula

Dari Python 2 ke Python 3, beberapa modul dalam perpustakaan standard telah dinamakan semula. Beberapa modul yang berkaitan antara satu sama lain juga telah digabungkan atau disusun semula untuk membuat hubungan ini lebih logik.

  • http Dalam Python 3, beberapa modul HTTP yang berkaitan dikumpulkan menjadi satu pakej yang berasingan, iaitu http.
Nota Python 2 Python 3
import httplib Import http.client
Import Kuki Import http.cookies
import cookielib Import http.cookiejar
Import BaseHTTPServer
import SimpleHTTPServer
import CGIHttpServer
Import http.server

Modul http.client melaksanakan perpustakaan bawah yang boleh digunakan untuk meminta sumber HTTP dan menganalisis tindak balas HTTP. Modul http.cookies menyediakan antara muka Python yang menyeronokkan untuk mendapatkan kuki yang dihantar melalui header HTTP Set-Cookie Penyemak imbas yang biasa digunakan menyimpan kuki dalam bentuk fail pada cakera, dan modul http.cookiejar boleh mengendalikan fail ini. Modul http.server melaksanakan pelayan HTTP asas

  • urllib Python 2 mempunyai beberapa modul yang digunakan untuk menganalisis, mengkod dan mendapatkan URL, tetapi modul-modul ini saling bertindih seperti jaring tikus. Dalam Python 3, modul-modul ini disusun semula, digabungkan ke dalam satu pakej yang berasingan, urllib.
Nota Python 2 Python 3
import urllib import urllib.request
urllib.parse,urllib.error
import urllib2 import urllib.request
urllib.error
import urlparse import urllib.parse
Import robotparser Import urllib.robotparser
dari urllib import FancyURLopener
dari urllib import urlencode
daripada urllib.request import FancyURLopener
dari urllib.parse import urlencode
daripada urllib2 import Permintaan
daripada urllib2 import HTTPError
daripada urllib.request import Permintaan
dari urllib.error import HTTPError

Sebelum ini, modul urllib dalam Python 2 mempunyai pelbagai fungsi, termasuk urlopen yang digunakan untuk mendapatkan data, dan berguna untuk membahagikan URL ke dalam fungsi splittype (), splithost (), dan splituser (). Dalam pakej urllib baru, fungsi-fungsi ini dianjurkan dengan lebih logik. 2to3 akan mengubah panggilan fungsi-fungsi ini untuk menyesuaikan skema penamaan baru. Dalam Python 3, modul urllib2 terdahulu telah disatukan ke dalam pakej urllib. Pada masa yang sama, pelbagai perkara kegemaran anda dalam urllib2 akan muncul secara bersama-sama dalam modul urllib Python 3, seperti kaedah build_opener (), objek permintaan, HTTPBasicAuthHandler dan rakan-rakan. Modul urllib.parse dalam Python 3 mengandungi semua fungsi analisis dalam modul urlparse pada Python 2. Modul urllib.robotparse menganalisis fail robots.txt. Kelas FancyURLopener yang menangani pengalihan HTTP dan kod keadaan lain masih sah dalam modul urllib.request dalam Python 3. Fungsi urlencode telah dipindahkan ke urllib.parse. Objek permintaan masih sah di urllib.request, tetapi konstanta seperti HTTPError telah dipindahkan ke urllib.error. Adakah saya pernah menyebut 2to3 akan menulis semula panggilan fungsi anda? Sebagai contoh, jika anda mengimport modul urllib dalam kod Python 2 anda dan memanggil urllib.urlopen () fungsi untuk mendapatkan data, 2to3 akan mengubah kata import dan panggilan fungsi pada masa yang sama.

Nota Python 2 Python 3
import urllib print urllib.urlopen"http://diveintopython3.org/’) baca ()) import urllib.request, urllib.parse, urllib.error
print ((urllib.request.urlopen))"http://diveintopython3.org/’.baca.
  • dbm Semua klon DBM kini berada dalam satu pakej yang berasingan, iaitu dbm. Jika anda memerlukan salah satu varian tertentu, seperti GNUDBM, anda boleh mengimport modul yang sesuai ke dalam pakej dbm.
Nota Python 2 Python 3
import dbm import dbm.ndbm
import gdbm importdbm.gnu
import dbhash Import dbm.bsd
import dumbdbm Import dbm.dumb
import mana-mana
import mana-mana
import dbm
  • xmlrpc XML-RPC adalah satu kaedah ringan untuk menjalankan panggilan RPC jauh melalui protokol HTTP. Beberapa perisian pelayan XML-RPC dan pelayan XML-RPC kini digabungkan ke dalam pakej berasingan, iaitu xmlrpc.
Nota Python 2 Python 3
Import xmlrpclib Import xmlrpc.client
import DocXMLRPCServer
import SimpleXMLRPCServer
Import xmlrpc.server
  • Modul lain

Nota Python 2 Python 3
cuba:
import cStringIO sebagai StringIO
kecuali ImportError:
import StringIO
Pengimportan
cuba:
import cPickle sebagai acar
kecuali ImportError:
import acar
acar import
import _Dibina import bangunan
import copy_reg import copyreg
barisan import barisan import
import SocketServer import socketserver
Import ConfigParser import configparser
import repr import reprlib
perintah import Subproses import

1. Dalam Python 2, anda biasanya akan melakukan ini dengan cuba mengimport cStringIO sebagai pengganti StringIO terlebih dahulu, dan jika gagal, mengimport semula StringIO. Jangan lakukan ini dalam Python 3; modul io akan membantu anda menangani perkara ini. 2. Dalam Python 2, mengimport pelaksanaan pickle terpantas juga merupakan kaedah yang berguna yang serupa dengan di atas. Dalam Python 3, modul pickle akan memprosesnya secara automatik untuk anda, jadi jangan lakukan lagi. Modul builtins mengandungi fungsi global, kelas, dan konstanta yang akan digunakan di seluruh bahasa Python. Menggambarkan semula sesuatu fungsi dalam modul builtins bermaksud menentukan semula fungsi global ini di mana-mana. Ini terdengar kuat, tetapi juga menakutkan. 4. Modul copyreg menambah sokongan untuk modul pickle untuk jenis kustom pengguna yang ditakrifkan dalam bahasa C. 5. Modul queue mewujudkan antrian pengeluar-pengguna (multi-producer, multi-consumer queue). 6. Modul socketserver menyediakan kelas asas umum untuk melaksanakan pelbagai pelayan socket. 7. Modul configparser digunakan untuk menguraikan fail profil INI-style. 8. Modul reprlib mengimplementasikan semula fungsi repr () terbina dalam dan menambah kawalan terhadap panjang yang dinyatakan oleh string sebelum dipotong. 9. Modul subproses membolehkan anda membuat subproses, menyambung ke paip mereka, dan mendapatkan nilai pulangnya.

  • Pengimport relatif dalam pakej

Paket adalah entiti tunggal yang terdiri daripada sekumpulan modul yang berkaitan. Pada masa Python 2, untuk mencapai rujukan antara satu sama lain untuk modul dalam paket yang sama, anda menggunakan import foo atau from foo import Bar.2解释器会先在当前目录里搜索foo.pyPada Python 3, proses ini agak berbeza. Python 3 tidak mencari pada laluan semasa terlebih dahulu, ia akan mencari secara langsung di laluan pencarian Python. Jika anda mahu satu modul dalam pakej mengimport satu lagi modul dalam pakej, anda perlu memberikan laluan relatif kedua-dua modul secara jelas.

Katakan anda mempunyai beberapa fail dalam direktori yang sama seperti berikut:

Chardet/ Perhatikan. ±-mulakan.py Perhatikan.+--konstan.py | +--mbcharsetprober.py | +--universaldetector.py

Sekarang anggaplah universaldector.py memerlukan keseluruhan import constants.py,另外还需要导入mbcharsetprober.py的一个类。你会怎样做?

Nota Python 2 Python 3
konstanta import daripada.import constants
daripada mbcharsetprober import MultiByteCharSetProber dari.mbcharsetprober import MultiByteCharsetProber

1. Apabila anda perlu mengimport keseluruhan modul dari tempat lain dalam pakej, gunakan sintaks baru dari.import.universaldetector.py) dan anda ingin mengimport fail ((constants.pyDalam contoh ini, kedua-dua fail berada di dalam direktori yang sama, jadi tanda baca tunggal digunakan. Anda juga boleh mengimport dari direktori induk ((from... import anothermodule) atau direktori anak. 2. Untuk mengimport kelas atau fungsi tertentu dari modul lain secara langsung ke ruang nama modul anda, tambahkan laluan relatif di hadapan modul yang ingin diimport, dan hilangkan garis slash terakhir. Dalam contoh ini, mbcharsetprober.py dan universaldetector.py berada dalam direktori yang sama, jadi nama laluan relatif adalah koma. Anda juga boleh mengimport dari direktori induk (dari... import anothermodule) atau direktori anak.

  • Kaedah iterator next (((

Dalam Python 2, iterator mempunyai kaedah next (), yang digunakan untuk mengembalikan item seterusnya dalam siri. Dalam Python 3, ini juga berfungsi, tetapi kini terdapat fungsi global baru next (), yang menggunakan iterator sebagai parameter.

Nota Python 2 Python 3
anIterator.next ((() seterusnya ((aniterator)
a_function_that_returns_an_iterator().next() next ((a_function_that_returns_an_iterator())
kelas A:
def seterusnya ((diri):
lulus
kelas A:
def _seterusnya_(sendiri):
kelas A:
def seterusnya ((self, x, y):
lulus
tiada perubahan
seterusnya = 42
untuk an_iterator dalam a_sequence_of_iterators:
an_iterator.next()
seterusnya = 42
untuk an_iterator dalam a_sequence_of_iterators:
an_iterator._seterusnya_()

Contoh yang paling mudah ialah, anda tidak lagi memanggil kaedah next (() pada sebuah iterator, dan anda kini menghantar iterator itu sendiri sebagai parameter kepada fungsi global next (() ‒ 2, jika anda mempunyai nilai yang dikembalikan sebagai fungsi iterator, panggil fungsi ini dan sampaikan hasilnya sebagai parameter kepada fungsi next(((((script 2to3 cukup pintar untuk melakukan penukaran ini dengan betul. 3. jika anda menganggap kelas anda sendiri dan menggunakannya sebagai pengulangan, dalam Python 3, anda boleh menggunakan kaedah khusus untuk menentukanseterusnya_Saya tidak tahu apa yang akan berlaku. 4, jika kelas yang anda tentukan mempunyai next (), ia menggunakan satu atau lebih parameter, 2to3 tidak akan menggerakkannya semasa pelaksanaan. Kelas ini tidak boleh digunakan sebagai pengulangan kerana kaedah next () mempunyai parameter. 5. Ini agak rumit. Jika anda kebetulan mempunyai pembolehubah tempatan yang dipanggil next, dalam Python 3 ia akan mempunyai keutamaan yang lebih tinggi daripada fungsi global next. Dalam kes ini, anda perlu memanggil kaedah khusus iterator.seterusnya_() untuk mendapatkan elemen seterusnya dalam siri tersebut. Atau, anda juga boleh menyusun semula kod agar nama pembolehubah tempatan ini tidak dipanggil next, tetapi 2to3 tidak akan melakukan perkara ini untuk anda.

  • Filter fungsi global (()

Dalam Python 2, kaedah filter ((() mengembalikan senarai yang diperiksa oleh fungsi yang mengembalikan nilai True atau False untuk setiap item dalam siri tersebut. Dalam Python 3, fungsi filter ((() mengembalikan pengulangan dan bukan lagi senarai.

Nota Python 2 Python 3
filter ((a_function, a_sequence) senarai ((filter ((a_function, a_sequence))
senarai ((filter ((a_function, a_sequence)) tiada perubahan
filter ((Tidak ada, a_sequence) [i untuk dalam urutan jika i]
untuk i dalam penapis ((Tidak ada, a_urutan): tiada perubahan
[i untuk dalam penapis ((a_fungsi, a_urutan) ] tiada perubahan

Dalam kes yang paling mudah, 2to3 akan menggunakan fungsi list ((() untuk membungkus filter ((), dan fungsi list (()) akan melalui parameternya dan mengembalikan senarai. 2, Walau bagaimanapun, jika panggilan filter ((() telah diliputi oleh list ((), 2to3 tidak akan memprosesnya lagi, kerana dalam kes ini, sama ada nilai yang dikembalikan oleh filter ((() adalah pengulangan tidak penting. 3. Untuk memproses sintaks khas seperti filter ((None,...), 2to3 akan menukar panggilan ini dari persamaan sintaks kepada pemprosesan senarai. 4. Oleh kerana putaran for akan melintasi keseluruhan siri, tidak perlu melakukan perubahan lagi. 5, sama seperti di atas, tidak perlu dilakukan perubahan, kerana senarai akan diselesaikan di seluruh urutan, walaupun filter () kembali kepada satu pengulangan, ia masih berfungsi dengan baik seperti filter () yang sebelum ini kembali ke senarai.

  • Fungsi global map (((

Seperti perubahan yang dibuat oleh filter (), fungsi map (), kini mengembalikan satu iterator.

Nota Python 2 Python 3
peta ((a_function,PapayaWhip) Senarai (map) fungsi (Papaya Whip)
Peta ((Tidak ada,PapayaWhip) senarai ((PapayaWhip)
peta ((lambda x: x+1,range ((42)) [x+1untuk x dalam julat(42)]
untuk i dalam peta ((a_fungsi, a_urutan): tiada perubahan
[i untuk imej (a_function,a_sequence) ] tiada perubahan

1, sama seperti pengendalian terhadap filter (), dalam kes yang paling mudah, 2to3 menggunakan fungsi list (), untuk membungkus panggilan map (). 2、 untuk map khusus ((None,...) sintaks, seperti filter ((None,...) 2to3 akan menukarnya kepada panggilan setara dengan menggunakan list ((( 3, jika parameter pertama map () adalah fungsi lambda, 2to3 akan menukarnya secara setara kepada pemotongan senarai. 4. Tiada perubahan yang perlu dibuat untuk putaran for yang akan melintasi keseluruhan siri. 5, sekali lagi, tidak perlu diubah di sini kerana senarai akan disemak sepanjang siri, walaupun nilai yang dikembalikan oleh map ((() adalah pengulangan dan bukan senarai, ia akan berfungsi dengan baik.

  • Fungsi reduksi global

Dalam Python 3, fungsi reduce (), yang telah dikeluarkan dari ruang nama global, kini ditempatkan di modul fucntools.

Nota Python 2 Python 3
mengurangkan ((a, b, c) daripada alat fungsi import mengurangkan mengurangkan ((a, b, c)
  • Fungsi global apply ((()

Python 2 mempunyai fungsi global yang dipanggil apply ((), yang menggunakan fungsi f dan senarai [a, b, c] sebagai parameter, dan nilai pulangnya adalah f ((a, b, c)). Anda juga boleh melakukan perkara yang sama dengan memanggil fungsi ini secara langsung dan menambahkan tanda bintang ((*) sebagai parameter yang dihantar kepadanya di hadapan senarai. Dalam Python 3, fungsi apply (() tidak lagi wujud; anda mesti menggunakan tanda bintang.

Nota Python 2 Python 3
apply ((a_function, a_list_of_args) a_function(*a_list_of_args)
apply ((a_function, a_list_of_args, a_dictionary_of_named_args) a_function ((* a_list_of_args,** a_dictionary_of_named_args)
apply ((a_function, a_list_of_args+ z) a_function(*a_list_of_args+ z)
apply ((aModule.a_function, a_list_of_args) aModule.a_function ((* a_list_of_args)

1, dalam bentuk yang paling mudah, fungsi boleh dipanggil dengan menambahkan bintang di hadapan senarai parameter (seperti [a, b, c]). Ini adalah sama dengan fungsi apply (() dalam Python 2. 2. Dalam Python 2, fungsi apply (,) sebenarnya boleh membawa 3 parameter: satu fungsi, satu senarai parameter, dan sebuah kamus nama argumen (). Dalam Python 3, anda boleh menambahkan bintang sebelum senarai parameter ().), penambahan dua bintang ((**) sebelum parameter nama kamus untuk mencapai kesan yang sama. 3. Operator + di sini digunakan sebagai fungsi senarai yang disambungkan dan mempunyai keutamaan yang lebih tinggi daripada operator, jadi tidak perlu menambah kurung tambahan di sekitar a_list_of_args + z. Skrip 4, 2to3 cukup pintar untuk menukar panggilan aplikasi yang rumit, termasuk panggilan fungsi import dalam modul.

  • Fungsi global intern

Dalam Python 2, anda boleh menggunakan fungsi intern untuk mengehadkan fungsi ini pada satu senar untuk mencapai pengoptimuman prestasi. Dalam Python 3, fungsi intern telah dipindahkan ke modul sys.

Nota Python 2 Python 3
intern ((aString) sys.intern ((aString)
  • Perkataan exec

Sama seperti print statements yang menjadi fungsi dalam Python 3, execute statements menggunakan strings yang mengandungi mana-mana kod Python sebagai parameter, dan kemudian mengeksekusi mereka seperti execute statements atau expressions..exec adalah serupa denganeval, tetapi execute adalah lebih kuat dan lebih canggih..eval hanya boleh melaksanakan satu ekspresi tunggal, tetapi execute boleh melaksanakan banyak pernyataan, import, dan fungsi.

Nota Python 2 Python 3
exec codeString exec ((codeString)
exec codeString dalam ruang nama global exec ((codeString, a_global_namespace)
exec codeString dalam ruang nama global, ruang nama tempatan exec ((codeString, a_global_namespace,a_local_namespace)

1, dalam bentuk yang paling mudah, kerana exec ((() kini merupakan fungsi dan bukan pernyataan, 2to3 akan mengelilingi kod dalam bentuk baris ini dengan kurung tanda. 2. Perkataan exec dalam Python 2 boleh menentukan ruang nama, kod akan dilaksanakan dalam ruang peribadi yang terdiri daripada objek global. Python 3 juga mempunyai fungsi ini; anda hanya perlu menyampaikan ruang nama ini sebagai parameter kedua kepada fungsi exec (). 3. Lebih menarik lagi, pernyataan exec dalam Python 2 juga boleh menentukan ruang nama tempatan (seperti pembolehubah yang diisytiharkan dalam fungsi). Dalam Python 3, fungsi exec juga mempunyai fungsi ini.

  • Perkataan execfile

Seperti kata-kata exec sebelum ini, kata-kata execfile dalam Python 2 juga boleh menggunakan string seperti menjalankan kod Python. Perbezaan adalah bahawa exec menggunakan string, sedangkan execfile menggunakan fail. Dalam Python 3, kata-kata execfile telah dihapuskan. Jika anda benar-benar ingin menjalankan kod Python dalam fail (tetapi anda tidak mahu mengimportnya), anda boleh melakukannya dengan membuka fail ini, membaca isinya, dan kemudian memanggil fungsi kompile) global (Python interpreter memaksa kod disusun, dan kemudian memanggil fungsi exec baru).

Nota Python 2 Python 3
execfile ((a_filename) exec(compile(open(a_filename).read(),a_filename,exec))
  • repr (dengan tanda petik)

Dalam Python 2, untuk mendapatkan strings yang mewakili sebarang objek, terdapat satu cara untuk membungkus objek dalam countercitation (misalnyaxDalam Python 3, keupayaan ini masih wujud, tetapi anda tidak boleh lagi menggunakan tanda kutip untuk mendapatkan strings ini; anda perlu menggunakan fungsi global repr ((((().

Nota Python 2 Python 3
`x` repr ((x)
`Papaya Whip + `2` repr ((PapayaWhip+ repr ((2))

1, ingat, x boleh menjadi apa-apa kelas, fungsi, modul, jenis data asas, dan lain-lain.repr () fungsi boleh menggunakan mana-mana jenis parameter. 2, dalam Python 2, countercitation boleh bersarang, menyebabkan ungkapan yang tidak dapat difahami tetapi berkesan ini. 2to3 cukup pintar untuk menukar panggilan bersarang ini kepada fungsi repr.

  • Try...except perkataan

Bahasa yang digunakan untuk menangkap kecacatan mungkin berbeza dari Python 2 ke Python 3.

Nota Python 2 Python 3
cuba:
import mymodule
kecuali ImportError, e
lulus
cuba:
import mymodule
kecuali ImportError sebagai e:
lulus
cuba:
import mymodule
kecuali (RuntimeError, ImportError), e
lulus
cuba:
import mymodule
kecuali (RuntimeError, ImportError) sebagai e:
lulus
cuba:
import mymodule
kecuali ImportError:
lulus
tiada perubahan
cuba:
import mymodule
kecuali:
lulus
tiada perubahan

1, berbanding dengan Python 2 yang menambahkan koma selepas jenis yang luar biasa, Python 3 menggunakan kata kunci baru, as. 2, kata kunci as juga boleh digunakan untuk menangkap pelbagai jenis kelainan pada satu masa. 3. Jika anda menangkap sesuatu yang luar biasa tetapi tidak mahu mengakses objek yang luar biasa itu sendiri, sintaks Python 2 dan Python 3 adalah sama. 4. Begitu juga, jika anda menggunakan kaedah selamat (fallback) untuk menangkap semua kecacatan, sintaks Python 2 dan Python 3 adalah sama. 5. Apabila mengimport modul (atau dalam kebanyakan kes lain), anda tidak boleh menggunakan kaedah ini (menunjukkan fallback di atas); jika tidak, program mungkin menangkap kecacatan seperti KeyboardInterrupt (jika pengguna menekan Ctrl-C untuk mengganggu program), yang menjadikan penyusunan kesalahan lebih sukar.

  • Raise perkataan

Dalam Python 3, terdapat sedikit perubahan dalam tatabahasa untuk membuang kebiasaannya.

Nota Python 2 Python 3
meningkatkan MyException tidak berubah
meningkatkan MyException, pesanan ralat meningkatkan MyException (Mesej ralat)
meningkatkan MyException,pesanan ralat, a_traceback meningkatkan MyException (Mesej ralat).with_traceback (Risalah)
meningkatkan pesan ralat tidak disokong

1. membuang kecacatan yang tidak membawa maklumat yang salah yang disesuaikan oleh pengguna, dalam bentuk yang paling mudah, sintaks tidak berubah. 2, perubahan adalah jelas apabila anda ingin membuang sesuatu yang luar biasa dengan mesej ralat yang disesuaikan pengguna; Python 2 menggunakan koma untuk memisahkan jenis ralat dan mesej ralat; Python 3 menyampaikan maklumat ralat sebagai parameter kepada jenis ralat; 3. Python 2 menyokong sintaks yang lebih kompleks untuk membuang pengecualian dengan jejak tumpukan yang disesuaikan pengguna. Dalam Python 3 anda juga boleh melakukan ini, tetapi sintaksnya sama sekali berbeza. 4. Dalam Python 2, anda boleh membuang pengecualian tanpa kelas pengecualian, hanya satu mesej pengecualian. Dalam Python 3, bentuk ini tidak lagi disokong. 2to3 akan memberi amaran kepada anda bahawa ia tidak dapat membetulkan sintaks ini secara automatik.

  • Kaedah membuang penjana

Dalam Python 2, penjana mempunyai kaedah throw (); memanggil a_generator.throw (); akan melemparkan keanehan apabila penjana dihentikan dan mengembalikan nilai seterusnya yang diambil oleh fungsi penjana. Dalam Python 3, fungsi ini masih boleh digunakan, tetapi sedikit berbeza secara tatabahasa.

Nota Python 2 Python 3
a_generator.throw(MyException) tiada perubahan
a_generator.throw ((MyException, error message) a_generator.throw(MyException(pesan ralat))
a_generator.throw(pesan ralat) tidak disokong

1. Dalam bentuk yang paling mudah, penjana membuang pengecualian yang tidak membawa mesej ralat yang disesuaikan oleh pengguna. Dalam kes ini, tidak ada perubahan dalam tatabahasa dari Python 2 ke Python 3. 2. Jika penjana membuang satu kecacatan dengan mesej ralat yang disesuaikan pengguna, anda perlu menyampaikan string mesej ralat ini kepada kelas kecacatan untuk mencontohkannya. 3. Python 2 juga menyokong membuang pengecualian yang hanya menghantar mesej yang luar biasa. Python 3 tidak menyokong sintaks ini, dan 2to3 akan memaparkan mesej amaran yang memberitahu anda bahawa kod ini perlu diperbaiki secara manual.

  • Fungsi global xrange (()

Dalam Python 2, terdapat dua cara untuk mendapatkan nombor dalam julat tertentu: range (), yang mengembalikan senarai, dan range (), yang mengembalikan pengulangan. Dalam Python 3, range (), yang mengembalikan pengulangan, xrange (), tidak lagi wujud.

Nota Python 2 Python 3
xrange ((10) Julat ((10)
a_list = julat ((10) a_list = senarai (range)
[i untuk dalam xrange(10)] [i untuk julat dalam ((10)]
untuk i dalam julat ((10): tiada perubahan
jumlah (range) tiada perubahan

1, dalam kes yang paling mudah, 2to3 akan menukar xrange (x) kepada range (x). 2, Jika kod Python 2 anda menggunakan range (), 2to3 tidak tahu sama ada anda memerlukan senarai, atau sama ada pengulang juga berfungsi. Sebagai langkah berjaga-jaga, 2to3 mungkin akan memberikan kesalahan, dan kemudian menggunakan list (), memaksa nilai pulangan range ()) menjadi jenis senarai. 3. Jika terdapat fungsi xrange (xrange) dalam pembetulan senarai, tidak perlu menukar nilai pulangnya ke dalam senarai kerana pembetulan senarai adalah sama untuk pengulangan. 4. Begitu juga, loop for juga berfungsi pada pengulang, jadi tidak ada perubahan di sini. 5, fungsi sum () boleh berfungsi pada iterator, jadi 2to3 juga tidak diubah di sini. Sama seperti kaedah kelas kamus yang mengembalikan nilai sebagai pandangan daripada senarai, ini juga berlaku untuk min (), max (), sum (), list (), tuple (), set (), sorted (), any (), all (), dan lain-lain.

  • Fungsi global raw_input (() dan input (())

Python 2 mempunyai dua fungsi global yang digunakan untuk meminta input pengguna pada baris perintah. Yang pertama dipanggil input, yang menunggu pengguna memasukkan ungkapan Python dan kemudian mengembalikan hasil. Yang kedua dipanggilraw_input, yang mengembalikan apa yang dimasukkan oleh pengguna. Ini sangat membingungkan bagi pemula, dan ini secara meluas dilihat sebagai keropok keropok bahasa Python.

Nota Python 2 Python 3
raw_input() input ((()
raw_input ((prompt) input ((prompt)
input ((() nilai (input)

Dalam bentuk yang paling mudah, raw_input (() digantikan dengan input (()). 2, dalam Python 2, fungsi raw_input (() boleh menetapkan isyarat sebagai parameter. Dalam Python 3, fungsi ini dikekalkan. 3. Jika anda benar-benar ingin meminta pengguna memasukkan ungkapan Python, hasil pengiraan boleh dilakukan dengan memanggil fungsi input ((() dan menghantar nilai balik kepada eval ((().

  • Ciri fungsi func_*

Dalam Python 2, kod dalam fungsi boleh mengakses sifat-sifat khas fungsi itu sendiri. Dalam Python 3, sifat-sifat khas ini dinamakan semula untuk keserasian.

Nota Python 2 Python 3
a_function.func_name a_fungsi._Nama_
a_function.func_doc a_fungsi._Doktor.
a_function.func_defaults a_fungsi._default_
a_function.func_dict a_fungsi._Mengambil keputusan
a_function.func_closure a_fungsi._penutupan_
a_function.func_globals a_fungsi._global_
a_function.func_code a_fungsi._kod_

1, sifat __name__ ((asli func_name) mengandungi nama fungsi. 2, _doc__ property ((asli funcdoc) mengandungi string dokumen (docstring) yang anda tentukan dalam kod sumber fungsi 3, _defaults__ property (~ original_func_defaults) adalah satu kumpulan elemen yang menyimpan parameter dengan nilai lalai. 4, _dict__ property ((asli func_dict) adalah ruang nama yang menyokong sifat fungsi apa sahaja. 5. sifat __closure__ (asli function_closure) adalah satu unsur yang terdiri daripada objek sel yang mengandungi pengikat fungsi terhadap pembolehubah bebas. 6. Sifat __globals__ adalah rujukan kepada ruang nama global modul, dan fungsi itu sendiri ditakrifkan dalam ruang nama ini. 7, _code__ property ((originalfunc_code) adalah objek kod yang mewakili badan fungsi yang telah disusun.

  • Kaedah I/O xreadlines

Dalam Python 2, objek fail mempunyai kaedah xreadlines (), yang mengembalikan satu iterator, satu baris membaca fail sekali. Ini sangat berguna dalam loop for. Malah, versi Python 2 kemudian menambah fungsi ini kepada objek fail itu sendiri.

Dalam Python 3, kaedah xreadlines tidak lagi boleh digunakan. 2to3 dapat menyelesaikan keadaan mudah, tetapi beberapa kes pinggir memerlukan campur tangan manusia.

Nota Python 2 Python 3
untuk baris dalam a_file.xreadlines(): untuk baris dalam file:
untuk baris dalam a_file.xreadlines(5): tiada perubahan (rusak)

1, jika anda memanggil xreadlines tanpa parameter sebelumnya, 2to3 akan mengubahnya menjadi objek fail itu sendiri. Dalam Python 3, kod yang ditukar ini dapat melakukan kerja yang sama sebelum ini: membaca satu baris fail sekali, dan kemudian menjalankan putaran putaran for. 2. Jika anda sebelum ini menggunakan satu parameter (bilang baris yang dibaca) untuk memanggil xreadlines (), 2to3 tidak dapat menyelesaikan penukaran dari Python 2 ke Python 3 untuk anda, kod anda akan gagal dengan cara ini: AttributeError: _io.TextIOWrapper object has no attribute xreadlines. Anda boleh mengubah xreadlines secara manual menjadi xreadlines ()) untuk membuat kod berfungsi di Python 3.

  • Fungsi lambda yang menggunakan unsur dan bukan beberapa parameter

Dalam Python 2, anda boleh mentakrifkan fungsi lambda tanpa nama ("anonymous lambda function") dengan menentukan bilangan elemen yang akan digunakan untuk parameter. Sebenarnya, penerjemah Python 2 akan menguraikan parameter ini menjadi parameter yang dinamakan ("named arguments"), dan anda boleh merujuk kepada mereka dalam fungsi lambda ("by name"). Dalam Python 3, anda masih boleh menyampaikan satu parameter sebagai parameter untuk fungsi lambda, tetapi penerjemah Python tidak akan menguraikannya sebagai parameter yang dinamakan ("named parameter").

Nota Python 2 Python 3
lambda (x,): x+ f ((x) lambda x1: x1[0]+f(x1[0])
lambda (x, y): x+f(y) lambda x_y: x_y[0]+f(x_y[1])
lambda (x,(y,z)): x+ y+ z lambda x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1]
lambda x, y, z: x+y + z tidak berubah

1, jika anda telah menentukan fungsi lambda, ia menggunakan unsur yang mengandungi satu unsur sebagai parameter, di Python 3, ia akan ditukar kepada fungsi lambda yang mengandungi rujukan kepada x1[0]; x1 adalah skrip 2to3 yang dihasilkan secara automatik berdasarkan parameter nama dalam unsur asal. 2. Menggunakan satu susun atur yang mengandungi dua elemen (x, y) sebagai parameter, fungsi lambda ditukar kepada x_y, yang mempunyai dua parameter lokasi iaitu x_y[0] dan x_y[1]; Skrip 3, 2to3 bahkan boleh mengendalikan fungsi lambda yang menggunakan parameter nama susun atur sebagai parameternya. Kod hasil yang dihasilkan agak sukar dibaca, tetapi ia mempunyai kesan yang sama di Python 3 seperti kod asal di Python 2. 4, anda boleh mentakrifkan fungsi lambda yang menggunakan pelbagai parameter. Jika tiada kurung di sekeliling parameter, Python 2 akan menganggapnya sebagai fungsi lambda yang mengandungi beberapa parameter; dalam badan fungsi lambda ini, anda merujuk parameter ini dengan nama, seperti yang dilakukan dalam fungsi jenis lain. Senam ini masih berlaku di Python 3.

  • Ciri-ciri kaedah khas

Dalam Python 2, kaedah kelas boleh diakses untuk menentukan objek kelas mereka (class object) dan juga untuk mengakses objek kaedah (method object) itu sendiri. im_self adalah objek contoh kelas; im_func adalah objek fungsi, im_class adalah kelas itu sendiri. Dalam Python 3, sifat-sifat ini dinamakan semula untuk mengikuti konvensyen penamaan sifat lain.

Nota Python 2 Python 3
aClassInstance.aClassMethod.im_func aClassInstance.aClassMethod._fungsi_
aClassInstance.aClassMethod.im_self aClassInstance.aClassMethod._sendiri_
aClassInstance.aClassMethod.im_class aClassInstance.aClassMethod._sendiri_._kelas_
  • Cara khas __nonzero__

Dalam Python 2, anda boleh membuat kelas anda sendiri dan membolehkan mereka digunakan dalam konteks boolean. Sebagai contoh, anda boleh mencontohkan kelas ini dan menggunakan objek contoh ini dalam satu if statement. Untuk mencapai tujuan ini, anda mentakrifkan sesuatu yang istimewa.bukan sifar() kaedah, yang nilai pulangnya adalah True atau False, kaedah ini dipanggil apabila objek contoh berada dalam konteks pada bur. Dalam Python 3, anda masih boleh melakukan fungsi yang sama, tetapi nama kaedah khas ini menjadiBoole_()。

Nota Python 2 Python 3
kelas A:
def _bukan sifar(sendiri):
lulus
kelas A:
def _Boole_(sendiri):
lulus
kelas A:
def _bukan sifar(diri, x, y):
lulus
tiada perubahan

1. Apabila anda menggunakan objek kelas dalam konteks Bur, Python 3 akan memanggil_Boole_(), dan bukan _bukan sifar(■■) 2. Walau bagaimanapun, jika anda mempunyai satu definisi yang menggunakan dua parameterbukan sifar() kaedah, skrip 2to3 akan mengandaikan kaedah yang anda tentukan mempunyai kegunaan lain dan oleh itu tidak mengubah kod.

  • Jenis lapan digit

Antara Python 2 dan Python 3, terdapat sedikit perubahan dalam tatabahasa yang menentukan bilangan oktal.

Nota Python 2 Python 3
x = 0755 x = 0o755
  • sys.maxint

Oleh kerana bentuk bulat dan bulat telah disatukan, konstanta sys.maxint tidak lagi tepat. Tetapi kerana nilai ini masih berguna untuk keupayaan untuk mengesan platform tertentu, ia disimpan oleh Python 3 dan dinamakan semula sebagai sys.maxsize.

Nota Python 2 Python 3
daripada sys importmaxint daripada sys importmaxsize
a_function ((sys.maxint) a_function ((sys.maxsize)

1,maxint menjadi maxsize. 2, semua sys.maxint menjadi sys.maxsize.

  • Fungsi global boleh dipanggil

Dalam Python 2, anda boleh menggunakan fungsi global callable untuk memeriksa sama ada objek boleh dipanggil. Dalam Python 3, fungsi global ini dibatalkan. Untuk memeriksa sama ada objek boleh dipanggil, anda boleh memeriksa kaedah khas.Panggil_Apakah wujudnya?

Nota Python 2 Python 3
boleh dipanggil ((apa-apa) Tiada apa-apa,_Panggil_’)
  • Fungsi global ((zip)

Dalam Python 2, fungsi global zip ((() boleh menggunakan mana-mana siri sebagai parameter, dan ia mengembalikan senarai yang terdiri daripada unsur-unsur. Satu unsur pertama mengandungi unsur pertama dari setiap siri; satu unsur kedua mengandungi unsur kedua dari setiap siri; dan seterusnya bergerak ke bawah. Dalam Python 3, zip ((() mengembalikan pengulangan, bukan senarai.

Nota Python 2 Python 3
zip ((a, b, c) senarai ((zip ((a, b, c))
d.join ((zip ((a, b, c)) tiada perubahan

Dalam bentuk yang paling mudah, anda boleh memulihkan fungsi sebelum fungsi zip dengan memanggil nilai pulangan fungsi zip yang dibungkus dengan list (), yang akan melintasi pengulangan yang mengembalikan fungsi zip (), dan kemudian mengembalikan senarai hasil yang ditunjukkan. Iterator yang mengembalikan zip dapat berfungsi dengan baik dalam persekitaran konteks yang telah melaluinya semua elemen siri (seperti panggilan kaedah join di sini); skrip 2to3 akan mengesan keadaan ini dan tidak mengubah kod anda.

  • Kesilapan Standard

Dalam Python 2, StandardError adalah semua kelas asas yang mempunyai kecacatan bawaan selain StopIteration, GeneratorExit, KeyboardInterrupt, dan SystemExit. Dalam Python 3, StandardError telah dihapuskan; Exception digunakan sebagai pengganti.

Nota Python 2 Python 3
x = StandardError() x = Pengecualian
x = StandardError ((a, b, c) x = Pengecualian ((a, b, c)
  • Konstan dalam modul types

Terdapat pelbagai parameter dalam modul types untuk membantu anda menentukan jenis objek. Dalam Python 2, ia mengandungi parameter yang mewakili semua jenis data asas, seperti dict dan int. Dalam Python 3, parameter ini telah dihapuskan. Hanya perlu diganti dengan nama jenis asas.

Nota Python 2 Python 3
types.UnicodeType str
types.StringType byte
types.DictType dikti
types.IntType int
types.LongType int
types.ListType senarai
types.NoneType jenis ((Tidak ada)
types.BooleanType bool
types.BufferType Memoriview
types.ClassType jenis
types.ComplexType kompleks
types.EllipsisType jenis ((Ellips)
types.FloatType mengambang
types.ObjectType objek
types.NotImplementedType jenis ((Tidak dilaksanakan)
types.SliceType Slice
types.TupleType Tumpukan
types.TypeType jenis
types.XRangeType julat

Types.StringType dipetakan sebagai byte, bukan str, kerana string string dalam Python 2 sebenarnya hanya satu siri byte yang dienkodkan dengan beberapa watak.

  • Fungsi global dalam contoh

Fungsi isinstance memeriksa sama ada objek adalah contoh kelas atau jenis tertentu. Dalam Python 2, anda boleh menghantar unsur yang terdiri daripada jenis kepada istance. Jika objek itu adalah jenis mana-mana dalam unsur, fungsi itu akan mengembalikan True. Dalam Python 3, anda masih boleh melakukan ini, tetapi tidak disyorkan untuk menggunakan jenis sebagai parameter untuk menghantar dua kali.

Nota Python 2 Python 3
adalah contoh ((x, ((int,float,int)) isinstance ((x, ((int,float))
  • Jenis data basestring

Python 2 mempunyai dua jenis senar: senar yang dikodkan Unicode dan senar yang tidak dikodkan Unicode. Tetapi sebenarnya terdapat juga sejenis lain, iaitu basestring. Ia adalah jenis data abstrak yang merupakan superclass jenis str dan unicode. Ia tidak boleh dipanggil secara langsung atau dicontohkan, tetapi anda boleh menggunakannya sebagai parameter contoh untuk mengesan sama ada objek adalah senar Unicode atau bukan senar Unicode.

Nota Python 2 Python 3
isinstance ((x, basestring) isinstance ((x, str)
  • Modul itertools

Python 2.3 memperkenalkan modul itertools, yang mentakrifkan varian (varian) fungsi global zip, map, dan filter, yang jenis pulangnya adalah iterator, bukan senarai. Dalam Python 3, fungsi-fungsi varian ini dihapus kerana jenis pulangan fungsi global ini adalah iterator, jadi fungsi-fungsi varian dalam itertools ini dibatalkan.

Nota Python 2 Python 3
itertools.izip ((a, b) zip ((a, b)
itertools.imap (a, b) peta ((a, b)
itertools.ifilter ((a, b) penapis ((a, b)
dari itertools import imap, izip, foo dari itertools import foo

1, menggunakan fungsi zip ((() global dan bukan itertools.izip ((() ⇒ 2、 menggunakan map (() dan bukannya itertools.imap (() ‖ 3,itertools.ifilter ((() menjadi filter ((() ▽ Modul 4, itertools masih wujud dalam Python 3, ia hanya tidak lagi mengandungi fungsi yang telah dipindahkan ke ruang nama global. Skrip 2to3 cukup pintar untuk membuang pernyataan import yang tidak lagi berguna, sambil mengekalkan integriti pernyataan import yang lain.

  • sys.exc_type, sys.exc_value, sys.exc_traceback

Pada masa ini, terdapat tiga pembolehubah yang boleh anda akses di dalam modul sys: sys.exc_type, sys.exc_value, sys.exc_traceback. Pada masa Python 1, ia sudah ada. Bermula pada Python 1.5, penggunaan ketiga-tiga pembolehubah ini tidak lagi disyorkan kerana sys.exc_info yang baru dikeluarkan, yang merupakan satu subset yang mengandungi semua tiga elemen di atas. Pada Python 3, ketiga-tiga pembolehubah ini akhirnya tidak lagi wujud; ini bermakna anda mesti menggunakan sys.exc_info.

Nota Python 2 Python 3
sys.exc_type sys.exc_info()[0]
sys.exc_value sys.exc_info() [1]
sys.exc_traceback sys.exc_info() [2]
  • Menganalisis senarai elemen

Dalam Python 2, jika anda perlu menulis pemangkasan senarai yang melintasi unsur, anda tidak perlu menambahkan kurung di sekitar nilai unsur. Dalam Python 3, kurung-kurung ini diperlukan.

Nota Python 2 Python 3
[i untuk dalam 1,2] [i untuk iin(1,2)]
  • Fungsi os.getcwdu ((()

Python 2 mempunyai fungsi yang dipanggil os.getcwd (), yang mengembalikan direktori kerja semasa sebagai satu baris (tidak dikodkan dalam Unicode). Oleh kerana sistem fail moden dapat menangani nama direktori yang dikodkan dengan berapa banyak watak, Python 2.3 memperkenalkan fungsi os.getcwdu (), fungsi os.getcwdu (), yang mengembalikan direktori kerja semasa dengan baris yang dikodkan dalam Unicode. Dalam Python 3, anda hanya memerlukan os.getcwd (), kerana hanya ada satu baris (jenis jenis Unicode).

Nota Python 2 Python 3
os.getcwdu() os.getcwd()
  • Metaclass

Dalam Python 2, anda boleh mencipta metaclass dengan menentukan parameter metaclass dalam deklarasi kelas, atau menentukan sifat __metaclass__ pada peringkat kelas khas. Dalam Python 3, sifat __metaclass__ telah dibatalkan.

Nota Python 2 Python 3
kelas C ((metaclass=PapayaMeta):
lulus
tidak berubah
kelas Whip:Metaclass_= PapayaMeta kelas Whip ((metaclass=PapayaMeta):
lulus
kelas C ((Whipper, Beater):
_Metaclass_= PapayaMeta
kelas C ((Whipper,Beater,metaclass=PapayaMeta):
lulus

1. Mengisytiharkan parameter metaclass semasa mengisytiharkan kelas, yang berlaku di Python 2 dan Python 3, mereka sama. 2. Dalam definisi kelas menyatakan bahawa sifat __metaclass__ adalah sah di Python 2, tetapi tidak lagi sah di Python 3. 3, 2to3 dapat membina deklarasi kelas yang sah walaupun kelas ini mewarisi pelbagai kelas induk.

  • Mengenai gaya kod

Penyelesaian yang disenaraikan di bawah tidak dianggap sebagai pembaikan sebenar. Maksudnya, mereka hanya perkara gaya kod dan tidak melibatkan kod itu sendiri. Tetapi pemaju Python mempunyai minat yang besar untuk menjadikan gaya kod selaras mungkin. Untuk itu, terdapat panduan rasmi yang khusus untuk menggambarkan gaya kod Python.

  • set (() literal (literal) (() jelas)

Dalam Python 2, satu-satunya cara untuk mentakrifkan set literal adalah dengan memanggil set (a_sequence); dalam Python 3 ini masih berlaku, tetapi menggunakan notasi literal baru: kurung besar adalah kaedah yang lebih jelas. Kaedah ini berfungsi selain daripada kurung kosong, kerana kamus juga menggunakan kurung besar, jadi {} menandakan kamus kosong, bukan satu set kosong.

Skrip 2to3 secara lalai tidak akan membetulkan set (() literal. Untuk menghidupkan ciri ini, senaraikan parameter -f set_literal semasa panggilan pada baris arahan 2to3.

Nota Sebelumnya Selepas
set (([1,2,3]) {1,2,3}
set (((1,2,3)) {1,2,3}
set (([i untuk iin a_sequence]) {i untuk dalam urutan}
  • Buffer fungsi global (() ((jelas)

Objek Python yang dilaksanakan dalam bahasa C boleh mengeluarkan antarmuka buffer yang membolehkan kod Python yang lain membaca dan menulis secara langsung pada satu butir memori. Ini terdengar kuat, tetapi ia juga menakutkan. Dalam Python 3, buffer dinamai semula sebagai memoryview. Perubahan sebenar lebih rumit, tetapi anda hampir dapat mengabaikan perbezaan ini.

Skrip 2to3 secara lalai tidak akan membetulkan fungsi buffer. Untuk menghidupkan fungsi ini, tentukan -f buffer parameter semasa panggilan pada baris arahan 2to3.

Nota Sebelumnya Selepas
x = buffer ((y) x =memoryview ((y)
  • Ruang kosong di sekitar koma (yang jelas)

Walaupun Python mempunyai keperluan yang ketat terhadap ruang untuk mengindent dan keluar, Python masih bebas untuk menggunakan ruang dalam aspek lain. Dalam senarai, unsur, kumpulan dan kamus, ruang boleh muncul di hadapan atau di belakang koma, ini tidak akan memberi kesan buruk. Walau bagaimanapun, manual gaya kod Python menyatakan bahawa tidak boleh ada ruang sebelum koma dan koma harus mengandungi ruang. Walaupun ini hanyalah kod pertimbangan estetika yang masih berfungsi dengan baik, ia boleh dilakukan di Python 2 dan Python 3, skrip 2to3 boleh melakukan pembaikan ini untuk anda berdasarkan piawaian manual.

Skrip 2to3 secara lalai tidak akan membetulkan ruang di sekitar koma. Untuk menghidupkan ciri ini, tentukan -f wscomma parameter semasa panggilan pada baris arahan 2to3.

Nota Sebelumnya Selepas
a, b a, b
{a:b} {a: b}
  • Perkataan biasa (common idioms)

Banyak amalan telah ditubuhkan di dalam komuniti Python. Terdapat beberapa contoh seperti sementara 1: gelung, yang bermula pada Python 1. (Python tidak mempunyai jenis bull yang benar-benar bermakna sehingga Python 2.3, jadi pemaju sebelum ini menggunakan penggantian 1 dan 0.)

Skrip 2to3 secara lalai tidak akan memperbaiki kebiasaan ini. Untuk menghidupkan ciri ini, senaraikan parameter -f idioms semasa panggilan pada baris arahan 2to3.

Nota Sebelumnya Selepas
sementara 1:
do_stuff()
sementara True:
do_stuff()
jenis ((x) == T adalah contoh ((x, T)
jenis ((x) ialah T adalah contoh ((x, T)
a_list = senarai ((a_sequence) a_list = diurutkan (a_sequence)
a_list.sort() Do_stuff (daftar)
Do_stuff (daftar)

DibaharuiBlog CSDN

Bagaimana untuk menukar kod Python2 ke kod Python3

Mengenai cara menukar kod Python 2.x kepada kod Python 3.x. Cara menukar kod Python 2.x kepada kod Python 3.x

  • 1.自己手动转换

Ini tidak perlu dikatakan banyak jika hanya melibatkan beberapa fungsi, seperti print dan lain-lain.

Jika anda ingin mengubah kod anda sendiri, anda boleh melakukannya.

  • 2.利用Python内置(Python脚本)工具,帮你自动转换

Versi Python 2.x, seperti Python 2.7.2 yang saya pasang, membawa beberapa alat berguna yang berkaitan selepas anda memuat turun dan memasang Windows.

其中一个叫做2to3.py, adalah alat yang digunakan untuk membantu anda melaksanakan, mengubah kod Python 2.x menjadi kod Python 3.x.

Ia terletak di: direktori akar pemasangan Python\Python27\Tools\Scripts\2to3.py

如何利用2to3.py, melaksanakan menukar kod Python 2.x kepada kod Python 3.x Contohnya, saya mempunyai skrip Python 2.x:

D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py

Sekarang, saya mahu menukarnya kepada kod Python 3.x.

Anda boleh membuka cmd pada windows, mengarahkan ke bawah skrip yang ingin ditukar, dan kemudian menjalankan

D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py

Jika anda berjaya menukar, hasil pelaksanaan yang sesuai adalah:

D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored 34563264_data_from_site.py
--- 34563264_data_from_site.py  (original)
+++ 34563264_data_from_site.py  (refactored)
@@ -18,7 +18,7 @@
 import time;
 import codecs;
 import logging;
-import urllib;
+import urllib.request, urllib.parse, urllib.error;
 from datetime import datetime,timedelta;
 from optparse import OptionParser;
 from string import Template,replace;
@@ -90,7 +90,7 @@
         foundPhone = eachItemSoup.find(attrs={"class":"phone"});
         logging.debug("foundPhone=%s", foundPhone);
         if(foundPhone):
-            foundPhoneUni = unicode(foundPhone);
+            foundPhoneUni = str(foundPhone);
             logging.debug("foundPhoneUni=%s", foundPhoneUni);
             # case 1:
             #<p class="phone"><strong>phone:</strong>&nbsp;800.206.7886<br />
@@ -122,7 +122,7 @@
         foundWeb = eachItemSoup.find(attrs={"class":"web"});
         logging.debug("foundWeb=%s", foundWeb);
         if(foundWeb):
-            foundWebUni = unicode(foundWeb);
+            foundWebUni = str(foundWeb);
             logging.debug("foundWebUni=%s", foundWebUni);
 
             # <p class="web"><strong>e-mail:</strong>&nbsp;<a href="#">sales@cinesysinc.com</a><br />
@@ -151,7 +151,7 @@
         foundAddr = eachItemSoup.find(attrs={"class":"addr"});
         logging.debug("foundAddr=%s", foundAddr);
         if(foundAddr):
-            foundAddrUni = unicode(foundAddr);
+            foundAddrUni = str(foundAddr);
 
             # <p class="addr">
                 # <strong>address:</strong>&nbsp;740 SW 21st Ave, Suite #310<br />
RefactoringTool: Files that were modified:
RefactoringTool: 34563264_data_from_site.py

Pada masa ini, anda boleh melihat asal 345636264_data_from_site.py, yang telah menjadi versi Python 3.x


Lebih lanjut

FangBeiAdakah botvs menggunakan Python 2?

Mimpi kecilPelayan balas BotVS menggunakan versi Python 2.7, yang disokong untuk platform BotVS Python 2 dan Python 3.