Pythonの進歩の道-見習いからグルへ


659

私はPythonを1年半学び、働き、遊んでいます。生物学者がゆっくりとバイオインフォマティクスに目を向けているため、この言語は、私がラボで行ったすべての主要な貢献の中心にありました。私は多かれ少なかれ、Pythonが美しい解決策を表現することを可能にする方法と、思考から実行可能なコードへのそのような自然な流れを可能にする言語のセマンティクスに恋をしました。

私が知りたいのは、私がこのフォーラムや他のフォーラムでめったに見たことのない種類の質問に対するあなたの答えです。この質問は、Pythonの改善への道のりの誰にとっても中心的なもののようですが、彼の次のステップはどうあるべきか疑問に思っています。

最初に聞きたくないことをまとめてみましょう;)

  • Pythonをすばやく学ぶ方法を知りたくない
  • また、その言語に精通するための最良の方法を見つけたいとも思わない
  • 最後に、私は「すべてを行う1つのトリック」のアプローチを知りたくありません。

私があなたの意見について知りたいのは、

見習いから達人のステータスまで(専門知識が指示するところはどこでも自由に停止してください)、Pythonジャーマンに推奨するステップは何ですか?SOの一部の人々は、Pythonの腕前を崇拝する価値があるようです。私たちに啓発してください:)

私が楽しむ種類の回答(ただし、読者を驚かせてもかまいません:P)は、多かれ少なかれ次のようにフォーマットされています。

  • これを読んで(例:pythonチュートリアル)、そのような詳細に注意してください
  • 非常に多くの時間/問題/コード行のコード
  • 次に、これを読みます(例:これまたはその本)が、今回はこれに注意してください
  • いくつかの実際の問題に取り組む
  • 次に、Yの読み取りに進みます。
  • これらの概念を必ず理解してください
  • X時間のコード
  • そのような基本に戻るか、さらに進んでください...
  • (あなたはポイントを得る:)

常に(当然ながら努力して)進むために、さまざまな段階で正確に何に注意を払うべきかについてのあなたの意見を知ることは本当に重要です。特定の専門分野の出身である場合は、この分野で適切と思われるパスについて話し合ってください。

編集:あなたの素晴らしい入力のおかげで、私はPython改善トラックに戻ってきました!本当に感謝しております!

回答:


471

