web-dev-qa-db-ja.com

Java dev learning Python:頭を回すにはどのような概念が必要ですか?

背景:いくつかのチュートリアルを実行し、いくつかの小さなプロジェクトを書きました。 Googleと StackOverflow を使用すれば、すべてうまくいきます。

ここ数日、何度か「何が足りないのか」と思ったことがあります。 -Pythonで記述しているため、Javaでまだ考えているように感じます。

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

私が本当にやりたいのは、Python = Pythonの代わりにPythonic JavaをPythonに偽装して、私のJavaスキルも。

それで、私の質問の核心は次のとおりです:Java開発者はPythonicを考えることを本当に学ぶ必要がありますか?これは、学ぶ必要のないものを含みます。

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

38
LRE

すでに言われたことに加えていくつかのポイント:

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

  • no interfaces;アヒルのタイピング規則があります。どうしても必要な場合は、「抽象基本クラス(ABC)」がありますが、とにかく静的型チェックがないため、インターフェイスを見逃すことはありません。

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

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

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

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

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

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

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

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

  • 記号定数なしがあり、変数のみです。誤って「定数」を上書きしないことを確認してください。定数を上書きできないことを明確にしたい場合は、関数またはプロパティ(変装した関数)を使用します。

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

40
9000

この記事を読む:PythonはJavaではありません。 (さらに、サイドバーの他のほとんどの記事は、Java関連ではありませんが、読む価値があります。)この記事は、Javaプログラマーが意図せずに誤用しているPython(とその方法)。

14
Cyclops

Java=からPythonに移動しました。コマンドラインインタープリタからコードをテストできることは、最も便利なことの1つでした。タイプpythonをコマンドラインに入力し、正しくなるまでそこからコードを実行します。

フレームワークもPythonで少し定義されていません。初心者のためだけに数十のウェブフレーム作品があります。 Django多かれ少なかれ、HibernateのSpringおよびSQL Alchemyを置き換えます。

3
Bassdread

重要なことの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には最初に文字列が割り当てられ、次に時間オブジェクトに割り当てられています。そして、全体を通して、ジョブインスタンスとクラス自体さえも動的に変更することができました。

2
Arcege

Jython もご覧ください。 Python 2.5のみをサポートしている可能性がありますが、Pythonでプロトタイプを迅速に作成してからJava後で必要に応じて。

Python to Java? から切り替えるときに何を考えればよいですか)==への私の回答に基づいて、その質問はこの質問の複製として閉じられました!

1
Mark Booth