Bagaimana saya bisa belajar untuk secara efektif menulis kode Pythonic?


46

Melakukan pencarian google untuk "pythonic" mengungkapkan berbagai interpretasi. The halaman wikipedia mengatakan:

Neologisme umum dalam komunitas Python adalah pythonic, yang dapat memiliki berbagai arti yang berkaitan dengan gaya program. Mengatakan kode itu pythonic berarti mengatakan bahwa ia menggunakan idiom Python dengan baik, bahwa itu alami atau menunjukkan kefasihan dalam bahasa. Demikian juga, untuk mengatakan tentang fitur antarmuka atau bahasa bahwa itu adalah pythonic adalah untuk mengatakan bahwa ia bekerja dengan baik dengan idiom Python, bahwa penggunaannya cocok dengan bagian bahasa lainnya.

Itu juga membahas istilah "unpythonic":

Sebaliknya, tanda kode unpythonic adalah bahwa ia mencoba untuk menulis kode C ++ (atau Lisp, Perl, atau Java) dengan Python — yaitu, memberikan transkripsi kasar daripada terjemahan idiomatik formulir dari bahasa lain. Konsep pythonicity terikat erat dengan filosofi keterbacaan minimalis Python dan menghindari pendekatan "ada lebih dari satu cara untuk melakukannya". Kode yang tidak dapat dibaca atau idiom yang tidak dapat dipahami adalah unpythonic.

Apa arti istilah "pythonic"? Bagaimana saya belajar menerapkannya secara efektif dalam praktik?


6
Saya pikir pertanyaan Anda dapat diperluas ke bahasa pemrograman apa pun. Selalu ada cara pemrograman yang disarankan yang mungkin akurat dalam sejumlah besar kasus dan juga untuk meningkatkan revisi, keterbacaan, dan pemeliharaan. Saya pikir juga menantang rekomendasi tersebut dapat membuat bahasa berkembang dan maju ...
Amine

@Amine benar sekali. Sebenarnya saya pikir komunitas wiki yang terdiri dari di mana tepatnya belajar idiom bahasa - untuk semua bahasa - harus dipertimbangkan.
yati sagade


1
Komentator: harap berhenti memposting komentar yang tidak relevan; mereka telah dihapus karena suatu alasan. Jika Anda punya jawaban, biarkan itu sebagai jawaban. Jika Anda ingin membahas topik pertanyaan ini, silakan gunakan obrolan .

1
Dengan berlatih Python!
Dinamis

Jawaban:


22

Saya telah menemukan bahwa sebagian besar orang memiliki interpretasi mereka sendiri tentang apa arti "Pythonic" sebenarnya. Dari Wikipedia:

Neologisme umum dalam komunitas Python adalah pythonic, yang dapat memiliki berbagai arti yang berkaitan dengan gaya program. Mengatakan kode itu pythonic berarti mengatakan bahwa ia menggunakan idiom Python dengan baik, bahwa itu alami atau menunjukkan kefasihan dalam bahasa. Demikian juga, untuk mengatakan tentang fitur antarmuka atau bahasa bahwa itu adalah pythonic adalah untuk mengatakan bahwa ia bekerja dengan baik dengan idiom Python, bahwa penggunaannya cocok dengan bagian bahasa lainnya.

Sebaliknya, tanda kode unpythonic adalah bahwa ia mencoba untuk menulis kode C ++ (atau Lisp, Perl, atau Java) dengan Python — yaitu, memberikan transkripsi kasar daripada terjemahan idiomatik formulir dari bahasa lain. Konsep pythonicity terikat erat dengan filosofi keterbacaan minimalis Python dan menghindari pendekatan "ada lebih dari satu cara untuk melakukannya". Kode yang tidak dapat dibaca atau idiom yang tidak dapat dipahami adalah unpythonic.