Pythonを習得するプロセスは次のようなものだと思いました。

  1. 発見のリストの内包表記
  2. 発電機を発見
  3. 組み込むマップ、減らす、フィルタ、ITER、範囲、xrangeの頻繁にあなたのコードに
  4. デコレータを発見する
  5. 再帰関数をたくさん書く
  6. itertoolsfunctoolsを発見する
  7. リアルワールドハスケルを読む(オンラインで無料で読む
  8. 大量の高次関数、再帰などを使用して、古いPythonコードをすべて書き換えます。
  9. 彼らがあなたにPythonクラスを提示するたびにあなたのキュービクルメイトを困らせます。辞書といくつかの関数として実装した方が「良い」と言えるでしょう。関数型プログラミングを採用します。
  10. 戦略パターンを再発見し、次にHaskellの後で忘れようと一生懸命に努力した命令型コードからこれらすべてのものを発見します。
  11. バランスを見つける。

@wheaties超素敵なリスト、大好きです!あなたは関数型プログラミングに偏り、オブジェクト指向から離れているようです...特別な理由はありますか?Haskellの経験から、このアプローチへとあなたを変えたのですか?
モーロック

8
はいといいえ。関数型プログラミングに近づくほど、より適切で簡潔なコードを記述できるようになります。とはいえ、物事が命令的な方法でより明確に表現される場所はたくさんあります。Real World HaskellがPythonコンベンションで売り切れたのには理由があります。私のアドバイスですが、できるだけ多くのPythonの側面を調べてから、関数型言語を試してください。
ウィーティー

@wheatiesは、求められている形式に非常に近く、非常に刺激的であるため、返信を受け取ります。返信にご協力いただきありがとうございます。
モーロック

1
初心者:辞書、その後...習得:メタプログラミング
gath

>>詳しく説明してください。辞書といくつかの関数として実装する方が「良い」と言えます。<<?
Koobz

108

Pythonの知識を深めるための1つの良い方法は、すでに使用しているライブラリ、プラットフォーム、フレームワークのソースコード掘り下げることです。

たとえば、Djangoでサイトを構築している場合、Djangoが問題の機能をどのように実装しているかを調べることで、困惑する可能性のある多くの質問に答えることができます。

このようにして、引き続き新しいイディオム、コーディングスタイル、およびPythonのトリックを習得します。(良いものもあれば悪いものもあります。)

そして、ソースで理解できないPythonyを見つけたら、#python IRCチャネルに移動すると、たくさんの「言語弁護士」が説明してくれます。

これらの小さな説明が何年にもわたって蓄積されると、言語とそのすべての内外の理解が深まります。


1
django拡張/プラグインを単にインストールする代わりに、gitブランチを使用してコードを手動で追加してみてください。これにより、プロジェクトに追加するコードを実際に読み取る必要があります。
g33kz0r 2010

14
私たちの残りの人が質問から利益を得ることができるのになぜIRCを使うのか興味がありますか?
tshepang 2010

1
「イディオム、スタイル、トリック」の+1。接触している実在の人々によって作られた本物の文化に生きること(この接触が主にお互いのコードを読むことを意味する場合でも)は、人間の知識を時間とともに進化させてきたものです。
heltonbiker 2013

92

メモリ管理に関するPythonのデータ型とその役割を(より深く)理解する

コミュニティの一部の方が承知しているように、私はPythonコースを教えています。最も人気のあるコースは、総合的な導入+中級コースと、アプリケーション開発のさまざまな分野を紹介する「上級」コースです。

「イントロまたは上級コースを受講する必要がありますか?私はすでにPythonを1〜2年間プログラミングしており、イントロは簡単すぎると思うので、すぐに上級に行きたい...どのコースを勧めしますか?」

彼らの質問に答えるために、私は彼らがこの分野でどれほど強いかを調査します-それが彼らが任意の上級コースの準備ができているかどうかを測定する本当に最良の方法ではありませんが、彼らの基本的な知識がPythonのオブジェクトとメモリモデル。これは初心者だけでなく、それを超えた人々によって書かれた多くの Pythonバグの原因です。

これを行うには、次の簡単な2部構成のクイズの質問を紹介します。 例1:x = 42;  y = x;  x + = 1;  x、yを印刷するEx2:x = [1,2,3]; y = x; x [0] = 4; print x、y

多くの場合、彼らは出力を取得することができますが、なぜ応答がより困難ではるかに重要であるのか...「理由」が80%のクレジットを取得する間、出力を回答の20%と評価します。彼らが理由を理解できない場合は、Pythonの経験に関係なく、オブジェクトとメモリ管理について1つの講義を行い、出力とその理由を十分に信頼してください。(1〜2年後にPythonの構文を知っているからといって、Pythonが内部でどのように機能するかを十分に理解するまでは、「初心者」のラベルを超える準備はできません。)

同様の答えを要求する後続の問い合わせはさらに困難です。たとえば、

例3

x = ['foo', [1,2,3], 10.4]
y = list(x) # or x[:]
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y

次に推奨するトピックは、参照カウントをよく理解し、「インターニング」の意味を理解することです(ただし、必ずしも使用する必要はありません)。浅いコピーと深いコピー(上記の例3のように)について学習し、最後に、さまざまなタイプと言語のコンストラクト、つまり、リストとタプル、辞書とセット、リスト内包とジェネレータ式、イテレータとジェネレータなど。ただし、他のすべての提案は別の時間の別の投稿です。それまでの間、お役に立てば幸いです。:-)

ps。私は他のプロジェクトのソースコードを研究するだけでなく、内省に親しむための他の応答にも同意し、両方の提案に強力な「+1」を追加します。

