0
fokus pada
0
Pengikut

Python: Harap berhati-hati di tempat-tempat ini

Dibuat di: 2016-12-29 13:46:12, diperbarui pada:
comments   0
hits   1385

Python: Harap berhati-hati di tempat-tempat ini

python adalah bahasa yang sangat menarik. Ia menyediakan banyak perpustakaan standar yang sangat mudah dan banyak perintah bawaan yang memudahkan kita dalam menyelesaikan tugas. Tetapi terlalu banyak hal yang baik membuat kita takut memilih, sehingga kita tidak dapat memanfaatkan perpustakaan standar dan lembaga dasarnya dengan baik. Di bawah ini adalah beberapa jebakan yang sangat sederhana dan efektif untuk pemula Python.

  • Mengabaikan versi python

Ini adalah masalah yang terus-menerus diajukan di StackOverflow. Bagaimana rasanya mengalami kesalahan ketika kode Anda yang sempurna berjalan di komputer orang lain, jadi Anda perlu memeriksa apakah versi Python Anda konsisten. Pastikan kode berjalan pada versi Python yang Anda ketahui. Anda dapat melihat versi Python dengan kode berikut:

  $ python --version
  Python 2.7.9

Manajemen versi python

pyenv adalah alat pengelola versi Python yang bagus.*Pada sistem nix. Pada Mac OS, Anda dapat menginstal pyenv dengan hanya menggunakan brew install. Pada sistem Linux, ada installer otomatis (automatic installer)

  • Terjebak dalam menyelesaikan semua masalah dengan satu baris kode

Banyak orang bertepuk sebelah tangan mengatakan bahwa saya dapat menyelesaikan semua masalah dengan satu baris kode, meskipun kode mereka lebih tidak efisien daripada yang ditulis secara normal, dan kode tersebut akan lebih sulit dibaca, bahkan akan menimbulkan ambiguitas.

  l = [m for a, b in zip(this, that) if b.method(a) != b for m in b if not m.method(a, b) and reduce(lambda x, y: a + y.method(), (m, a, b))]

Jujur saja, saya menulis kode di atas untuk menjelaskan hal ini. Tapi saya benar-benar melihat banyak orang yang melakukannya. Jika Anda hanya menambahkan sesuatu ke dalam daftar atau set untuk menunjukkan diri Anda dalam memecahkan masalah yang kompleks, maka Anda mungkin tidak akan mendapatkan apa-apa.

Pengendalian satu baris kode bukanlah suatu prestasi besar, meskipun terkadang terlihat sangat cerdas. Kode yang bagus adalah kode yang ringkas tetapi lebih berfokus pada efisiensi dan mudah dibaca.

  • Inisialisasi set yang salah

Ini adalah masalah yang lebih halus, dan kadang-kadang bisa membuat Anda terkejut.

  >>> { n for n in range(10) if n % 2 == 0 }
  {0, 8, 2, 4, 6}
  >>> type({ n for n in range(10) if n % 2 == 0 })

Contoh di atas menjelaskan hal ini. Set adalah semacam list yang ditempatkan dalam wadah. Perbedaannya adalah bahwa set tidak memiliki nilai yang berulang dan tidak berurutan. Orang biasanya menganggap {} sebagai set kosong, tetapi tidak, itu adalah dikte kosong.

  >>> {}
  {}
  >>> type({})

Jadi jika kita ingin menginisialisasi set yang kosong, kita bisa langsung menggunakan set.

  >>> set()
  set()
  >>> type(set())

Perhatikan sebuah set kosong dapat dinyatakan sebagai set (), tetapi sebuah himpunan yang berisi elemen harus didefinisikan sebagai set ().[1, 2])

  • Salah paham tentang GIL

GIL (global interpreter lock) berarti hanya satu thread yang dapat berjalan pada suatu program Python pada suatu waktu. Ini berarti bahwa ketika kita tidak dapat membuat thread dan mengharapkannya untuk berjalan secara paralel. Apa yang sebenarnya dilakukan oleh interpreter Python adalah dengan cepat beralih dari thread yang berbeda.

