Python: Perhatikan tempat-tempat ini.
python是一门非常有趣的语言。它提供了许多非常方便的标准库和许多内置命令是我们轻松完成任务.但是好东西太多了就有选择恐惧症了,以至于我们不能很好第利用这个标准库和它的基本机构。下面列出了一些对python新手来说很简单有效的陷阱。
Perbaikan versi Python
Ini adalah pertanyaan yang terus-menerus diajukan di StackOverflow. Jadi, saat ini adalah saat yang tepat untuk memeriksa apakah versi Python Anda konsisten. Pastikan Anda menjalankan 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 manajemen versi python yang bagus. Sayangnya hanya berjalan pada sistem *nix. Pada Mac OS, Anda dapat menginstal pyenv dengan menggunakan brew install.
Terjebak dalam memecahkan semua masalah dengan satu baris kode
Banyak orang yang membual bahwa saya telah menyelesaikan semua masalah dengan satu baris kode, meskipun kode mereka kurang efisien daripada yang ditulis secara normal, dan kode-kode ini akan lebih sulit dibaca dan bahkan ambigu; contohnya:
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))]
Sejujurnya, saya menulis kode di atas untuk menjelaskan hal ini sendiri. Tapi saya benar-benar melihat banyak orang yang melakukannya. Jika Anda hanya menunjukkan diri Anda dengan cara memecahkan masalah yang rumit dengan menambahkan sesuatu ke daftar atau set, Anda mungkin tidak akan mendapatkan imbalan.
Satu baris kontrol kode bukanlah prestasi besar, meskipun kadang-kadang terlihat sangat cerdas. Kode yang baik adalah sederhana tetapi lebih berfokus pada efisiensi dan mudah dibaca.
Set initialization yang salah
这是一个更加微妙的问题,有时候会让你措手不及。set推导式起来有点像list推导式.
>>> { 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 menunjukkan hal ini. Set agak seperti menempatkan daftar dalam wadah. Perbedaannya adalah bahwa set tidak memiliki nilai berulang dan tidak teratur. Orang biasanya menganggap {} sebagai set kosong, tetapi itu tidak, itu adalah dikte kosong.
>>> {}
{}
>>> type({})
Jadi jika kita ingin menginisialisasi set kosong, kita langsung menggunakan set (((
>>> set()
set()
>>> type(set())
Perhatikan bahwa set kosong dapat diartikan sebagai set (((), tetapi merupakan himpunan yang berisi elemen yang harus didefinisikan sebagai set (([1, 2]) ].
Salah paham GIL
GIL (global interpreter lock) berarti hanya satu thread yang dapat dijalankan pada satu program Python pada suatu waktu. Ini berarti bahwa ketika kita tidak dapat membuat satu thread dan mengharapkannya untuk berjalan secara paralel. Python interpreter sebenarnya hanya melakukan pertukaran cepat antara berbagai thread yang berjalan.
Banyak orang akan mencoba membela Python dengan mengatakan bahwa ini adalah semua thread yang sebenarnya. 3 Ini memang benar, tetapi tidak mengubah fakta bahwa Python menangani thread dengan cara yang berbeda dari yang Anda harapkan. Ruby juga memiliki situasi serupa ((dan ada kunci interpreter)).
Solusi yang ditetapkan adalah menggunakan modul multiprocessing. Proses yang disediakan modul multiprocessing pada dasarnya dapat menutupi perbedaan dengan baik. Namun, perbedaan jauh lebih tinggi daripada biaya thread. Jadi berjalan secara paralel tidak selalu baik.
Namun, masalah ini tidak akan terjadi pada setiap program Python. PyPy-stm adalah contoh implementasi Python yang tidak dipengaruhi oleh GIL. Implementasi yang dibangun di platform lain seperti JVM (Jython) atau CLR (IronPython) tidak memiliki masalah GIL.
Dengan kata lain, berhati-hatilah dengan menggunakan thread class, karena yang Anda dapatkan mungkin bukan yang Anda inginkan.
Kelas gaya yang sudah ketinggalan zaman
Pada Python 2 ada dua jenis kelas, yaitu Kelas Kelas Lama dan Kelas Kelas Baru. Jika Anda menggunakan Python 3, maka Anda menggunakan Kelas Kelas Baru secara default. Untuk memastikan bahwa Anda menggunakan Kelas Kelas Baru pada Python 2, Anda perlu mewarisi object atau kelas baru apa pun yang Anda buat yang tidak selalu mewarisi perintah int atau list. Dengan kata lain, kelas dasar Anda harus selalu mewarisi object.
class MyNewObject(object): # stuff here
Kelas baru ini memperbaiki beberapa masalah yang sangat mendasar yang muncul di kelas lama, dan jika Anda tertarik, Anda dapat melihat dokumentasi.
Iterasi yang Salah
Salah satu kesalahan yang paling umum dilakukan oleh pemula adalah:
for name_index in range(len(names)):
print(names[name_index])
Jelas tidak perlu menggunakan len, dan sebenarnya melintasi 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 lain yang dapat Anda pilih. Jika ada fitur yang Anda inginkan, mudah untuk mendapatkannya.
Penggunaan itertools yang salah membuat seorang dewa besar di StackOverflow menghabiskan banyak waktu untuk memperbaikinya.
Menggunakan parameter default variabel
Saya melihat banyak hal seperti ini:
def foo(a, b, c=[]):
# append to c
# do some more stuff
Jangan menggunakan parameter default yang dapat diubah, melainkan gunakan:
def foo(a, b, c=None):
if c is None:
c = []
# append to c
# do some more stuff
Contoh di bawah ini dapat membantu kita memahami masalah ini dengan cara yang sangat 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 disebut berulang kali setiap kali fungsi tersebut dipanggil. Hal ini dapat menimbulkan beberapa konsekuensi yang sangat tidak diinginkan.