Pythonを学習するJava開発者:頭を包むためにどのような概念が必要ですか?


38

背景:いくつかのチュートリアルを実行し、いくつかの小さなプロジェクトを作成しました。GoogleとStackOverflowを使用して、すべてが十分に機能しています。

過去数日間に何度か、「何が足りないの?」と思った。-Pythonで書いているので、まだJavaで考えているように感じます。

StackOverflowでのこの質問には、Pythonを学習するために読むべきリソースに関するヒントがたくさんありますが、私はまだPythonに翻訳するための辞書(しゃれなし)を持つJava開発者だと感じています。

私が本当にやりたいことは、私のJavaスキルを失うことなく、Pythonに変装したJavaの代わりにPythonic Pythonを書くことができるように頭をリファクタリングすることです。

だから、私の質問の核心は、Java開発者がPythonicを考えることを学ぶために本当に必要な概念は何ですか?これには、未学習の必要があるものすべてが含まれます。

注:言語の構文についてではなく、言語の概念について質問しています。


9
プログラミングは難しいと考えられているという考えを手放してください。
ジョブ

回答:


40

すでに述べたことに加えて、いくつかのポイント:

  • Pythonは動的です。クラスの作成は実行可能なステートメントであり、モジュールのインポートも同様です。条件付きにすることができます。クラスは作成後に変更できます。これにより、簡単なメタプログラミングとAOPが可能になります。

  • インターフェイスはありません。アヒルのタイピングルール。必死にそれらを必要とする場合、「抽象基底クラス(ABC)」がありますが、とにかく静的な型チェックがないため、通常はインターフェイスを見逃しません。

  • すべてがオブジェクトですが、関数はオブジェクトの前にあります。モジュールに関数のみ(クラスなし)を含めることはまったく問題ありません。

  • すべてがファーストクラスのエンティティです。関数をパラメーターとして渡し、それらを返し、変数に割り当てるのが標準です。クラスにも同じ。メソッドは単なる関数です。インスタンスメソッドを通常の関数であるかのように処理したり、渡したりすることができます。

  • 組み込みの辞書、セット、リスト、およびタプルを使用します。リストと辞書は変更可能ですが、タプルは変更できません。それらはすべて非常に効率的で、構文的に簡潔です。タプルを使用して関数からいくつかの値を返すことに慣れます(括弧も必要ありません)。非常に単純なオブジェクトの複雑な階層を、単純なリスト、タプル、およびディクショナリ(「ハッシュテーブル」)で構成された仕掛けに置き換えることに慣れて、生活を簡素化します。

  • PythonにはかなりのFPサポートがあります。リスト内包表記、そしてイテレーターとジェネレーターを学びます。これらは非常に役立ちます。

  • 適切なメソッドを定義することで、すべての演算子をオーバーロードできるため、追加または比較で必要なものを返すことができます。SQLAlchemyのようなものでこれが機能することを覚えておいてください。

  • nullはなく、Noneのみがあり、本格的なオブジェクトです。別のインスタンスが予想される場所でNoneを渡すと、通常は実行パイプラインのさらに下のNPEではなく、AttributeErrorが発生します。

  • Pythonは完全に動的であるため、静的チェックはほとんどありません。プログラムに決して存在しない名前(たとえば、タイプミス)を参照することも、特定の実行パスでのみ定義されることもできます。実行が実際にこの参照に到達し、NameErrorが発生するまで、何も通知しません。変数のスコープに注意し、さらに単体テストを記述してください。

  • Pythonの完全に動的な性質により、オブジェクトはほぼ常に順応性があります。通常、フィールドとメソッドをインスタンスに追加することもできるためその状態またはメソッドセットを誤って削除または上書きする可能性があります。属性の割り当てには注意してください。これにより、興味深い可能性も可能になります:)

  • ありませんシンボリック定数、変数だけは。「定数」を誤って上書きしないことを確認してください。定数を上書きできないことを確実に確認したい場合は、関数またはプロパティ(変装した関数)を使用します。

  • Pythonのスレッドは、I / Oバウンド処理には適していますが、CPUバウンドには適していません。並列スレッドで実行して計算タスクを高速化しようとしないでください。


非常に良いポイントを+1。Nitpicking:None通常は原因ですがAttributeError(問題ではありませんが、通常は必要ありません)、不変オブジェクトを(たとえば、を介して)書き込むことができます(場合によってはそうする必要がありますnamedtuple)。

@danlan:ありがとう、テキストを修正しました:)はい、不変オブジェクトを作成できます。しかし、通常のクラスを作成してからそのインスタンスを作成することで一般的に作成するオブジェクトは、多くの特別な措置を講じない限り、非常に変更可能です。未定義のインスタンス属性への割り当ては、通常、エラーを発生させる代わりに静かに定義するという事実は、Javaプログラマーにとって驚きかもしれません。
9000

1
Python(および他のFP言語)は、より単純なビルディングブロックのより冗長なコードビルドを、より複雑なビルディングブロックでのコンパクトなコードビルドに置き換えます。RISCとCISCプロセッサを考えてください。
ポール

1
データ構造にセットを追加します。
サキスク

2
この質問をしてから3年を少し過ぎました。このアドバイスは非常にうまく機能したと言わざるを得ません。
LRE 14年

14

この記事を読んでください:PythonはJavaではありません。(加えて、サイドバーの他の記事のほとんどは読む価値がありますが、Java関連ではありません。)この記事は、Javaプログラマーが意図せずにPythonを誤って使用する方法(および使用しない方法)に関する優れた指針を提供します。


6
「XMLは答えではありません。」-それはJava v Pythonをはるかに超えています;
LRE

3

私はJavaからPythonに移行しましたが、コマンドラインインタープリターからコードをテストできることが、最も有用なことの1つでした。コマンドラインに「python」と入力し、そこからコードを実行します。

また、フレームワークはPythonでの定義が少し少なかった。初心者向けのウェブフレームは数十種類あります。Djangoは、HibernateのSpringとSQL Alchemyをほぼ置き換えます。


2

1つの重要なことは、動的型付けを理解することです。もう1つは、オブジェクトが可変でパブリックであることです。少なくとも最初はそれほど重要ではありませんが、名前バインディングと変数です。

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

ここで、myjobtitleとjob.titleの値は同じオブジェクトを指します。クラス属性job.startDateには最初に文字列が割り当てられ、次に時間オブジェクトに割り当てられています。そして、全体を通して、ジョブインスタンスとクラス自体も動的に変更できます。


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