ほぼすべての Python 2 プログラムは,Python 3 の環境で正常に動作するためにいくつかの変更を必要とします.この変換プロセスを簡素化するために,Python 3 には2to3 と呼ばれる実用スクリプト ((Utility Script) が搭載されています.このスクリプトは,あなたの Python 2 プログラムのソースファイルをインプットとして,それを Python 3 の形式に自動的に変換します.
Python 2では,print は文である。あなたが出力したいものは何であれ,print キーワードの後ろにそれを置くだけで出力できます。Python 3では,print ((() は関数である。他の関数と同様に,print ((() は,あなたが出力したいものを,その関数として渡す必要があります。
Notes | Python 2 | Python 3 |
---|---|---|
① | print() | |
② | print 1 | print(1) |
③ | print 1,2 | print(1,2) |
④ | print 1,2, | print(1,2,end=’ ‘) |
⑤ | print >>sys.stderr,1,2,3 | print(1,2,3, file=sys.stderr) |
1、 空の行を出力するには,参数のない print を呼び出す必要がある ((() 。 2、 単一の値を出力するには, print ((() の1つの引数としてこの値を入力する必要があります。 3、出力には空白で区切られた2つの値を使用し,2つの参数でprint ((() を呼び出す. この例にはいくつかのテクニックがあります。 Python 2では, print 文の末尾に comma ((,) を使えば,空白で出力結果を隔て,その後に続く空白 (((trailing space) を出力するので,carriage return を出力しない。 Python 3では,end=’ ‘をキーワードのパラメータとしてprint に渡すことで同じ効果を達成できます。 end 参数には ‘\n’ のデフォルト値が設定されているので,end 参数値を再指定することで,末尾の出力車輪符を削除できます。 Python 3 では,パイプをキーワードパラメータファイルの値としてprint ((() に渡すことで同じ機能を果たすことができます.パラメータファイルのデフォルト値はstd.stdoutなので,その値を再指定するとprint ((() が別のパイプに輸出されます.
Python 2 には 2 つの文字列タイプがあります.Unicode文字列についてそして非Unicode文字列Python 3 のタイプは次のとおりです.Unicode文字列 (Unicode strings) について。
Notes | Python 2 | Python 3 |
---|---|---|
① | u’PapayaWhip’ | ‘PapayaWhip’ |
② | ur’PapayaWhip\foo’ | r’PapayaWhip\foo’ |
Python 2 の Unicode 文字列は, Python 3 の文字列は常に Unicode 形式であるため,Python 3 の普通文字列である. Unicode原始文字列 ((raw string) ((この文字列を使用すると,Pythonは反斜線を自動的に変換しない”“) は,Python 3 で,すべての原始文字列がUnicode でコードされているため,通常の文字列に置き換えられた.
Python 2 には,オブジェクトを文字列に強制的に変換する2つの全局関数があります:unicode ((() はオブジェクトをUnicode文字列に変換し,str ((() はオブジェクトを非Unicode文字列に変換します.Python 3 には,Unicode文字列の文字列タイプが1つしかありませんので,str ((() 関数はすべての機能を完了します.unicode ((() 関数は Python 3 ではもう存在しない。)
Notes | Python 2 | Python 3 |
---|---|---|
① | unicode(anything) | str(anything) |
Python 2 には,浮点数以外の int と long タイプが用意されている。int タイプの最大値は sys.maxint を超えるべきではないし,この最大値はプラットフォームに関係している。数字の最後に L を付加することで,長整数型を定義できる.明らかに,int タイプが表す数字の範囲よりも大きい。Python 3 には,整数型の int が1つしか存在しないが,ほとんどの場合,Python 2 の長整数型と似ています。もう2種類の整数は存在していないので,それらを区別するために特別な文法を使用する必要はありません。
PEP 237:整形と整形を統一する
Notes | Python 2 | Python 3 |
---|---|---|
① | x = 1000000000000L | x = 1000000000000 |
② | x = 0xFFFFFFFFFFFFL | x = 0xFFFFFFFFFFFF |
③ | long(x) | int(x) |
④ | type(x) is long | type(x) is int |
⑤ | isinstance(x,long) | isinstance(x,int) |
Python 2 の十進制の長整形は,Python 3 の十進制の普通整数に置き換えられた. Python 2 の 16 桁の長整型は Python 3 の 16 桁の普通整数に置き換えられた. Python 3 では,長整型がなくなってしまい,自然の long () 函数も存在しない. 変数を整型に強制的に変換するには,int () 函数を使用できます.。 変数が整型かどうかを確認し,そのデータ型を取得し,int型 ((not long) と比較する. また,instance () 関数を用いてデータ型をチェックすることもできます.また,インスタンス () 関数を用いて整数型をチェックすることもできます.
Python 2 は<> を!= の同義語としてサポートする.Python 3 は!= をのみサポートし,もはや<> をサポートしていない.
Notes | Python 2 | Python 3 |
---|---|---|
① | if x <> y: | if x != y: |
② | if x <> y<> z: | if x != y!= z: |
比較するだけでいい 2. 比較的複雑な3つの値間の比較
Python 2では,辞書オブジェクトのhasは_キー () メソッドは,辞書に特定のキー () が含まれているかどうかをテストするために使われます. Python 3 はこのメソッドをサポートしていません.inオペレーター
Notes | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.has_key(‘PapayaWhip’) | ‘PapayaWhip’ in a_dictionary |
② | a_dictionary.has_key(x) or a_dictionary.has_key(y) | x in a_dictionary or y in a_dictionary |
③ | a_dictionary.has_key(x or y) | (x or y) in a_dictionary |
④ | a_dictionary.has_key(x + y) | (x + y) in a_dictionary |
⑤ | x + a_dictionary.has_key(y) | x + (y in a_dictionary) |
1 シンプルな形式 2、 オペレーターorの優先度は, オペレーターinより低いので,ここには括弧を加える必要はありません. 3 反対に,同じ理由で, or の優先度が in よりも低いので,ここには括弧を追加する必要があります。(注意:ここでのコードは,前の行とは全く異なる。Python は最初に x or y を解釈して,結果 x ((x がブル上の文脈で真である場合) または y を得ます。そして,Python は,この結果が a か否かをチェックします._dictionaryのキーの一つ。) 4 演算子 in の優先度は演算子 + より低いので,この形式のコードは技術的に括弧を必要としないが,2to3 が追加されている. 5. この形式は,inの優先度が+。より低いため,括弧が必要である.
Python 2では,多くの辞書型のメソッドの返される値はリストである。最もよく使われるメソッドには,キー,アイテム,および値がある。Python 3では,上記のすべてのメソッドの返される値は,ダイナミックビューに変更されている。いくつかの文脈環境では,この変更は影響を与えない。これらのメソッドの返される値は,別の関数に即座に転送され,その関数が,全序列を横切るならば,上記のメソッドの返される値はリストまたはビューであり,何の違いも生じない。他の場合,Python 3ではこれらの変更は重要である。もし,個別に検索可能な要素のリストを期待するならば,Python 3ではこれらの変更は,インデックスをサポートしないため,あなたのコードカードを閉じます。
Notes | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.keys() | list(a_dictionary.keys()) |
② | a_dictionary.items() | list(a_dictionary.items()) |
③ | a_dictionary.iterkeys() | iter(a_dictionary.keys()) |
④ | [i for iin a_dictionary.iterkeys()] | [i for iin a_dictionary.keys()] |
⑤ | min(a_dictionary.keys()) | no change |
Python 2からPython 3まで,標準クエリのいくつかのモジュールは改名されている.また,相互に関連したモジュールは,結合または再編成され,関連性がより論理的になる.
Notes | Python 2 | Python 3 |
---|---|---|
① | import httplib | import http.client |
② | import Cookie | import http.cookies |
③ | import cookielib | import http.cookiejar |
④ | import BaseHTTPServer import SimpleHTTPServer import CGIHttpServer |
import http.server |
http.clientモジュールは,HTTPリソースをリクエストし,HTTP応答を解析するために使用できる底層のライブラリを実装しています. http.cookiesモジュールは,HTTPヘッダー (HTTP header) でSet-Cookieから送信されたクッキーを取得するための,ピソニックなインターフェースを提供します. 一般的なブラウザでは,クッキーはファイルとしてディスクに保存され,http.cookiejarモジュールでこれらのファイルが操作できます. http.serverモジュールは,基本的なHTTPサーバを実装する
Notes | 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 |
⑤ | from urllib import FancyURLopener from urllib import urlencode |
from urllib.request import FancyURLopener from urllib.parse import urlencode |
⑥ | from urllib2 import Request from urllib2 import HTTPError |
from urllib.request import Request from urllib.error import HTTPError |
以前,Python 2 の urllib モジュールには,urlopen () を含む様々な関数があり,URL をその構成要素であるsplittype () ,splithost () とsplituser () に分割するのに役立ちます.新しいurllibパッケージでは,これらの関数はより論理的に組織されています. 2to3 は,これらの関数の呼び出しを新しい命名プログラムに適合するように変更します. Python 3 では,以前の urllib2 モジュールが urllib パッケージに組み込まれています. また,urllib2 でお気に入りのものが Python 3 の urllib モジュールに常に登場します. 例えば,build_opener () メソッド,Request オブジェクト,HTTPBasicAuthHandler,そしてfriends。 Python 3 の urllib.parse モジュールには,オリジナルの Python 2 の urlparse モジュールのすべての解析関数が含まれている。 urllib.robotparse モジュールは,robots.txt ファイルを解析する。 HTTP リダイレクトやその他のステータスコードを処理する FancyURLopener クラスは,Python 3 の urllib.request モジュールで有効である。urlencode ((() 関数は,urllib.parse に移行されている。 Request オブジェクトは,urllib.request に有効のままですが,HTTPError のような常数は,urllib.error に転送されています. 2to3は,あなたの関数呼び出しを書き換えるということも言及しましたか? 例えば,もしあなたの Python 2 のコードに urllib モジュールがインポートされ,urllib.urlopen ((() という関数でデータを取得すると,2to3は,import 文と関数呼び出しを同時に修正します.
Notes | Python 2 | Python 3 |
---|---|---|
① | import urllib print urllib.urlopen(’http://diveintopython3.org/‘).read() | import urllib.request, urllib.parse, urllib.error print(urllib.request.urlopen(’http://diveintopython3.org/‘).read()) |
Notes | Python 2 | Python 3 |
---|---|---|
① | import dbm | import dbm.ndbm |
② | import gdbm | import dbm.gnu |
③ | import dbhash | import dbm.bsd |
④ | import dumbdbm | import dbm.dumb |
⑤ | import anydbm import whichdb |
import dbm |
Notes | Python 2 | Python 3 |
---|---|---|
① | import xmlrpclib | import xmlrpc.client |
② | import DocXMLRPCServer import SimpleXMLRPCServer |
import xmlrpc.server |
Notes | Python 2 | Python 3 |
---|---|---|
① | try: import cStringIO as StringIO except ImportError: import StringIO |
import io |
② | try: import cPickle as pickle except ImportError: import pickle |
import pickle |
③ | import _builtin_ | import builtins |
④ | import copy_reg | import copyreg |
⑤ | import Queue | import queue |
⑥ | import SocketServer | import socketserver |
⑦ | import ConfigParser | import configparser |
⑧ | import repr | import reprlib |
⑨ | import commands | import subprocess |
パッケージは,関連するモジュールのグループから構成された単一の実体である.Python 2では,同じパッケージ内のモジュールの相互参照を実現するために,import fooまたはfrom foo import Barを使用する.Python 2のインタプリタは,まず,現在のディレクトリでfoo.pyを検索し,次にPythonの検索パス ((sys.path) で検索する.Python 3では,このプロセスは少し異なります.Python 3では,まず現在のパスで検索せず,直接Pythonの検索パスで検索します.
複数のファイルが同じディレクトリに収められている場合:
chardet/ | +–init.py | +–constants.py | +–mbcharsetprober.py | +–universaldetector.py
では,universaldetector.py が constants.py をすべて輸入し,mbcharsetprober.py のクラスも輸入する必要があると仮定してみましょう.
Notes | Python 2 | Python 3 |
---|---|---|
① | import constants | from .import constants |
② | from mbcharsetprober import MultiByteCharSetProber | from .mbcharsetprober import MultiByteCharsetProber |
Python 2では,代はnext (()) の方法を持ち,その配列の次の項を返します。Python 3でも同じことが成立しますが,今や新しい全局的な関数next (()) があり,それは代をパラメータとして使用します。
Notes | Python 2 | Python 3 |
---|---|---|
① | anIterator.next() | next(anIterator) |
② | a_function_that_returns_an_iterator().next() | next(a_function_that_returns_an_iterator()) |
|③|class A:
def next(self):
pass|class A:
def next(self):
pass|
|④|class A:
def next(self, x, y):
pass|no change |
|⑤|next = 42
for an_iterator in a_sequence_of_iterators:
an_iterator.next()|next = 42
for an_iterator in a_sequence_of_iterators:
an_iterator.next() |
1. 最も簡単な例では,代数のnext () メソッドを呼び出すのをやめて,その代数の自己をグローバル関数next () にパラメータとして渡します.
2. もし返される値がイデュレータの関数である場合,この関数を呼び出して,その結果を next () 関数にパラメータとして渡します。。 2to3 スクリプトは,この変換を正しく実行できるほど知的なものです。)
Python 3 では,特殊な方法の定義で, クラスを定義し,それを代数として使うことができます.next_実現するために.
4. もし,定義したクラスにnext () があれば,そのクラスには1つまたは複数のパラメータが使用され,2〜3の実行時に動かない.このクラスは,next () メソッドにパラメータがあるので,代数として使用できません.
5 これは少し複雑です. もし,next というローカル変数がある場合,Python 3 では,その変数の優先順位は,next というグローバル関数より高くなります.next__() 序列の次の要素を取得する。( または,このローカル変数の名前をnextとしないようにコードを再構成することもできますが,2to3はこれをしません。)
Python 2では,filter() メソッドは,列の各項を検出する TrueまたはFalse の関数で得られたリストを返します.Python 3では,filter() 関数は,リストではなく,代数返します.
Notes | Python 2 | Python 3 |
---|---|---|
① | filter(a_function, a_sequence) | list(filter(a_function, a_sequence)) |
② | list(filter(a_function, a_sequence)) | no change |
③ | filter(None, a_sequence) | [i for iin a_sequence if i] |
④ | for i in filter(None, a_sequence): | no change |
⑤ | [i for iin filter(a_function, a_sequence)] | no change |
1,最も単純な場合, 2to3は,list () 関数でfilter () を包装し,list () 関数は,そのパラメータを巡って,リスト () を返します. しかし,filter() の呼び出しが list() パッケージに包まれていれば,2to3は処理を繰り返さない.この場合,filter() の返される値が代数であるかどうかは関係ありません. 3 フィルター ((None, …) の特殊な文法に対応するために,2to3は,この呼び出しを文法的に等価なものからリスト解析に変換する. 4. for ループは,このシークエンス全体を回るので,これ以上修正する必要はありません. 5. 上記と同じで,リスト解析が全序列を巡るため,修正する必要はありません. filter ((() が 1 つの代数を返しても,以前の filter ((() がリストを返したように正常に動作します.
filter() の変更と同じく,map() 関数は,現在,イベリータを返します。(Python 2では,リストを返します。)
Notes | Python 2 | Python 3 |
---|---|---|
① | map(a_function,‘PapayaWhip’) | list(map(a_function,‘PapayaWhip’)) |
② | map(None,‘PapayaWhip’) | list(‘PapayaWhip’) |
③ | map(lambda x: x+1,range(42)) | [x+1for x in range(42)] |
④ | for i in map(a_function, a_sequence): | no change |
⑤ | [i for iin map(a_function,a_sequence)] | no change |
1、 フィルター () の処理に類似して,最も単純な場合, 2to3 は list () 関数を使用してmap () を呼び出す. 2 特殊なmap ((None, …) 構文については,filter ((None, …) と似たように,2to3はこれをlist (()) を用いた等価呼び出しに変換する 3、map() の最初の参数がlambda関数である場合,2to3はこれを等価にリスト解析に変換する。 4. 序列全体を回る for ループは変更する必要はありません. 5 再び,リスト解析は全序列を回るので,ここでは変更する必要はありません. map () の返される値はリストではなく代入器であるとしても,正しく動作します.
Python 3では,reduce () 関数はグローバル名字空間から削除され,fucntools モジュールに配置されています.
Notes | Python 2 | Python 3 |
---|---|---|
① | reduce(a, b, c) | from functools import reduce reduce(a, b, c) |
Python 2 には,apply () というグローバル関数があり,関数fとリストを使用します.[a,b,c]を引数として,返される値はf ((a,b,c) である.この関数を直接呼び出すことで,リストの前に星号を追加することもできます.*) をパラメータとして渡して同じことをする. Python 3 では,apply ((() 関数はもはや存在しない. 星号記法を使用しなければならない.
Notes | 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) |
参数列の () のようなもの.[a,b,c]と同じ) の前に星号を追加して函数を呼びます。これは,Python 2のapply ((() 函数と同等です。 Python 2 では,apply () 関数は実際に 3 つの参数を持つことができます. 函数,参数リスト,名付けられた引数の辞書. Python 3 では,参数リストの前に星号を追加して () を追加できます.),辞書名付けのパラメータの前に2つの星号を追加する ((**記事の内容はこうです 3 演算子+は,ここに接続リストの機能として使用され,演算子よりも優先順位があります., a_list_of_args + z の周りに余分な括弧を加える必要はありません. 4,2to3スクリプトは,インポートモジュール内の関数を含む複雑なapply () 呼び出しを変換するのに十分な知性を持っています.
Python 2では,intern (()) 関数の作用を,性能最適化のために,文字列に限定して ((intern)) することができます.Python 3では,intern ((() 関数は,sysモジュールに転送されています.
Notes | Python 2 | Python 3 |
---|---|---|
① | intern(aString) | sys.intern(aString) |
print 文がPython 3 で関数になるように,exec 文も同じです。exec() 関数は任意の Python コードを含む文字列をパラメータとして使用し,それを文または式を実行するように実行します。exec() はeval() に似ていますが,exec() はより強力で,より技巧的です。eval() 関数は単一の式しか実行できませんが,exec() は複数の文を実行し,インポート,インポート,関数宣言を行うことができます.
Notes | Python 2 | Python 3 |
---|
|①|exec codeString|exec(codeString) |②|exec codeString in a_global_namespace|exec(codeString, a_global_namespace)| |③|exec codeString in a_global_namespace, a_local_namespace|exec(codeString, a_global_namespace,a_local_namespace)| 1,最も単純な形式では,exec ((() が文ではなく,関数であるため,2to3は,この文字列形式のコードを括弧で囲みます。 2. Python 2 の exec 文は名前空間を指定し,コードはグローバルオブジェクトで構成されたこのプライベートスペースで実行されます.Python 3 もそのような機能があります.あなたはこの名前空間を第二のパラメータとしてexec () 関数に渡すだけです. 3. さらに不思議なことに,Python 2 の exec 文は,関数の中で宣言された変数 ((のような) ローカルネームスペースを指定することもできます.Python 3 では,exec (()) 関数にもこのような機能があります.
前の exec 文のように,Python 2 の execfile 文は Python コードを実行するように文字列を使用できます。 exec は文字列を使用していますが,execfile はファイルを使用しています。 Python 3 では,execfile 文は削除されています。 もし本当にファイル内の Python コードを実行したいのですが,それをインポートしたくない場合は,このファイルを開き,その内容を読み込み,それから compile () グローバル関数で Python インタプリタを強制的にコンパイルして,新しい exec () 関数を呼び出すことができます。
Notes | Python 2 | Python 3 |
---|---|---|
① | execfile(‘a_filename’) | exec(compile(open(‘a_filename’).read(),‘a_filename’,‘exec’)) |
Python 2では,任意のオブジェクトの文字列表示を,反引数で包む方法があります (例えば,x
) の特殊な文法。 Python 3 では,この能力は残っているが,反引数でこのような文字列を得ることはできなくなっている。 グローバル関数repr ((() を使う必要がある。
Notes | Python 2 | Python 3 |
---|---|---|
① | `x` | repr(x) |
② | `‘PapayaWhip’ + `2`` | repr(‘PapayaWhip’+ repr(2)) |
1 覚えておいてください,xはどんなものでもあり得ます. クラス,関数,モジュール,基本データ型などです. Python 2では,反引数は組み込まれており,この不解な (しかし有効な) 表現である。2to3は,この組み込み呼び出しをrepr ()) 機能に変換するほど知的なものです。
Python 2 から Python 3 への移行では,異常を捕捉する文法が少し変わった.
Notes | Python 2 | Python 3 |
---|---|---|
① | try: import mymodule except ImportError, e pass |
try: import mymodule except ImportError as e: pass |
② | try: import mymodule except (RuntimeError, ImportError), e pass |
try: import mymodule except (RuntimeError, ImportError) as e: pass |
③ | try: import mymodule except ImportError: pass |
no change |
④ | try: import mymodule except: pass |
no change |
Python 3 は,Python 2 の例外型の後にコマを追加する新しいキーワード,as。を使用しています. 2 キーワードasは,複数のタイプの異常を同時に捕獲した場合にも使用できます. 3 異例を捕まえて,異例のオブジェクト自体にアクセスしようとしない場合,Python 2とPython 3の文法は同じです. 4 類似して,もしすべての例外を捕捉するために保安方法 ((fallback) を使えば,Python 2 と Python 3 の文法も同じである. 5. モジュールをインポートする際 (あるいは他のほとんどの場合) は,この方法を使うべきではありません (上記のfallbackを参照). そうでなければ,プログラムがKeyboardInterrupt (ユーザがCtrl-Cでプログラムを中断した場合) のような異例を捕捉し,デビューをさらに困難にする可能性があります.
Python 3では,カスタム例外の文法に微妙な変更があります.
Notes | Python 2 | Python 3 |
---|---|---|
① | raise MyException | unchanged |
② | raise MyException,‘error message’ | raise MyException(‘error message’) |
③ | raise MyException,‘error message’, a_traceback | raise MyException(‘errormessage’).with_traceback(a_traceback) |
④ | raise ‘error message’ | unsupported |
Python 2では,生成器にはthrow () メソッドがあります。a_generator.throw () を呼び出すと,生成器が停止されたときに例外を投げ,生成器関数から取得した次の値を返します。Python 3では,この機能はまだ使用できますが,文法的には少し異なります。
Notes | Python 2 | Python 3 |
---|---|---|
① | a_generator.throw(MyException) | no change |
② | a_generator.throw(MyException,‘error message’) | a_generator.throw(MyException(‘error message’)) |
③ | a_generator.throw(‘error message’) | unsupported |
Python 2では,特定の範囲内の数字を得るための2つの方法があります. リストを返す range () と, 代数を返す range () があります. Python 3では,range () が代数を返し,xrange () は存在しません.
Notes | Python 2 | Python 3 |
---|---|---|
① | xrange(10) | range(10) |
② | a_list = range(10) | a_list = list(range(10)) |
③ | [i for iin xrange(10)] | [i for iin range(10)] |
④ | for i in range(10): | no change |
⑤ | sum(range(10)) | no change |
1 簡単な場合, 2 to 3 は単に xrange を range に変換します. 2 ならば,あなたの Python 2 コードが range () を使用している場合, 2to3 はあなたがリストが必要かどうか,あるいは,エデュレータも行っているかどうかを知らない. 慎重のために, 2to3 はエラーを報告し,list () を使って range () の返される値をリスト型に強制的に変換する. 3. リスト解析に xrange () 函数がある場合,リスト解析は代器にも同様に有効であるため,返される値をリストに変換する必要はありません. 4 類似して,for ループは代器にも作用するので,ここでも何も変化しません. 5 ,関数sum ((() は代入器に作用するので,2to3もここで変更をしていない。 値がview ((view) として返され,リストではなく辞書クラスの方法のように,これはmin (((),max (((),sum (((),list (((),tuple (((),set (((),sorted (((),any (((),all ((() にも適用する.
Python 2 には,コマンドラインでユーザの入力を求める2つの全局関数があります. 一つは,input () と呼ばれ,ユーザが Python 式 () を入力して返信するのを待っています. 二つ目は,raw_input () と呼ばれ,ユーザが入力したものが返信されます.
Notes | Python 2 | Python 3 |
---|---|---|
① | raw_input() | input() |
② | raw_input(‘prompt’) | input(‘prompt’) |
③ | input() | eval(input()) |
1”,raw_input ()) “は”input ()) “と置き換えられている. 2. Python 2では,raw_input ((() 関数は,提示符をパラメータとして指定できます。Python 3ではこの機能は保留されています。 3. もし本当にユーザに Python エクスプレッションを入力して,結果を計算したいなら,input ((() 関数を呼び出し,返される値をeval ((() に渡すことができます.
Python 2では,関数の内部のコードは,関数の特殊属性にアクセスできます.Python 3では,一致性のために,これらの特殊属性は改名されています.
Notes | Python 2 | Python 3 |
---|---|---|
① | a_function.func_name | a_function._name_ |
② | a_function.func_doc | a_function._doc_ |
③ | a_function.func_defaults | a_function._defaults_ |
④ | a_function.func_dict | a_function._dict_ |
⑤ | a_function.func_closure | a_function._closure_ |
⑥ | a_function.func_globals | a_function._globals_ |
⑦ | a_function.func_code | a_function._code_ |
1、name属性 ((原func_name) は,関数の名前を含んでいる。 2、doc 属性 ((原funcdoc) は,あなたが関数ソースコードで定義したドキュメント文字列 ((docstring) を含みます) 3、defaults属性 ((原func_defaults) は,パラメータのデフォルト値を保存する元群である. 4、dict属性 ((原func_dict) は,任意の関数属性をサポートする名空間である。 5、closure属性 ((原func_closure) は,関数の自由変数 ((free variable)) に関する拘束を含む,セルオブジェクトで構成される元群である. 6、globals属性 ((原func_globals) は,モジュール全域名空間の参照であり,関数自体はこの名空間に定義されている。 7、code属性 ((原func_code) は,コンパイルされた関数体を表示するコードオブジェクトである.
Python 2では,ファイルオブジェクトにはxreadlines () メソッドがあり,これは 1 回で 1 行のファイルを読み取る代数を返します. これはforループでは特に有用です. 実際,Python 2の後のバージョンでは,ファイルオブジェクト自体にこのような機能が追加されています.
Python 3では,xreadlines ()) 方法は利用できなくなりました。2to3は簡単な状況では解決できますが,いくつかのエッジケースでは人工介入が必要になります。
Notes | Python 2 | Python 3 |
---|---|---|
① | for line in a_file.xreadlines(): | for line in a_file: |
② | for line in a_file.xreadlines(5): | no change (broken) |
1 ならば,以前,xreadlines () を呼び出した場合, 2to3 はそれをファイルオブジェクトに変換します. Python 3 では,この変換後のコードは,以前と同じことを行うことができます. ファイルの一行を読み, for ループのループ体を実行します. 2 前にxreadlines () を呼び出すために ((毎回読み取る行数) を使っていた場合,2to3はPython 2からPython 3への変換を完了できず,コードは次のように失敗します. AttributeError: ‘_io.TextIOWrapper’ object has no attribute ‘xreadlines’。 Python 3 でコードが動作するように,xreadlines を readlines に手動で変換できます。 readline 方法は Python 3 で代数を返しますので,Python 2 のxreadlines との効率は相違ありません。
Python 2 では,匿名 lambda 関数を定義し,その関数には,その要素数を要素として指定することで,実際に複数のパラメータを受け付けることができます. 実際,Python 2 のインタプリタは,このパラメータを,名前付きのパラメータに解き放ち,それからそれを lambda 関数で引用できます.
Notes | 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 | unchanged |
1 では,lambda関数を定義し,その関数として 1 つの要素を含む要素の元組を用いると,Python 3 では,その関数は x1 の要素を含む要素に変換されます.[0] に引用された lambda 関数。x1 は,元の元組の命名参数に基づいて2to3スクリプトで自動的に生成された。 2 , 2 つの要素を含む元組 ((x, y) をパラメータとして使用する lambda 関数は,x_y に変換され,x_y という2つの位置パラメータを持つ[x_yとx_yの両辺に等しくなります.[1]。 3,2to3スクリプトは,仮名パラメータをパラメータとして使用した元組をlambda関数として処理することもできます.生成された結果のコードは読みづらいですが,Python 3では,元のコードがPython 2では同じ効果を発揮します. 4. 複数のパラメータを使用するlambda関数を定義できます. プラグインがパラメータに囲まれていない場合,Python 2はそれを複数のパラメータを含むlambda関数として扱います. このlambda関数体では,他のタイプの関数と同様に,これらのパラメータを名前で参照します. この文法はPython 3でも有効です.
Python 2では,クラスメソッドは,そのクラスオブジェクト (class object) を定義する方法オブジェクト (method object) 自身にアクセスできます。im_selfはクラスのインスタンスオブジェクトであり,im_funcは関数オブジェクトであり,im_classはクラス自身である。Python 3では,これらの属性は,他の属性の命名コンベンションに従うように,改名されています。
Notes | Python 2 | Python 3 |
---|---|---|
① | aClassInstance.aClassMethod.im_func | aClassInstance.aClassMethod._func_ |
② | aClassInstance.aClassMethod.im_self | aClassInstance.aClassMethod._self_ |
③ | aClassInstance.aClassMethod.im_class | aClassInstance.aClassMethod._self_._class_ |
Python 2では,自分のクラスを作成し,ブル上の文脈 (boolean context) で使用できるようにします. 例えば,このクラスをインスタンス化して,このインスタンスオブジェクトをif文で使います.nonzero() メソッドは,TrueまたはFalseを返します. このメソッドは,インスタンスオブジェクトがブル上の文脈にあるときに呼び出されます. Python 3では,同じ機能を実行できます. しかし,この特殊なメソッドの名前は,bool()。
Notes | Python 2 | Python 3 |
---|
|①|class A:
def nonzero(self):
pass|class A:
def bool(self):
pass
|②|class A:
def nonzero(self, x, y):
pass|no change|
1 ブル上の文脈でクラスオブジェクトを使用すると,Python 3 が呼び出すbool_違うのはnonzero()。
2 つのパラメータを使用します.nonzero_方法 2 to 3 スクリプトは,あなたが定義したこの方法が他の用途があると仮定し,コードを修正しません.
Python 2とPython 3の間では,八進制 ((octal) 数を定義する文法にわずかな変更があった.
Notes | Python 2 | Python 3 |
---|---|---|
① | x = 0755 | x = 0o755 |
長整型と整型が統合されたため,sys.maxintの常数はもはや正確ではない。しかし,この値は特定のプラットフォームの能力を検出するのに有用であるため,Python 3で保持され,sys.maxsize。と改名された.
Notes | Python 2 | Python 3 |
---|---|---|
① | from sys importmaxint | from sys importmaxsize |
② | a_function(sys.maxint) | a_function(sys.maxsize) |
1 maxint は maxsize になりました 2 すべてのsys.maxintはsys.maxsizeになる。
Python 2では,callable () というグローバル関数を使って,あるオブジェクトが呼び出されるかどうかを確認できます.Python 3では,このグローバル関数は削除されています.オブジェクトが呼び出されるかどうかを確認するには,特殊な方法を使用できます.__call_存在性について
Notes | Python 2 | Python 3 |
---|---|---|
① | callable(anything) | hasattr(anything,’_call_’) |
Python 2では,全局関数zip() は任意の複数の配列をパラメータとして使用することができ,元組からなるリストを返します.最初の元組は,各配列の第1の要素を含みます.第二の元組は,各配列の第2の要素を含みます.順番に推移します.Python 3では,zip() はリストではなく,代数返します.
Notes | Python 2 | Python 3 |
---|---|---|
① | zip(a, b, c) | list(zip(a, b, c)) |
② | d.join(zip(a, b, c)) | no change |
最も単純な形式では,list () 関数でzip () の返される値を呼び出すことで,zip () の前の機能を復元できます.list () 関数は,zip () 関数で返されるイデュレータを巡って,返される結果のリストを表します. 序列の全ての要素を巡る文脈環境では (join () メソッドの呼び出しのように),zip () が返されるエデュレータは正常に動作する。2to3スクリプトはこれらの状況を検出し,あなたのコードに変更はしません。
Python 2では,StandardErrorはStopIteration,GeneratorExit,KeyboardInterrupt,SystemExit以外のすべての内蔵例外の基層である.Python 3では,StandardErrorは削除され,Exceptionで置き換えられている.
Notes | Python 2 | Python 3 |
---|---|---|
① | x =StandardError() | x =Exception() |
② | x =StandardError(a, b, c) | x =Exception(a, b, c) |
types モジュールには,オブジェクトのタイプを決定するのに役立つ様々な常数があります. Python 2では,dictやintのようなすべての基本的なデータタイプを代表する常数が含まれています. Python 3では,これらの常数は既に削除されています. 基本型の名前を使うだけで置き換えることができます.
Notes | Python 2 | Python 3 |
---|---|---|
types.UnicodeType | str | |
types.StringType | bytes | |
types.DictType | dict | |
types.IntType | int | |
types.LongType | int | |
types.ListType | list | |
types.NoneType | type(None) | |
types.BooleanType | bool | |
types.BufferType | memoryview | |
types.ClassType | type | |
types.ComplexType | complex | |
types.EllipsisType | type(Ellipsis) | |
types.FloatType | float | |
types.ObjectType | object | |
types.NotImplementedType | type(NotImplemented) | |
types.SliceType | slice | |
types.TupleType | tuple | |
types.TypeType | type | |
types.XRangeType | range |
types.StringTypeは,Python 2のstring (非Unicodeコードの文字列,つまり普通の文字列) は,実際には,ある種の文字コードを使用したバイトの配列 (a sequence of bytes) であるため,stringTypeは,stringsではなくバイトに映し出されます.
isinstance () 関数は,あるオブジェクトが特定のclassまたはtypeのインスタンスをチェックする.Python 2では,type () で構成された元組をisinstance () に渡すことができます.そのオブジェクトが元組の任意のタイプである場合,関数はTrue () を返します.Python 3では,あなたはまだそれを行うことができますが,タイプを参数として2回渡すことは推奨されません.
Notes | Python 2 | Python 3 |
---|---|---|
isinstance(x,(int,float,int)) | isinstance(x,(int,float)) |
Python 2 には2種類の文字列タイプがあります.Unicode でコードされた文字列と,Unicode でコードされていない文字列です.しかし,実際には別のタイプ,basestringがあります.これは抽象データ型であり,str と unicode の超クラスである.これは直接呼び出しまたはインスタンス化することはできませんが,インスタンスのパラメータとして使って,オブジェクトがUnicode 文字列か非Unicode 文字列かを検出できます.Python 3 では,文字列タイプが1つしかないので,basestringは存在する必要はありません.
Notes | Python 2 | Python 3 |
---|---|---|
isinstance(x, basestring) | isinstance(x, str) |
Python 2.3 では,itertools モジュールが導入され,全局関数zip (),map (),filter (),の変数 (variant) が定義され,これらの変数の返却型はリストではなく,代入型である.Python 3 では,これらの全局関数の返却型が本来の代入型であるため,これらのitertools の変数関数は削除されました.
Notes | Python 2 | Python 3 |
---|---|---|
① | itertools.izip(a, b) | zip(a, b) |
② | itertools.imap(a, b) | map(a, b) |
③ | itertools.ifilter(a, b) | filter(a, b) |
④ | from itertools import imap, izip, foo | from itertools import foo |
1 グローバルzip () 関数を使用し,itertools.izip () ではなく. 2 map (マップ) を使ってitertools.imap (マップ) を使わない. 3 itertools.ifilter ((() は filter ((() になった 4 itertools モジュールは Python 3 に残っているが,グローバルネームスペースに移行した関数を含まない. 2to3 スクリプトは,他のインポート文の整合性を維持しながら,もはや役に立たないインポート文を削除するのに十分な知性を持つ.
異例処理の際には,sysモジュール内に3つの変数があります.sys.exc_type,sys.exc_value,sys.exc_traceback。(実際は,これらはPython 1の時代に存在していました。) Python 1.5からは,新しいsys.exc_infoが登場したため,この3つの変数を使用することはもはや推奨されません.これは,上記の3つの要素をす