Saya telah menemukan bahwa lebih sering daripada tidak, lebih banyak contoh "pythonic" sebenarnya berasal dari orang yang mencoba menjadi pandai dengan idiom Python dan (sekali lagi, lebih sering daripada tidak) membuat kode mereka hampir tidak dapat dibaca (yang bukan Pythonic).

Selama Anda tetap berpegang pada idiom Python dan menghindari mencoba menggunakan gaya C ++ (atau bahasa lain) dalam Python, maka Anda menjadi Pythonic.

Seperti yang ditunjukkan oleh WorldEngineer, PEP8 adalah standar yang baik untuk diikuti (dan jika Anda menggunakan VIM, ada plugin yang tersedia untuk linting PEP8).


Sungguh, pada akhirnya, jika solusi Anda berhasil dan tidak benar-benar mengerikan tidak dapat dipertahankan dan lambat, siapa yang peduli? Lebih sering daripada tidak, tugas Anda adalah menyelesaikan tugas, bukan menulis kode pythonic yang paling elegan.


Catatan tambahan lain (hanya pendapat saya, jangan ragu untuk downvote karena itu;)): Saya juga menemukan komunitas Python diisi dengan satu ton ego (bukan karena sebagian besar komunitas tidak , itu hanya sedikit lebih lazim dalam komunitas seperti C dan Python). Jadi, menggabungkan ego dengan interpretasi yang disalahartikan sebagai "pythonic" akan cenderung menghasilkan banyak sekali hal-hal negatif yang tidak berdasar. Ambil apa yang Anda baca dari orang lain dengan sebutir garam. Tetap berpegang pada standar dan dokumentasi resmi dan Anda akan baik-baik saja.


2
+1 untuk jawaban yang bagus (kecuali untuk kutipan sejak saya menggunakannya di OP).

Ugh .. Seharusnya membaca ulang OP sebelum memposting kutipan: P
Demian Brecht

3
Sebaliknya, ada korelasi yang tinggi antara ego dan menjadi online aktif, menyuarakan pendapat di komunitas mana pun . Pada dasarnya Anda tidak terlalu sering melihat orang yang tidak egois karena mereka tidak banyak menulis.
isarandi

17

Pythonic adalah kode idiomatis dengan Python. Ini berarti menggunakan struktur dan format yang bekerja dengan baik untuk Python dari sudut pandang pemrograman tetapi juga dari sudut pandang membaca komunitas. Ini sangat mirip dengan bagaimana K&R menetapkan standar untuk gaya pemrograman C untuk waktu yang lama. Panduan ini menunjukkan Anda harus kode secara Python. PEP 8 dirujuk dalam panduan itu sehingga mungkin layak dibaca.


1
@MattFenwick Bukankah 90% dari pemrograman itu tentang apa? Pemrogram yang baik menghabiskan banyak waktu membaca kode dan dalam waktu yang tersisa, menulis banyak kode. Semakin banyak kode Pythonic yang Anda baca, dan semakin banyak Anda menulis dengan Python, semakin banyak kode Pythonic Anda. Saya tidak berpikir ada jalan pintas di sini.
Kris Harper

2
Baik hubungan!
Ethan Furman

13

Menulis "Pythonic" kode IMHO hanya membuat penggunaan efektif (V) fitur HLL bahasa yang disediakan. Sebagai contoh di mana-mana,

x, y = 7, 'fuhrer'

Itu sangat Pythonic. Saya ingat ketika saya mulai belajar C # setelah berbulan-bulan hanya Python,

int x, y = 10, z;

entah bagaimana membingungkan saya, tetapi butuh satu menit bagi saya untuk kembali ke akar C / C ++ saya.

Cara Pythonic lainnya adalah menggunakan lambdas.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

akan benar-benar mencetak ldiurutkan dalam urutan menurun.

Lalu ada "mengetik bebek" yang sangat banyak digunakan, tetapi sangat kurang dipahami - Jika berjalan dan berbicara seperti bebek, Anda memperlakukannya sebagai bebek. Ini terkait longgar dengan antarmuka dalam bahasa OO lainnya.

