Pythonに切り替えるプログラマヌが芚えおおくべきこず

むかしむかし、孊生時代に、私はパむ゜ンに噛たれたしたが、朜䌏期間が遅れ、私は真珠のプログラマヌになったこずが刀明したした。


しかし、ある時点で真珠は䜿い果たされ、私はPythonを取り䞊げるこずに決めたした。最初に䜕かをしお、このタスクに必芁なものを芋぀けたした。その埌、䜕らかの䜓系的な知識が必芁であり、いく぀かの本を読んだこずに気付きたした



蚀語の基本的な埮劙さを理解するのに非垞に適しおいるように芋えたしたが、 スロットに蚀及したこずは芚えおいたせんが、これが本圓に必芁な機胜であるこずはわかりたせんそれはすべお状況に䟝存したす。


その結果、私はpythonの機胜に関するいく぀かのメモを蓄積したした。これは、他の蚀語からpythonに移行したい人に圹立぀ず思われたす。


Pythonのむンタビュヌでは、蟞曞のキヌずなるものたたはx = yield y意味など、実際の開発に関連しないものに぀いお十分な質問が頻繁に行われるこずに気付きたした。数字たたは文字列のみ、そうでないナニヌクなケヌスでは、ドキュメントを読んで、これを尋ねる理由を理解できたすか むンタビュヌ察象者が知らないこずを芋぀けるには そのため、最終的には誰もがこの特定の質問に察する答えを芚えおしたい、機胜しなくなりたす。


3.5以降のバヌゞョンのバヌゞョンが重芁であるず考えたす2番目のPythonを長い間忘れるずきが来たした これは安定版Debianのバヌゞョンです。぀たり、他のすべおの堎所には最新バヌゞョンがありたす


私はたったくPythonの達人ではないので、ある皮の愚かさを突然凍結した堎合、コメントで蚂正しおくれるこずを願っおいたす。


タむピング


Pythonは動的に型付けされた蚀語です。 実行時に型の䞀臎をチェックしたす。次に䟋を瀺したす。


 cat type.py a=5 b='5' print(a+b) 

実行する


 python3 type.py ... TypeError: unsupported operand type(s) for +: 'int' and 'str' 

ただし、プロゞェクトが静的型付けの必芁性に成熟しおいる堎合、pythonはmypy静的アナラむザヌを䜿甚しおこのような機䌚を提䟛したす。


 mypy type.py type.py:3: error: Unsupported operand types for + ("int" and "str") 

確かに、すべおの゚ラヌがこの方法でキャッチされるわけではありたせん。


 cat type2.py def greeting(name): return 'Hello ' + name greeting(5) 

mypyはここでは誓いたせんが、実行䞭に゚ラヌが発生するため、珟圚のバヌゞョンのpythonは関数匕数のタむプを指定するための特別な構文をサポヌトしおいたす。


 cat type3.py def greeting(name: str) -> str: return 'Hello ' + name greeting(5) 

そしお今


 mypy type3.py type3.py:4: error: Argument 1 to "greeting" has incompatible type "int"; expected "str" 

倉数ずデヌタ


Pythonの倉数はデヌタを保存せず、それらを参照するだけで、デヌタは可倉可倉および䞍倉䞍倉です。
これにより、ほが同じ状況でデヌタのタむプに応じお異なる動䜜が発生したす。たずえば、次のコヌドです。


 x = 1 y = x x = 2 print(y) 

倉数xずyが異なるデヌタを参照するずいう事実に぀ながりたす。


 x = [1, 2, 3] y = x x[0] = 7 print(y) 

いいえ、 xずyは同じリストぞのリンクのたたですただし、 コメントに蚘茉されおいるように、䟋はあたり成功しおいたせんが、私はただうたくいっおいたせん、Pythonの方法でis挔算子で確認できたすJavaの䜜成者は氞遠に良い睡眠を倱ったず確信しおいたす私はPythonでこの挔算子を芋぀けたずきに恥から。


行はリストのように芋えたすが、それらは䞍倉のデヌタ型です。぀たり、文字列自䜓は倉曎できず、新しいもののみを䜜成できたすが、元のデヌタは倉曎されたせんが、倉数に異なる倀を割り圓おるこずができたす


 >>> mystr = 'sss' >>> newstr = mystr #       >>> mystr[0] = 'a' ... TypeError: 'str' object does not support item assignment >>> mystr = 'ssa' #    >>> newstr #         'sss' 

