Apa sajakah karakteristik Python yang membuatnya unik sebagai bahasanya sendiri? [Tutup]

12

Apa sajakah karakteristik Python yang membuatnya unik sebagai bahasanya sendiri? Saya mencari segala jenis karakteristik mulai dari yang baik hingga yang buruk, bermanfaat hingga halangan, sintaksis hingga penggunaan di dunia nyata, tetapi pengamatan yang tidak jelas akan menjadi yang paling berguna bagi pengembang rata-rata.

Saya seorang pemula di sini, jadi hal-hal intuitif mungkin perlu dijelaskan .....

John
sumber
9
Python tidak unik, tidak mengandung satu fitur unik yang tidak terlihat dalam bahasa lain.
SK-logic
10
Itu satu-satunya bahasa yang saya tahu dinamai Monty Python ...
yannis
@ SK-logika pertanyaannya adalah tentang karakteristik, fitur mana yang merupakan bagian. Apakah tidak ada karakteristik unik untuk Python?
kojiro
@ Kojiro, saya belum pernah melihat definisi formal dari "karakteristik", jadi saya lebih suka untuk tidak menebak.
SK-logic
1
@ Kojiro, fitur PL biasanya dipahami sebagai sintaks dan semantiknya. Dan keduanya secara resmi didefinisikan.
SK-logic

Jawaban:

22

Anda akan kesulitan menemukan fitur yang benar-benar unik . Sebagian besar fitur bahasa yang ada telah diadopsi dalam lebih dari satu bahasa sejak awal. Beberapa mungkin lebih jarang, terutama karena mereka masih baru dan masih dalam ketidakjelasan, atau mati karena alasan yang baik. Meskipun demikian, meski begitu Anda akan lebih baik melihat kombinasi fitur.

Yang mengatakan, beberapa fitur Python harus membuat kombinasi yang relatif unik. Setidaknya saya tidak mengetahui bahasa apa pun dari jarak jauh sebagai populer (dan praktis) dengan sebagian besar fitur yang tumpang tindih. Seperti disebutkan dalam komentar, Ruby cukup dekat, tetapi ada banyak perbedaan.

  • Pemrograman berbasis metaclass. Pada dasarnya, menjalankan kode arbiter pada pembuatan kelas. Membuat untuk kustomisasi kelas yang sangat bagus dengan sangat sedikit pekerjaan di sisi penerima - misalnya untuk Pemetaan Objek-relasional (ORM), kelas klien dapat ditulis seperti biasa dengan beberapa baris tambahan seperti attr = SomeDataType()dan satu ton kode dihasilkan secara otomatis. Contohnya adalah "model" Django .
  • Anda didorong untuk menggunakan iterator untuk semuanya . Ini khususnya jelas dalam 3.x, di mana sebagian besar alternatif berbasis daftar dengan setara berbasis iterator telah dihapuskan demi yang terakhir. Iterator juga berfungsi sebagai antarmuka yang hampir universal untuk koleksi (baik yang sebenarnya Anda miliki dalam memori maupun yang hanya diperlukan satu kali dan karenanya dibuat dengan fitur di bawah). Pengumpulan-agnostik, ruang-efisien ( O(1)ruang untuk hasil antara sering mengikuti secara alami, sangat sedikit tugas yang benar-benar membutuhkan semua item dalam memori sekaligus), pengelompokan data komposit tidak pernah semudah ini.
  • Ekspresi generator, terkait dengan yang di atas. Banyak orang akan pernah mendengar tentang pemahaman daftar (membuat daftar dari iterable lain, memfilter dan memetakan dalam proses, dengan sintaksis yang sangat nyaman). Lupakan mereka, itu gula sintaksis, kasus khusus. Ekspresi generator sangat dekat secara sintaksis dan pada akhirnya menghasilkan urutan item yang sama, tetapi mereka menghasilkan hasil dengan malas (dan karenanya mengambil O(1)ruang kecuali Anda secara eksplisit menjaga hasilnya di sekitar).
  • yield, yang terutama membuat penulisan iterator (disebut generator di sini) jauh lebih baik. Mereka adalah kakak di atas, mendukung semua jenis aliran kontrol. C # memiliki sesuatu yang mirip, dengan kata kunci yang sama. Tetapi yieldjuga kelebihan beban untuk mendukung jenis coroutine yang terbatas (Lua misalnya memiliki dukungan yang lebih rumit) yang bagaimanapun telah dimanfaatkan dengan baik oleh orang-orang pintar yang bekerja pada masalah-masalah sulit. Dua contoh dari atas kepala saya: keturunan parsing rekursif dengan backtracing dan tidak ada batas stack dan I / O asinkron (dengan sintaks yang mudah digunakan).
  • Penugasan multi-target dan pembongkaran yang dapat diubah. Penugasan pada steroid. Tidak hanya Anda dapat menetapkan ke beberapa nilai sekaligus (bahkan untuk nilai swapping dan ketika iterasi - for key, value in mapping.items()), Anda dapat membongkar semua iterable yang diketahui panjangnya (jujur, sebagian besar tuple) menjadi beberapa variabel. Sejak 3.x itu bahkan praktis untuk koleksi panjang tidak diketahui karena Anda dapat menentukan beberapa variabel mengambil item tunggal dan satu taking apapun tetap: first, *everything_in_between, last = values.
  • Penjelas , mungkin yang paling kuat di antara berbagai cara untuk menyesuaikan akses atribut. Ada properti (seperti dalam C #, tetapi tanpa dukungan bahasa khusus), metode statis, metode kelas, dll. Semua diimplementasikan sebagai deskriptor. Mereka benda kelas satu juga. Hanya seminggu yang lalu, saya dihadapkan dengan kode berulang dan rumit di properti - jadi saya menulis sebuah fungsi kecil menghasilkan bagian berulang dan membungkusnya dalam suatu properyobjek.
  • Aturan murni offside (indentaion untuk membatasi blok). Saya sengaja menempatkan ini terakhir. Meskipun memang membedakan Python, itu tidak benar-benar menonjol dalam pemrograman sehari-hari setelah Anda terbiasa (atau setidaknya itu pengalaman saya).
Komunitas
sumber
Saya masih sedikit pemula di Ruby tapi saya pikir hit semua kecuali poin terakhir juga? Either way, saya setuju "unik" mungkin tidak akan ditemukan dalam Python tetapi "tidak umum di antara bahasa top lainnya" bisa.
Rig
@Rig: Saya bukan ahli Ruby, tapi saya belum pernah melihat metaclasses (Ruby tentu saja sama kuatnya dengan metaprogramming, dan mungkin menggunakannya untuk tujuan yang sama, tetapi kesan saya adalah bahwa itu dicapai secara berbeda), atau generator atau ekspresi generator (meskipun tampaknya ada coroutine), juga tidak membongkar (ada tugas multi-target meskipun) atau deskriptor di Ruby. Ya, Ruby dan Python saling tumpang tindih. Tetapi ada perbedaan .
Bagus, +1. Bagi saya, "penugasan pada steroid" sebenarnya adalah "pencocokan pola orang miskin", tetapi tetap sangat berguna :) Saya juga melihat betapa fleksibelnya parameter yang melintas dalam fungsi: *argsdan **kwargs, cara yang tidak menyakitkan untuk memetakan tupel dan mendiktekan ke parameter, dll. .
9000
Saya percaya cadel umum dengan CLOS hits semua titik kecuali penggunaan sintaks berbasis tata letak. Haskell tidak berorientasi objek (meskipun ada ekstensi OO) tetapi selain titik metaclass saya percaya itu cocok dengan semua fitur ini.
Jules
3