Juga menggunakan metode pemrograman fungsional di mana berlaku, seperti penggunaan peta dan mengurangi dianggap pythonic.

Saya melihat jawaban yang diposting saat saya mengetik, dan itu berisi tautan yang bagus. PS: Bukannya pengetahuan Anda tentang Python terbatas. Saya berani bertaruh bahwa Python bukan bahasa pertama Anda, dan karenanya, (seperti kebanyakan dari kita pythonistas) Anda harus belajar untuk mendapatkan "idiomatik" dengan ular! Tepuk tangan!


Saya tidak memasukkan tautan karena sudah diposting saat saya mengetik - jawaban WorldEngineer :) Coba pikirkan "mengeksploitasi" fitur bahasa untuk kebaikan Anda dan orang lain, dan Anda akan mendapatkan Pythonic di jalan, dan silakan ikuti tautan itu
yati sagade

4
Sebenarnya, banyak sengketa yang map, reduce, lambdadan seperti yang idiomatik per se. Pemahaman daftar dan ekspresi generator adalah alternatif dan banyak yang lebih suka jika memungkinkan (khususnya, mereka kurang berisik ketika Anda membutuhkan lambda). Mereka tentu memiliki kegunaannya, dan acara pemrograman fungsional dalam idiom lain (misalnya dekorator).

@delnan setuju - dan terlebih lagi ketika menyangkut Python 3. Kesimpulannya adalah bahwa fitur fungsional harus digunakan tepat di mana diperlukan. Dan itu (Hanya ada satu cara yang jelas untuk melakukannya) adalah idiomatik :)
yati sagade

Secara pribadi, saya tidak pernah mengerti preferensi orang untuk contoh pertama Anda. Ini jauh lebih mudah untuk diuraikan secara mental (Yang merupakan Zen dari Python, kode dibaca lebih sering daripada yang tertulis): (x, y) = (7, 'fuhrer')- namun saya hampir selalu "dikoreksi" bahwa tanpa parens adalah cara terbaik untuk menulisnya!
Izkata

2
Saya berpendapat bahwa contoh penyortiran spesifik Anda bukan pythonic. Mengapa memperkenalkan kembali menata ulang dengan lambda jika Anda bisa print(sorted(l, reverse=True)), yang juga secara eksplisit memberitahu pembaca apa yang terjadi. Saya akan menemukan contoh pertama Anda yang dapat disengketakan juga. Ada dua tugas yang dikompresi menjadi satu; tidak apa-apa, tapi saya tidak akan menyebutnya sangat Pythonic. Pembaca harus melihat lebih lama pada apa yang dilakukannya daripada dibandingkan dengan memiliki dua tugas.
phresnel

7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Kode Pythonic adalah:

  • Dapat dibaca
  • Sederhana (sesederhana mungkin, tetapi tidak sederhana)
  • Dipikirkan dengan matang

1
+1. Zen Python lebih penting untuk menulis kode pythonic daripada mengikuti daftar idiom; yang terakhir tidak akan mencakup semua keadaan.
Doval

6

Setiap kali saya mencoba untuk belajar bahasa baru, saya menemukan bahwa membaca kode oleh orang-orang yang tahu bahasa seperti punggung tangan mereka, melihat ke atas / bertanya tentang apa pun yang terlihat aneh, dan kemudian mencoba meniru gaya mereka adalah hal terbaik untuk dilakukan. Contoh:

Dalam Python, karena kita berada di subjek, saya menemukan contoh-contoh dari Dive Into Python sangat berguna untuk memulai. Mereka cenderung mengajarkan tidak hanya dasar-dasar Python, tetapi untuk benar-benar menekankan Python idiomatik .

Ketika mempelajari D, karena dokumentasinya tidak bagus pada saat itu karena bahasanya sangat tajam, saya belajar dengan membaca kode ke perpustakaan standar, khususnya, beberapa karya agung Andrei Alexandrescu .