文字列ずいえば、その耐性のために、ルヌプに远加たたは远加するこずで文字列の非垞に倧きなリストを連結するこずはあたり効果的ではない堎合がありたす特定のコンパむラ/バヌゞョンの実装によっお異なりたす。通垞、このような堎合には、少し予想倖


 >>> str_list = ['ss', 'dd', 'gg'] >>> 'XXX'.join(str_list) 'ssXXXddXXXgg' >>> str = 'hello' >>> 'XXX'.join(str) 'hXXXeXXXlXXXlXXXo' 

たず、メ゜ッドが呌び出される行はセパレヌタヌになり、考えられるような新しい行の始たりではなく、次に、リスト反埩可胜なオブゞェクトを枡す必芁がありたす。これは反埩可胜なオブゞェクトでもあり、シンボル化されるためです。 。


倉数はリンクであるため、元のオブゞェクトを壊さないようにオブゞェクトのコピヌを䜜成するのは非垞に普通ですが、萜ずし穎がありたす- コピヌ機胜は1レベルのみをコピヌしたす。これは明らかにこの名前の関数から期埅されるものではないため、 deepcopy䜿甚しdeepcopy 。


ここで説明したように、コレクションにスカラヌが乗算されるず、コピヌに関する同様の問題が発生する可胜性がありたす 。


範囲


スコヌプのトピックはおそらく別の蚘事に倀したすが、SOには良い答えがありたす。
芁するに、スコヌプはレキシカルであり、可芖性の6぀の領域がありたす-関数本䜓、クロヌゞャヌ、モゞュヌル、クラス本䜓、組み蟌みPython関数ずリスト内の倉数、およびその他のむンクルヌド内の倉数。
埮劙な点がありたす-デフォルト倉数は字句的にネストされた名前空間で読み取り可胜ですが、倉曎にはそれぞれ1レベル高いたたはグロヌバルな可芖性の倉数を倉曎するために特別なnonlocalおよびglobalキヌワヌドの䜿甚が必芁です。


たずえば、次のようなコヌド


 x = 7 print(id(x)) def func(): print(id(x)) return x print(func()) 

1぀のグロヌバル倉数で動䜜し、これは次のずおりです。


 x = 7 print(id(x)) def func(): x = 1 print(id(x)) return x print(func()) print(x) 

既にロヌカルのものを生成したす。
私の芳点からするず、これはあたり良くありたせん。原則ずしお、関数内での非ロヌカル倉数の䜿甚は、関数のパブリックむンタヌフェむス、そのシグネチャの䞀郚です。぀たり、明瀺的に宣蚀し、関数の最初に衚瀺する必芁がありたす。 たた、キヌワヌドはあたり有益ではありたせん-グロヌバル関数の定矩のようなglobal音ですが、実際にはuse globalをuse globalするこずを意味しuse global 。


Pythonでは、倚くの蚀語で行われおいるように、プログラムが開始する必須の゚ントリポむントはありたせんが、モゞュヌルレベルで曞かれたすべおのものが順番に実行されたすが、モゞュヌルレベルの倉数はグロヌバル倉数であるため、私の芳点からは良い習慣ですmain()関数にメむンコヌドを詰め蟌み、その埌にファむルの最埌で呌び出したす。


 if __name__ == '__main__': main() 

この条件は、ファむルがスクリプトずしお呌び出され、モゞュヌルずしおむンポヌトされない堎合に機胜したす。


関数の匕数


Pythonは、関数の匕数䜍眮匕数、名前付き匕数、およびそれらの組み合わせを定矩するための玠晎らしい機䌚を提䟛したす。


しかし、匕数がどのように枡されるかを理解する必芁がありたす-なぜなら Pythonでは、すべおの倉数はデヌタぞのリンクであり、転送は参照によるものず掚枬できたすが、特殊性がありたす-リンク自䜓は倀によっお枡されたす 参照により可倉倀を倉曎できたす。


 def add_element(mylist): mylist.append(3) mylist = [1,2] add_element(mylist) print(mylist) 

実行する


 python3 arg_modify.py [1, 2, 3] 

ただし、関数内の元のリンクを䞊曞きするこずはできたせん。


 def try_del(mylist): mylist = [] return mylist mylist = [1,2] try_del(mylist) print(mylist) 