Banyak orang akan mencoba untuk membela Python dengan mengatakan bahwa ini adalah benang asli. 3 Ini memang benar, tetapi tidak mengubah fakta bahwa Python memproses benang dengan cara yang berbeda dari yang Anda harapkan.

Solusi yang ditetapkan adalah menggunakan modul multiprocessing. Kelas proses yang disediakan oleh modul multiprocessing pada dasarnya dapat menutupi perbedaan dengan baik. Namun, perbedaan jauh lebih mahal daripada biaya thread.

Namun, masalah ini tidak terjadi pada setiap program Python. PyPy-stm adalah contoh implementasi Python yang tidak terpengaruh oleh GIL. Implementasi yang dibangun di platform lain seperti JVM (Jython) atau CLR (IronPython) tidak memiliki masalah GIL.

Jadi, berhati-hatilah saat menggunakan thread, karena Anda mungkin tidak mendapatkan apa yang Anda inginkan.

  • Menggunakan kelas gaya yang sudah usang

Di Python 2, ada dua jenis kelas, kelas gaya lama dan kelas gaya baru. Jika Anda menggunakan Python 3, maka Anda menggunakan kelas gaya baru default. Untuk memastikan bahwa Anda menggunakan kelas gaya baru di Python 2, Anda perlu mewarisi objek atau kelas baru yang Anda buat yang tidak selalu mewarisi perintah int atau list. Dengan kata lain, kelas dasar Anda harus selalu mewarisi objek.

  class MyNewObject(object): # stuff here

Kelas-kelas baru ini memperbaiki beberapa masalah yang sangat mendasar yang muncul di kelas-kelas lama, dan jika Anda tertarik, Anda dapat melihat dokumentasi.

  • Kesalahan iterasi

Kesalahan-kesalahan berikut ini sangat umum dilakukan oleh para pemula:

  for name_index in range(len(names)):
    print(names[name_index])

Jelas tidak perlu menggunakan len, dan sebenarnya menjelajahi daftar dapat dilakukan dengan kalimat yang sangat sederhana:

  for name in names:
     print(name)  

Selain itu, ada banyak alat lain yang dapat Anda gunakan untuk mempermudah iterasi. Misalnya, zip dapat digunakan untuk menelusuri dua daftar:

  for cat, dog in zip(cats, dogs):
     print(cat, dog)

Jika kita ingin mempertimbangkan variabel indeks dan daftar nilai, kita bisa menggunakan enumerate

  for index, cat in enumerate(cats):
     print(cat, index)

Ada banyak fitur dalam itertools yang bisa dipilih. Jika ada fitur yang Anda inginkan dalam itertools, sangat mudah untuk mendapatkan dan menggunakannya.

Penyalahgunaan itertools membuat salah satu dewa StackOverflow menghabiskan banyak waktu untuk menyelesaikannya.

Menggunakan parameter default yang dapat diubah

Saya telah melihat banyak hal seperti ini:

  def foo(a, b, c=[]):
     # append to c
     # do some more stuff

Jangan gunakan parameter default yang dapat diubah, seperti:

  def foo(a, b, c=None):
   if c is None:
     c = []
     # append to c
     # do some more stuff 

Contoh berikut ini dapat membantu kita memahami masalah ini secara intuitif:

  In[2]: def foo(a, b, c=[]):
  ...     c.append(a)
  ...     c.append(b)
  ...     print(c)
  ...
  In[3]: foo(1, 1)
  [1, 1]
  In[4]: foo(1, 1)
  [1, 1, 1, 1]
  In[5]: foo(1, 1)
  [1, 1, 1, 1, 1, 1]

C yang sama dikutip berulang kali setiap kali fungsi ini dipanggil. Ini mungkin akan menghasilkan beberapa konsekuensi yang sangat tidak perlu.