Saya kira satu-satunya hal yang membuat Python unik adalah kombinasi fitur yang ditampilkannya. Ini akan berlaku untuk sebagian besar bahasa pemrograman.

Atau mungkin ada satu hal kecil: Saya belum melihat cara Python secara eksplisit melewati selfsebagai parameter formal untuk fungsi anggota objek dilakukan dalam bahasa lain. Ini hal kecil, dan saya tidak melihat bagaimana ini benar-benar mengubah apa pun.

Tapi saya tidak terlalu lancar menggunakan Python, jadi mungkin ada hal-hal yang saya lewatkan pasti!

Torbjørn
sumber
@delnan: Ah, aku merindukan "secara eksplisit lulus diri sebagai parameter formal" .. Tebak bahwa ini yang saya dapatkan untuk membaca di 2:00;)
Demian Brecht
4
Diri eksplisit muncul juga di Oberon,
fwiw
Parameter diri eksplisit juga digunakan dalam sistem objek lisp umum. Namun demikian, CLOS menyediakan multi-metode, yang berarti bahwa parameter self tidak dengan cara apa pun istimewa, seperti halnya dalam python.
Jules
1

Pemrosesan dokumen secara otomatis menjadi properti pemiliknya. Secara umum semua fitur introspeksi Python yang brilian menjadikannya bahasa yang sangat unik, dari kemampuan menggunakan bantuan () hingga kemampuan untuk digunakan __doc__sebagai properti kelas satu dari suatu objek. Sebagai contoh:

>>> class DocStringException(Exception):
...     """Error message is the same as docstring"""
...     def __str__(self):
...         return repr(self.__doc__)
... 
>>> class ExampleException(DocStringException):
...     """An example happened"""
... 
>>> raise ExampleException
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.ExampleException: 'An example happened'