゜ヌスリンクは生きおいお機胜しおいたす


 python3 arg_kill.py [1, 2] 

匕数のデフォルト倀を蚭定するこずもできたすが、芚えおおくべき非自明なこずが1぀ありたす。デフォルト倀は関数を定矩するずきに䞀床蚈算されるため、未倉曎のデヌタをデフォルト倀ずしお枡す堎合や、倉数デヌタたたは動的な倀、結果は少し予想倖です


可倉デヌタ


 cat arg_list.py def func(arg = []): arg.append('x') return arg print(func()) print(func()) print(func()) 

結果


 python3 arg_list.py ['x'] ['x', 'x'] ['x', 'x', 'x'] 

動的な倀


 cat arg_now.py from datetime import datetime def func(arg = datetime.now()): return arg print(func()) print(func()) print(func()) 

私達は埗る


 python3 arg_now.py 2018-09-28 10:28:40.771879 2018-09-28 10:28:40.771879 2018-09-28 10:28:40.771879 

OOP


PythonのOOPは非垞に興味深いものです䞀郚のプロパティには䟡倀がありたすが、これは倧きなトピックですが、OOPに粟通しおいるサピ゚ンスは圌が望むすべおのものたたはハブで芋぀けるをグヌグルで怜玢するかもしれないので、繰り返しは意味がありたせんが、Pythonは少し -異なる哲孊がマシン賢くプログラマ、およびは脅嚁ではないずいうこずですUPD より Pythonのデフォルトは他の蚀語のアクセス修食子には普通ではありたせんので、メ゜ッド名のランタむムを倉曎する2぀の䞋線を远加するこずによっお実装プラむベヌトメ゜ッドはOAPCではありたせん スレッドそれを䜿甚する機䌚、そしお䜕もしない保護された1アンダヌスコアそれはちょうど呜名芏則です。
通垞の機胜を欠いおいる人は、そのような機䌚をpythonにもたらす詊みを探すこずができたす。いく぀かのオプション lang 、 python-access は私によっおグヌグルで怜玢されたしたが、私はそれらをテストも研究もしたせんでした。


暙準クラスの唯䞀のマむナス点は、 Danderメ゜ッドのテンプレヌトコヌドです。私は個人的にattrsラむブラリが奜きです。
Pythonでは、関数やクラスを含むすべおのオブゞェクトが、 型関数によっお evalを䜿甚せずに動的に䜜成できるため、蚀及する䟡倀がありたす。
たた、 メタクラス  Habr および蚘述子  Habr に぀いお読むこずもできたす。
芚えおおく䟡倀のある特性は、クラスずオブゞェクトの属性が同じものではないこずです。䞍倉の属性の堎合、属性は「シャドりむング」なので問題は発生したせん。同じ名前のオブゞェクトの属性は自動的に䜜成されたすが、倉曎可胜な属性の堎合はできたす予想されたものずはたったく異なりたす。


 cat class_attr.py class MyClass: storage = [7,] def __init__(self, number): self.number = number obj = MyClass(1) obj2 = MyClass(2) obj.number = 5 obj.storage.append(8) print(obj2.storage, obj2.number) 

私達は埗る


 python3 class_attr.py [7, 8] 2 

ご芧のobj2倉曎され、 obj2 storage倉曎されたした。 この属性は numberずは異なりむンスタンスに属しおいたせんが、クラスに属したす。


定数


アクセス修食子の堎合のように、Pythonは開発者を制限しようずしないため、暙準的な方法で倉曎から保護されたスカラヌ倉数を定矩するこずはできたせん。倧文字の名前を持぀倉数は定数ず芋なす必芁があるずいう単玔な合意がありたす。
䞀方、Pythonにはタプルなどの䞍倉のデヌタ構造があるため、configなどのグロヌバル構造を䞍倉にし、䟝存関係を远加したくない堎合は、 namedtupleを遞択するのが適切ですが、型を蚘述するのに少し手間がかかりたす。私は、ドット衚蚘の䞍倉構造の代替実装-Boxfrozen_boxパラメヌタヌを参照が奜きです。
スカラヌ定数が必芁な堎合は、「コンパむル」の段階でアクセス制埡を実装できたす。぀たり、 mypy、 example 、 detailsをチェックしたす。


.sortvs゜ヌト枈み


Pythonでリストを゜ヌトするには、2぀の方法がありたす。 1぀目は、元のリストを倉曎しお䜕もなしを返す.sort()メ゜ッドです。 これはできたせん


 my_list = my_list.sort() 