pps。ところで素晴らしい質問です。私が最初はこのようなことを尋ねるのに十分頭が良ければよかったのですが、それはずっと前のことでした。今、私は長年のフルタイムのPythonプログラミングで他の人を助けようとしています!!


ウェスリー・チュン!モーロック、これはあなたが質問の太字部分で話していた種類の男です。非常に才能のある先生でもある知識豊富な男で、私は本から大きな後押しを受けました。
2010

thx @bvmou!他の皆と同じようにこの学習プロセスを経なければならなかったので、私はこの質問に答えることしかできませんでした...私だけが13年前でした!:-) thxはcorepython.comをプラグインするためのものです!:-)
wescpy

@wescpy example3の出力を説明してもらえますか、またはこのことを学ぶための優れたリソースを教えてください。ありがとう。
Sankalp 2013

1
トリックは、オブジェクト自体ではなく、オブジェクト参照のみがコピーされることです。それだけです...それが役に立てば幸いです!私は数週間前に実際にOSCONでこれについて講演しました。誰かがカンファレンスで最高の評価を受けたPythonの講演であると誰かが言ったとき、私はうれしい驚きでした!スライドはこちらからダウンロードできます:oscon.com/oscon2013/public/schedule/detail/29374
wescpy

出力はSyntaxErrorです:無効な構文ですね。どうして?私はPython 3を使用しているためprint、ステートメントではありません。
Konrad Borowski 2013年

67

10年でマスタープログラマーになることについてのPeter Norvigのエッセイをチェックしてください:http : //norvig.com/21-days.html。私はそれがどの言語にも当てはまることを期待します。


59

イントロスペクションを理解する

  • dir()同等のものを書く
  • type()同等のものを書く
  • 「サルパッチ」の方法を理解する
  • disモジュールを使用して、さまざまな言語構造がどのように機能するかを確認します

これらのことを行うと

  • Pythonがどのように実装されているかについての理論的な知識を教えてください
  • 下位レベルのプログラミングの実践的な経験を提供します
  • Pythonデータ構造を直感的に理解できるようにする

1
type()同等のものを作成する」は、の完全なメタクラシー仕様を採用する場合は非常に困難ですtype
asmeurer 2013年

48
def apprentice():
  read(diveintopython)
  experiment(interpreter)
  read(python_tutorial)
  experiment(interpreter, modules/files)
  watch(pycon)

def master():
  refer(python-essential-reference)
  refer(PEPs/language reference)
  experiment()
  read(good_python_code) # Eg. twisted, other libraries
  write(basic_library)   # reinvent wheel and compare to existing wheels
  if have_interesting_ideas:
     give_talk(pycon)

def guru():
  pass # Not qualified to comment. Fix the GIL perhaps?

4
guru()はパスする必要があります。グルを説明できるものは何もありません。通過させてください
inv

1
GILを修正すると、グルよりもレベルが高くなりますが、慈悲深い独裁者のすぐ下になります。;)
アダムパーキン

41

私は、誰にでもできると思う最も単純で最も効果的なアドバイスを提供します。コードです。

コーディングすることで、言語を理解することを意味します。あなたは積極的にコーディングを楽しみ、刺激を受け、質問し、自分で答えを見つける必要があります。

1時間の余裕がありますか?文字列を逆にするコードを記述し、最適なソリューションを見つけます。自由な夜?Webスクレイピングを試してみませんか。他の人々のコードを読んでください。彼らが物事をどのように行うかを参照してください。何をするか自分自身に問いかけてください。

コンピューターに飽きたら、IDEを開いてコードストームを実行します。面白くてやりがいのあるアイデアを書き留めます。URL短縮?もちろんできます。ああ、副作用として数をあるベースから別のベースに変換する方法を学びました!

これはあなたのスキルレベルに関係なく有効です。あなたは学習を止めることはありません。余暇に積極的にコーディングすることで、少しの労力で言語を理解し、最終的には第一人者になります。知識と再利用可能なコードを構築し、イディオムを記憶します。


