Java dev belajar Python: konsep apa yang saya butuhkan untuk membungkus kepala saya?

38

Latar Belakang: Saya telah menjalankan beberapa tutorial dan menulis beberapa proyek kecil. Semua berjalan cukup baik menggunakan Google dan StackOverflow .

Beberapa kali dalam beberapa hari terakhir saya mendapati diri saya bertanya-tanya, "Apa yang saya lewatkan?" - Saya merasa bahwa saya masih berpikir di Jawa ketika saya menulis dengan Python.

Ini pertanyaan lebih di StackOverflow penuh dengan tips tentang sumber daya apa yang harus membaca tentang untuk belajar Python, tapi aku masih merasa bahwa aku seorang pengembang Java dengan kamus (no pun intended) untuk menerjemahkan ke dalam Python.

Apa yang benar-benar ingin saya lakukan adalah refactor kepalaku untuk dapat menulis Python Python bukannya Java menyamar sebagai Python, tanpa kehilangan keterampilan Java saya juga.

Jadi, inti dari pertanyaan saya adalah: konsep apa yang benar-benar diperlukan oleh seorang pengembang Java untuk belajar berpikir Pythonic? Ini termasuk apa pun yang perlu dilupakan.

Catatan: Saya bertanya tentang konsep bahasa, bukan tentang sintaksis bahasa.

LRE
sumber
9
Lepaskan gagasan bahwa pemrograman seharusnya sulit.
Pekerjaan

Jawaban:

40

Beberapa poin di samping apa yang sudah dikatakan:

  • Python itu dinamis. Pembuatan kelas adalah pernyataan yang dapat dieksekusi , seperti impor modul; itu bisa dibuat bersyarat. Kelas dapat diubah setelah penciptaan; ini memungkinkan untuk pemrograman mudah dan AOP.

  • Tidak ada antarmuka; aturan mengetik bebek. Jika Anda sangat membutuhkannya, ada 'kelas dasar abstrak (ABC)', tetapi biasanya Anda tidak ketinggalan antarmuka, karena bagaimanapun tidak ada pemeriksaan tipe statis.

  • Meskipun semuanya adalah objek, fungsi datang sebelum objek. Memiliki fungsi-fungsi yang adil (dan tidak ada kelas) dalam sebuah modul sangat baik.

  • Semuanya adalah entitas kelas satu. Melewati fungsi sebagai parameter, mengembalikannya dan menetapkan ke variabel adalah norma. Ditto untuk kelas-kelas. Metode hanyalah fungsi; Anda dapat menangani metode instance seolah-olah itu adalah fungsi biasa, menyebarkannya, dll.

  • Gunakan dicts bawaan, set, daftar, dan tupel. Daftar dan dikte dapat berubah, tuple tidak. Semuanya sangat efisien dan ringkas secara sintaksis. Biasakan mengembalikan beberapa nilai dari fungsi menggunakan tuple (Anda bahkan tidak perlu tanda kurung). Biasakan untuk mengganti hierarki kompleks dari objek yang sangat sederhana dengan alat yang terbuat dari daftar sederhana, tupel, dan dicts ('hashtables'), itu menyederhanakan kehidupan.

  • Python memiliki sedikit dukungan FP; pelajari daftar pemahaman dan kemudian iterator dan generator. Ini sangat membantu.

  • Setiap operator dapat kelebihan beban dengan mendefinisikan metode yang tepat, sehingga penambahan atau perbandingan dapat mengembalikan apa pun yang Anda inginkan. Ingat ini bekerja dengan hal-hal seperti SQLAlchemy.

  • Tidak ada null, hanya None, objek yang lengkap. Anda dapat mencetak Tidak Ada baik-baik saja, dll. Melewati Tidak Ada di mana contoh lain diharapkan menghasilkan biasanya dalam AttributeError, bukan NPE, kadang-kadang lebih jauh ke bawah pipa eksekusi.

  • Karena sifat Python yang sepenuhnya dinamis, Anda hampir tidak memiliki pemeriksaan statis . Anda dapat merujuk ke nama yang tidak pernah ada dalam program Anda (mis. Salah ketik), atau hanya akan didefinisikan dalam jalur eksekusi tertentu, dan tidak ada yang akan mengingatkan Anda tentang hal itu sampai eksekusi benar-benar mengenai referensi ini dan NameError dinaikkan. Berhati-hatilah dengan ruang lingkup variabel Anda, dan tulis lebih banyak unit test.

  • Karena sifat Python yang sepenuhnya dinamis, objek hampir selalu dapat ditempa. Biasanya Anda dapat menambahkan bidang dan metode bahkan ke sebuah instance dan dengan demikian secara tidak sengaja menghapus atau menimpa set negara atau metode. Hati-hati menugaskan atribut. Ini memungkinkan untuk kemungkinan yang menarik juga :)

  • Tidak ada konstanta simbolik , hanya variabel. Pastikan Anda tidak secara tidak sengaja menimpa 'konstan'. Jika Anda ingin yakin bahwa Anda tidak bisa menimpa konstanta, gunakan fungsi atau properti (yang merupakan fungsi yang menyamar).

  • Thread Python baik untuk pemrosesan I / O-terikat, tetapi tidak untuk CPU-terikat. Jangan mencoba mempercepat tugas komputasi dengan menjalankannya dalam utas paralel.