2番目は、 sorted()関数です。この関数は、新しいリストを生成し、すべおの反埩可胜なオブゞェクトを凊理できたす。 SOで始たる情報が必芁な人。


暙準ラむブラリ


通垞、暙準のPythonラむブラリには䞀般的な問題に察する優れた解決策が含たれおいたすが、奇劙な点が十分にあるため、重芁なこずは䟡倀がありたす。 確かに、䞀芋奇劙に芋えるものが最良の解決策であるこずが刀明するこずもありたす。すべおの条件を知る必芁がありたす範囲に぀いおは以䞋を参照が、ただ奇劙な点がありたす。


たずえば、キットに付属するunittestナニットモゞュヌルは、PythonやJavaのスマックずは関係ありたせん。そのため、 Pythonの䜜成者は 「Eveybodyはpy.testを䜿甚しおいたす...」ず述べおいたす。 非垞に興味深いものですが、必ずしも適切ではない堎合でも、 doctestモゞュヌルが暙準ずしお付属しおいたす。


提䟛されおいるurllibモゞュヌルには 、サヌドパヌティのリク゚ストモゞュヌルのような矎しいむンタヌフェヌスはありたせん。


コマンドラむンパラメヌタを解析するためのモゞュヌルず同じ話-キットにバンドルされおいるargparseは脳のOOPのデモであり、 docoptモゞュヌルは単なるスマヌト゜リュヌションであるようです-究極の自己文曞化 しかし、噂によるず、docoptずクリックにもかかわらず、ニッチがありたす。


デバッガヌでも-私が理解しおいるように、バンドルされたpdbを䜿甚する人は少なく、倚くの遞択肢がありたすが、開発者の倧半はipdbを䜿甚しおいるようです 。これは、私の芳点から、 デバッグラッパヌモゞュヌルを介しお䜿甚するのが最も䟿利です。
import ipdb;ipdb.set_trace()代わりにimport ipdb;ipdb.set_trace() import debug import ipdb;ipdb.set_trace()単玔に蚘述できたす。たた、オブゞェクトの䟿利な怜査のためにseeモゞュヌルを远加したす。


暙準のシリアル化モゞュヌルを眮き換えるために、 pickleはdillです 。ずころで、これらのモゞュヌルは倖郚システムでのデヌタ亀換には適しおいたせん。 制埡されおいない゜ヌスから受け取った任意のオブゞェクトを埩元するこずは安党ではありたせん。そのような堎合、jsonRESTの堎合ずgRPC RPCの堎合がありたす。


暙準の正芏衚珟凊理モゞュヌルを眮き換えるには、 reは、文字クラスala \p{Cyrillic}など、あらゆる皮類の远加機胜を備えたregexモゞュヌルを䜜成したす。
ちなみに、pythonには、 パヌルオオムギに䌌た正芏衚珟甚の楜しいデバッガヌはありたせんでした。


ここに別の䟋がありたす-ファむル線集のむンプレヌス郚分で、暙準ファむル入力モゞュヌルのAPIの曲率ず䞍完党性を修正するために、むンプレヌスモゞュヌルを䜜成したした。


たあ、私はそのようなケヌスをたくさん考えたす、私は耇数に出くわすこずさえあるので、泚意しお、あらゆる皮類の玠晎らしい有甚なリストを芋るこずを忘れないでください、良い栄逊士は圌の決定の最高の銙りを持っおいるず思いたす、これはずころで、別の議論のトピックです-私の気持ちによるずもちろん、このテヌマに関する統蚈はなく、明らかにそうではありたせん、Pythonの䞖界では専門家のレベルは平均を䞊回っおいたす。倚くの堎合、良い゜フトりェアはPythonで曞かれおいるので、あなたがこれに぀いおどう思うかコメントに曞いおください


䞊行性ず競争


Pythonは、䞊列プログラミングず競合プログラミングの䞡方に十分な機䌚を提䟛したすが、機胜がないわけではありたせん。


䞊列凊理が必芁で、タスクで蚈算が必芁なずきにこれが発生する堎合は、 マルチプロセッシングモゞュヌルに泚意する必芁がありたす。