24

あなたが科学にPythonを使用している場合(あなたがそうであるようです)、その一部は科学ライブラリーの学習と理解になります、私にとってこれらは

  • 派手な
  • 辛い
  • matplotlib
  • mayavi / mlab
  • チャコ
  • Cython

適切なライブラリを使用してコードをベクトル化する方法を知ることは、科学計算に不可欠です。

追加したかったのは、大規模な数値データセットを一般的なpythonicの方法(オブジェクト指向のアプローチ、リスト、イテレータ)で処理すると、非常に非効率になる可能性があることです。科学計算では、ほとんどの従来のPythonコーダーがデータにアプローチする方法とは大幅に異なる方法でコードを構造化する必要がある場合があります。


ありがとう。大規模なデータセットのメモリ使用の効率を上げるために、numpyとscipyを学ぶのに時間をかける価値は確かにあります!
Morlock、

1
おそらくパンダとIPythonをリストに追加します。
エリックウィルソン

23

Googleは最近、オンラインPythonクラス(「コース」のような「クラス」)をリリースしました。

http://code.google.com/edu/languages/google-python-class/

これはあなたの完全な質問の答えにはなりませんが、始めるのに最適な場所だと思います!


6
実際、グーグルからのこれらのビデオ講義は、私が考える中級から上級に向けられています。code.google.com/intl/fi-FI/edu/languages/...
トム・ウィリス


12

すべてのデータ型と構造を完全に理解する

すべてのタイプと構造について、タイプまたはデータ構造のあらゆる側面を実行する一連のデモプログラムを作成します。これを行う場合、それぞれについてノートをブログすることは価値があるかもしれません...それは多くの人々に役立つかもしれません!


これはPythonだけでなく、抽象的な意味でも役立ちます。
ハンフリーボガート

1
これも私がやっていることです。新しい構成要素を見つけるたびに、その使用方法を示すおもちゃのプログラムを書きます。そしてそれをgithubリポジトリにオンラインに入れてください:github.com/pzelnip/MiscPython
Adam Parkin

10

私は最初にpythonサイトでチュートリアルを行うだけで、夏にかけて自分でpythonを学びました(残念ながら、これを見つけることができなくなったため、リンクを投稿できません)。

その後、pythonは大学の1年生コースの1つで教えられました。その後の夏、私はPythonChallengeGoogle Code Jamの問題を練習しました。これらの問題を解決することは、アルゴリズムの観点からだけでなく、Pythonが何ができるかを学習する観点から、またそれを操作してPythonを最大限に活用する方法からも役立ちます。

同様の理由で、コードゴルフも機能すると聞いたことがありますが、自分で試したことがありません。


3
このチュートリアルですか?Python 2:docs.python.org/tutorial/index.html ; Python 3:docs.python.org/py3k/tutorial/index.html
ハンフリーボガート、

10

学習アルゴリズム/数学/ファイルIO / Python最適化

これはあなたに根性がありますが、まず始めに、プロジェクトオイラー問題に取り組んでみてください。 まともな高校の数学を持っていて、Googleの使い方を知っているなら、最初の50ほどはあなたに負担をかけるべきではありません。問題を解決すると、フォーラムにアクセスして、他の人の解決策を確認することができます。アイデアは人々が自分で解決することを奨励することなので、上品であり、あなたの解決策を投稿しないでください。

ブルートフォースアルゴリズムを使用する場合、Pythonでの作業を強制することは許されません。これにより、メモリ内に大きなデータセットをレイアウトし、辞書などの高速言語機能を使用してそれらに効率的にアクセスする方法がわかります。

これを自分で行うことから、私は次のことを学びました。

  • ファイルIO
  • 動的プログラミングなどのアルゴリズムと手法
  • Pythonデータレイアウト
    • 辞書/ハッシュマップ
    • リスト
    • タプル
    • それらの様々な組み合わせ、例えばタプルのリストへの辞書
  • 発電機
  • 再帰関数
  • Pythonライブラリの開発
    • ファイルシステムのレイアウト
    • 通訳セッション中にそれらを再ロードする