Ketika belajar C ++ saya mewarisi basis kode dari programmer C ++ yang cukup bagus dan belajar banyak tentang pemrograman C ++ idiomatis dari desakannya untuk meneruskan wadah STL dengan referensi, dll.

Dalam semua bahasa, saya menemukan bahwa menelusuri pertanyaan StackOverflow tentang bahasa dan melihat apa yang biasanya dilakukan orang untuk mencapai hal-hal dasar membantu.


+1 Setelah Anda mengetahui dasar-dasar bahasa, membaca kode akan membantu lebih dari sekadar membaca buku.
Pace

3

Python bukan Java mungkin memberi Anda beberapa saran yang bermanfaat. Tidak bisa mengatakan lebih banyak tanpa tahu masalah apa yang sedang Anda hadapi, tapi itu saran yang sangat konkret untuk programmer yang berasal dari bahasa lain (dalam hal ini khususnya java) latar belakang tentang bagaimana melakukan python secara berbeda.


2

Seseorang berkata kepada parafrase, untuk mempelajari apa itu Pythonic, cukup bash keluar beberapa kode. Saya tidak setuju dengan itu. Jika Anda suka menulis kode yang sangat padat, itu tidak membuatnya lebih Pythonic.

Salah satu cara untuk membantu Anda mendefinisikan apa itu Pythonic sejauh menyangkut diri Anda, tanyakan pada diri Anda, "Mengapa saya (berarti Anda) menggunakan bahasa Python?" Apa yang menarik bagimu tentang hal itu?

Bagi saya itu keterbacaan dan kurangnya kompilasi dan open source (hampir semuanya). Saya dapat mengunduh banyak pustaka dan membaca kode sumber mereka dengan sedikit tekanan tentang lisensi daripada banyak bahasa lainnya.

Bagi saya Python itu indah secara visual. Guido (pencipta Python) juga terus membuktikan kepada saya, melalui balasannya di PEPS dan diskusi) bahwa pilihannya untuk bagaimana dia membuat bahasa lebih unggul daripada ide saya sendiri tentang bagaimana seharusnya dibuat.

Bagi saya, seorang programmer hebat adalah seseorang dengan keterampilan pengambilan keputusan yang sangat terinformasi tentang cara yang harus ditempuh ketika coding. Bagi saya, Python membantu dengan membuat pilihan-pilihan itu dengan cepat.

Dengan menyederhanakan sintaksis kode sumber dengan mengizinkan pengetikan bebek alih-alih pengecoran tipe yang eksplisit, dan harapan bahwa pembuat kode meninjau kode Anda "haruslah pembuat kode yang berperilaku baik" mengarah ke sesuatu yang saya juga sebut "Pythonic"

Jadi ada dua sisi dari apa itu Pythonic. Salah satunya adalah sintaksis, yang lain adalah praktik. Bagaimana cara menjelaskan sisi yang lebih dalam dari apa itu "Pythonic" ..?

Dalam Python itu bukan masalah besar untuk melakukan ini: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

dan tuple akan ditambahkan ke daftar tanpa memperhatikan jenis objek. Bagian Pythonic bukanlah bahwa Anda BISA melakukan ini, tetapi bahwa kode Anda harus MENGHARAPKAN ini dan hanya bekerja / beradaptasi.

Apa pun yang berfungsi pada objek -alis- harus ditulis dengan gagasan bahwa beberapa pembuat kode lain dapat masuk dan menambahkan non-string ke daftar dan bahwa adaptasi kode sumber oleh pembuat kode baru seharusnya tidak sulit untuk dilakukan. Bagaimanapun, itulah manfaat dari ducktype.


-2

Beli buku yang direkomendasikan. Membacanya. Ini harus memberi Anda dasar yang baik dalam menggunakan bahasa dan dalam mekanisme yang harus memenuhi gaya komunitas

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.