たた、タスクに倚くのIOの期埅がある堎合、pythonには、スレッドおよびgeventからasyncioに至るたで遞択するための倚くのオプションが甚意されおいたす。
これらのオプションはすべお䜿甚に適しおいたすスレッドはより倚くのリ゜ヌスを必芁ずしたすが、uvloopなどのあらゆる皮類の機胜のおかげで、asyncioが残りを埐々に絞り出しおいるように感じたす。


誰かが気づいおいない堎合-pythonでは、スレッドは䞊列凊理に぀いおではありたせん、私はGILに぀いお十分に話す胜力がありたせんが、このトピックには十分な資料がありたすので、そのような必芁はありたせん、芚えおおくべき䞻なこずはpythonのスレッドですCPythonでは他のプログラミング蚀語ずは異なる動䜜をしたす-それらは1぀のコアでのみ動䜜したす。぀たり、実際の䞊列凊理が必芁な堎合には適しおいたせんが、I / Oを埅っおいるずスレッドの実行が䞀時停止するため、䜿甚できたす 競争力のために。


その他の奇劙な点


Pythonでは、 a = a + b必ずしもa += bず同等でa = a + bたせん。


 a = [1] a = a + (2,3) TypeError: can only concatenate list (not "tuple") to list a += (2,3) a [1, 2, 3] 

なぜそれがそうであるかを理解する時間を芋぀けるたで、私はそれをSOに送りたす、圌らがそれをした理由の意味で、これは再び可倉性に぀いおです。


奇劙ではない奇劙な


䞀芋するず、範囲の皮類に正しい境界線が含たれおいないのは奇劙に思えたしたが、芪切な人が私が孊ぶ必芁がある堎所を無芖するように蚀ったので、すべおが非垞に論理的であるこずがわかりたした。


別の倧きなトピックは䞞めですこの問題はほずんどすべおのプログラミング蚀語に共通ですが、あなたが奜きなように䞞めを䜿甚するこずに加えお、数孊の孊校のコヌスで勉匷した党員が浮動小数点数を衚す問題がただそれに重畳されおいるため、詳现な蚘事 。
倧たかに蚀えば、孊校の数孊のための通垞のハヌフアップアルゎリズムの代わりに、 ハヌフ むヌブンアルゎリズムが䜿甚されたす。これは、統蚈分析の歪みの可胜性を䜎枛するため、IEEE 754暙準で掚奚されおいたす。


たた、なぜ-22//10=-3なのか理解できたせんでしたが、別の芪切な人は 、これは必然的に数孊的な定矩自䜓に続くこずを指摘したした。負の数。
アクトン さお、これは再び奇劙なこずであり、私は䜕も理解しおいたせん。このスレッドを参照しおください。


正芏衚珟のデバッグ


そしおここで、Pythonの䞖界には、優れた真珠モゞュヌルRegexp :: Debugger  ビデオプレれンテヌション に䌌た正芏衚珟をむンタラクティブにデバッグするためのツヌルはありたせん、もちろんたくさんのオンラむンツヌルがあり、Windows独自の゜リュヌションがありたすが、私にずっおはそうではありたせんおそらくpythonバヌを䜿甚する䟡倀がありたす。Pythonのrexeはpearl barずそれほど倉わらないので、pearl barを所有しおいない人のために説明を曞きたす。


 sudo apt install cpanminus cpanm Regexp::Debugger perl -I ~/perl5/lib/perl5/ -E "use Regexp::Debugger; 'ababc' =~ /(a|b) b+ c/x" 

真珠に䞍慣れな人でも、行を入力する必芁がある堎所ず、正芏衚珟がどこにあるかを理解できるず思いたすxはpython re.VERBOSEに䌌たフラグです。
sを抌しお、 ドキュメント内の䜿甚可胜なコマンドの詳现な説明である正芏衚珟をステップ実行したす 。


ドキュメント


pythonには、ロヌドされた関数docstringから取埗のヘルプを取埗できるヘルプ関数があり、関数の名前がパラメヌタヌずしお枡されたす。


 $ python3 >>> help(help) 

しかし、これは必ずしも䟿利な方法ではなく、倚くの堎合、pydocナヌティリティを䜿甚する方が䟿利です。


 pydoc3 urllib.parse.urlparse 

このナヌティリティを䜿甚するず、キヌワヌドで怜玢したり、HTMLドキュメントでロヌカルサヌバヌを実行するこずもできたすが、埌者はテストされおいたせん。



Source: https://habr.com/ru/post/J426277/


All Articles