9000
sumber
+1 poin sangat bagus. Nitpicking: Nonebiasanya menyebabkan AttributeError(tetapi tidak masalah, Anda biasanya tidak memerlukannya) dan Anda dapat (dan dalam beberapa kasus harus) menulis objek yang tidak dapat diubah (misalnya melalui namedtuple).
@danlan: terima kasih, saya memperbaiki teks :) Ya, Anda dapat membuat objek yang tidak berubah. Tetapi objek yang Anda buat umumnya dengan membuat kelas reguler dan kemudian instance itu sangat bisa berubah, kecuali Anda mengambil sejumlah tindakan khusus. Fakta bahwa penugasan ke atribut instance yang tidak ditentukan biasanya secara diam-diam mendefinisikannya alih-alih menyebabkan kesalahan mungkin merupakan kejutan bagi seorang programmer Java.
9000
1
Python (dan bahasa FP lainnya) menggantikan lebih banyak membangun kode verbose dari blok bangunan yang lebih sederhana dengan membangun kode yang kompak di blok bangunan yang lebih kompleks. Pikirkan prosesor RISC vs CISC.
Paul
1
Saya akan menambahkan set ke struktur data.
sakisk
2
Sedikit lebih dari 3 tahun sejak saya mengajukan pertanyaan ini. Saya harus mengatakan saran ini telah berdiri dengan sangat baik.
LRE
14

Baca artikel ini: Python bukan Java . (Plus sebagian besar artikel lain di bilah sisi layak dibaca, meskipun tidak terkait Java.) Artikel ini memberikan beberapa petunjuk bagus tentang bagaimana programmer Java dapat secara tidak sengaja salah menggunakan Python (dan bagaimana tidak melakukannya).

Cyclops
sumber
6
"XML bukan jawabannya." - itu melampaui Java v Python ;-)
LRE
3

Saya pindah dari Jawa ke Python dan salah satu hal paling berguna yang saya temukan adalah dapat menguji kode dari juru bahasa command line. Ketik python ke dalam baris perintah dan jalankan kode Anda dari sana sampai Anda melakukannya dengan benar.

Kerangka kerja juga sedikit kurang didefinisikan dalam Python. Ada 10-an frame web yang berfungsi hanya untuk pemula. Django lebih atau kurang menggantikan Spring dan SQL Alchemy untuk Hibernate.

Bassdread
sumber
2

Satu hal penting adalah memahami pengetikan dinamis; lain adalah bahwa benda-benda bisa berubah dan publik. Yang kurang penting, setidaknya pada awalnya, adalah pengikatan nama vs variabel.

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

Di sini, myjobtitle dan nilai job.title menunjuk ke objek yang sama. Atribut job.startDate atribut pertama-tama telah diberikan string, kemudian ke objek waktu. Dan melalui semua itu, contoh pekerjaan dan bahkan kelas itu sendiri dapat diubah secara dinamis.

Arcege
sumber
1

Anda mungkin juga ingin melihat Jython . Mungkin hanya mendukung Python 2.5, tetapi kami merasa sangat kuat untuk dapat mempercepat prototipe dengan Python dan kemudian menulis ulang di Jawa nanti jika perlu.

Berdasarkan jawaban saya untuk Apa yang harus saya pikirkan ketika beralih dari Python ke Java? karena pertanyaan itu sekarang telah ditutup sebagai duplikat dari pertanyaan ini!

Mark Booth
sumber