Fitur introspeksi lain yang bermanfaat:

  • help / help () - membantu penerjemah / bantuan dengan suatu objek
  • kata kunci - kata kunci python
  • penduduk lokal () - dapatkan nama-nama lokal
  • global () - dapatkan nama global
  • dir () - dapatkan properti dan metode objek
  • metode .mro. , issubclass - memahami warisan
  • id () - dapatkan alamat memori suatu objek
kojiro
sumber
Ruby cukup banyak memiliki kekuatan yang sama, seperti halnya Common Lisp, Clojure, dan banyak lagi, bahasa dinamis yang saya percaya.
Torbjørn
@ Torbjørn kekuatan mana? Dokumentasi otomatis, atau fitur introspeksi?
kojiro
Saya sedang memikirkan keduanya. Bukan kata-kata, tapi dalam semangat. Saya tidak percaya Ruby memiliki kemampuan dokumentasi yang sama, tetapi introspeksi pasti. CL dan Clojure memiliki kedua fitur - dan saya percaya introspeksi ada jauh melampaui apa yang akan Anda temukan di Python, karena itu homoikonik .
Torbjørn
1
  1. Generator Expressions
  2. input()Izinkan saya menjelaskan, saya belum melihat bahasa (sejauh ini), di mana Anda dapat memberikan nilai pada pernyataan yang mencetak sesuatu, itu seperti ruby print/gets, tetapi dengan nilai yang diberikan pada cetakan, alih-alih:print "Foo" bar = gets
  3. yield
  4. Banyak jenis dataset: ordereddict, namedtuple, array, list, tuple, dictionary
Billjk
sumber
Ekspresi generator dapat diimplementasikan di Haskell menggunakan daftar pemahaman (daftar Haskell malas, tidak seperti daftar python, jadi tidak ada sintaks khusus yang diperlukan untuk ini). Dengan "input" Saya berasumsi maksud Anda fungsi python 3 dari nama itu (karena fungsi python 2 berbahaya dan tidak boleh digunakan). Memang benar bahwa ini adalah kombinasi perilaku yang tidak biasa (meskipun hadir dalam javascript - window.prompt - dan BASIC, di mana saya kira python meminjamnya dari) tetapi itu dapat diimplementasikan secara sepele oleh programmer ("input s = putStrLn s >> getStrLn "akan melakukannya untuk haskell).
Jules
Bahasa malas seperti Haskell tidak benar-benar membutuhkan hasil - ia hanya dapat mengembalikan daftar yang dibangun menggunakan metode biasa, dan item akan dihasilkan sesuai permintaan. Meskipun demikian, perpustakaan mencakup implementasi eksplisit coroutine. Perpustakaan standar Haskell berisi semua struktur data yang disebutkan, dan banyak lagi.
Jules
-2

Masalahnya, Python adalah salah satu dari sedikit bahasa dengan overhead sintaksis yang sangat rendah sehingga memberikan kekuatan ekspresif yang luar biasa: daftar / set / dikt pemahaman, hasil, dekorator, eval, pemrograman kelas meta, introspeksi, struktur data bawaan yang dioptimalkan (daftar, Dicts, set), semua itu berkonspirasi dengan cara yang sangat bagus untuk memberi Anda (pengembang) kekuatan untuk mengekspresikan pikiran Anda dalam kode yang ringkas dan elegan hampir secepat yang Anda bisa pikirkan. Saya tidak dapat benar-benar memikirkan bahasa lain dengan serangkaian fitur yang dikombinasikan ini.

Rabih
sumber
1
Jika Anda berpikir Python memiliki overhead sintaksis rendah (walaupun memiliki tata bahasa yang sangat rumit dan gula sintaks yang relatif besar), apa pendapat Anda tentang Skema?
Tikhon Jelvis
Eval benar-benar tidak boleh digunakan untuk program produksi apa pun (meskipun saya berikan itu bisa berguna untuk peretasan cepat). Seperti yang ditunjukkan dalam komentar untuk pertanyaan lain, python sama sekali tidak unik dalam memiliki fitur-fitur ini. Saya percaya, misalnya, bahwa clojure memiliki semua fitur yang Anda daftarkan, dan sebagian besar dapat dilakukan dengan cadel umum.
Jules
-4

Saya akan mengatakan itu menggunakan lekukan untuk melampirkan jika pernyataan dan loop. Belum melihat itu dalam bahasa lain.

Saya pikir ini sangat berguna karena membuatnya secara signifikan lebih sulit untuk mengaburkan kode python!

Tampaknya juga mengeksekusi secara rapi baris demi baris dengan pengecualian fungsi, dan itu juga dapat ditafsirkan seperti itu yang bagus.

Liang
sumber
2
Wikipedia tahu layar penuh bahasa yang melakukannya juga. Ini disebut aturan off-side .
3
Saya tidak mengerti Ini juga tampaknya mengeksekusi secara rapi baris demi baris dengan pengecualian fungsi, dan itu dapat ditafsirkan seperti itu juga yang bagus. Apa artinya?
kojiro