そしてまた非常に重要です

  • あきらめて、CまたはC ++を使うとき!

これはすべてバイオインフォマティクスに関連しているはずです

確かに、私はその経験からPythonのOOP機能について知りませんでした。


3
私はPEサイトが好きですが、正直に言うと、これはプログラミングサイトではなく、数学サイトです。ほとんどの問題(または少なくとも私が行った問題のほとんど)は、プログラミング言語に関連するものよりもいくつかの数学の秘訣を知っていることに要約されます。多くの場合、フォーラムの優れたソリューションは、素朴なソリューションの波などに溺れてしまいます
アダムパーキン

それどころか、プログラミングと数学の両方のスキルを適用し、最も重要なのは、実際の問題を解決するために2つ組み合わせることです。数学のスキルが不足している場合は、PEを使用してPythonプログラミングを学ぶことはできませんが、それを使用して言語を使用する方法を学習するだけなので、数学が十分であれば理想的です。
キャプテンレプトン2012年

7

Pythonを使用したバイオインフォマティクスプログラミング」という本をご覧になりましたか?あなたはそのフォーカスグループの正確なメンバーのようです。


2
少し前にこの本をざっと読んだ後、この本はあまり面白くないことに気づきました。初心者のPythonユーザーを対象としており、問題自体はそれほど興味深いものではありません。残念ながら、これは明らかにPythonの使用が増加している領域です。もっと刺激的な本は素晴らしいでしょう。
モーロック

6

既に多くの資料を読んでいますが、さらに多くを処理できる場合は、Python拡張提案、特に「終了」PEPと「延期、放棄、撤回、および拒否」を読んで、Pythonの進化について学ぶことをお勧めします。 PEP。

言語がどのように変化したか、行われた決定、およびその理論的根拠を確認することで、Pythonの哲学を吸収し、「慣用的なPython」がどのようにもたらされるかを理解します。

http://www.python.org/dev/peps/



3

Pythonを学び始めている他の人に教えることは、常にあなたのアイデアを明確にする優れた方法であり、時にはPythonに関する概念的なことを再考するように生徒から多くのきちんとした質問を受けることがあります。


2

正確にあなたが求めているものではありませんが、それは良いアドバイスだと思います。

別の言語を学びましょう。どちらでもかまいません。各言語には、独自のアイデアと慣習があり、そこから学ぶことができます。言語の違いについて学び、さらに重要なのはwhyそれらが異なることです。Haskellのような純粋に関数型の言語を試して、副作用のない関数の利点(および課題)を確認してください。他の言語から学んだことの一部をPythonに適用する方法をご覧ください。


1
Haskellは興味深く、私はLispに惹かれましたが、次に進む前に、Pythonの世界にはまだ発見すべきことがたくさんあると感じています。
モーロック2010

2
landoflisp(.com)が最近私の注目を集めました。
ジアアロ

Lispの程度誰の考え方であれば、私はスキームをお勧めします
Tharindu Rusira

2

まず、構文の表現力を探るように強制することから始めることをお勧めします。Pythonでは、同じ機能をさまざまな方法で記述できますが、多くの場合、最もエレガントで最速のアプローチが1つあります。他の言語の慣用句に慣れている場合は、これらのより良い方法を他の方法で見つけたり受け入れたりすることは決してないでしょう。私は週末に最初の20か所ほどのProject Eulerの問題に挑み、Google App EngineでDjangoを使用して簡単なWebアプリケーションを作成しました。これは、おそらく見習いから初心者へとあなたを連れて行くだけかもしれませんが、その後、いくらか高度なWebアプリケーションを作成し続け、より高度なプロジェクトオイラー問題を解決することができます。数か月後、私は戻って最初の20のPE問題を週末ではなく1時間でゼロから解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.