5 Kesalahan Umum Pemula Python

Pada hari-hari awal bekerja sebagai programmer Python, kita semua menemukan berbagai jenis bug dalam kode kita, yang setelah beberapa jam yang menyakitkan di StackOverflow bukan bug, tetapi fitur Python. Di bawah ini adalah 5 kesalahan paling umum yang dilakukan oleh kebanyakan programmer Python baru. Mari cari tahu sedikit tentang mereka untuk menghemat beberapa jam dengan mengajukan pertanyaan pada halaman dan grup di Facebook.

1. Salin kamus atau daftar


Saat Anda perlu membuat salinan kamus atau daftar, cukup menggunakan operator penugasan saja tidak cukup.

Salah:

>>> dict_a = {"name": "John", "address":"221B Baker street"} >>> dict_b = dict_a 

Sekarang, jika Anda mengubah atau memperbarui dict_b, maka dict_a juga akan berubah - dan semua ini berkat operator penugasan. Dengan menggunakan operator ini, Anda mencoba mengatakan bahwa dict_b akan menunjuk ke objek yang sama dengan dict_a.

 >>> dict_b["age"] = 26 >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> 

Benar: gunakan metode salin () atau deepcopy ().

 >>> dict_c = dict_b.copy() >>> dict_c["location"] = "somewhere" >>> dict_c {'address': '221B Baker street', 'name': 'John', 'age': 26, 'location': 'somewhere'} >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> 

Lihat perbedaan antara copy dan deepcopy.

2. Kunci kamus


Mari kita coba menambahkan nilai ke kamus:

 >>> dict_a = dict() >>> dict_a {} >>> dict_a[1] = "apple" >>> dict_a[True] = "mango" >>> dict_a[2] = "melon" 

Jika kita mencoba menampilkan kamus di layar, apa yang akan kita lihat?

 >>> dict_a {1: 'mango', 2: 'melon'} 

Apa yang terjadi, di mana kunci Sejati?

Harus diingat bahwa kelas Boolean mewarisi dari Integer (integer). Dan integer yang setara dengan True adalah 1; setara False adalah 0. Oleh karena itu, nilai untuk kunci 1 hanya ditimpa.

 >>> isinstance(True, int) True >>> isinstance(False, int) True >>> True == 1 True >>> False == 0 True 

3. Memperbarui daftar atau kamus


Misalkan Anda ingin menambahkan item ke daftar.

 >>> list_a = [1,2,3,4,5] >>> list_a = list_a.append(6) >>> list_a >>> # prints nothing 

Atau mencoba memperbarui kamus.

 >>> dict_a = {"a" : "b"} >>> dict_a = dict_a.update({"c" : "d"}) >>> dict_a >>> # prints nothing 

Sekarang mari kita coba mengatur daftarnya.

 >>> list_b = [2,5,3,1,7] >>> list_b = list_b.sort() >>> list_b >>> # prints nothing 

Mengapa tidak ada yang keluar, apa yang kita lakukan salah?

Sebagian besar metode wadah (seperti mengurutkan, memperbarui, menambahkan, menambahkan, dll.) Dioptimalkan untuk tujuan kinerja - dan menghindari pembuatan salinan terpisah yang tidak perlu.

Jangan mencoba untuk menetapkan nilai pengembalian metode tersebut ke suatu variabel.

Dengan benar:

 >>> list_a = [1,2,3,4,5] >>> list_a.append(6) >>> dict_a = {"a" : "b"} >>> dict_a.update({"c" : "d"}) >>> dict_a {'c': 'd', 'a': 'b'} >>> list_a.sort() >>> list_a [1, 2, 3, 4, 5, 6] 

4. string diinternir


Dalam beberapa kasus, Python mencoba menggunakan kembali objek yang tidak dapat diubah yang ada. String interning adalah salah satu contohnya.

 >>> a = "gmail" >>> b = "gmail" >>> a is b True 

Di sini kami mencoba membuat dua objek berbeda - string. Tetapi ketika kami menguji mereka untuk kesetaraan, ternyata mereka benar-benar bertepatan. Ini karena Python tidak membuat objek lain b, tetapi membuat b menunjuk ke nilai pertama "gmail".
Semua string dengan panjang 1 diinternir. Baris yang memiliki sesuatu selain karakter, angka, dan garis bawah ASCII tidak akan diinternir.
Mari kita periksa.

 >>> a = "@gmail" >>> b = "@gmail" >>> a is b False 

Juga ingat bahwa == berbeda dari operator is. Operator == memeriksa apakah nilainya setara atau tidak, sedangkan operator adalah memeriksa apakah kedua variabel merujuk ke objek yang sama.

 >>> a = "@gmail" >>> b = "@gmail" >>> a is b False >>> a == b True 

Jadi ingatlah itu ketika menggunakan string tidak dapat diubah atau == dan operator.

5. Argumen default dievaluasi satu kali.


Pertimbangkan sebuah contoh:

 def func(a, lst=[]): lst.append(a) return lst print(func(1)) print(func(2)) 

Menurut Anda apa yang akan ditampilkan setelah dua cetakan?

Mari kita jalankan kodenya.

 >>> def func(a, lst=[]): ... lst.append(a) ... return lst ... >>> print(func(1)) [1] >>> print(func(2)) [1, 2] 

Mengapa keluaran kasus kedua [1, 2]? Bukankah seharusnya hanya [2]?

Jadi, tangkapannya adalah bahwa argumen default dievaluasi hanya sekali.Pertama kali fungsi dipanggil, func (1), daftar dievaluasi dan menyadari bahwa itu kosong. Ini berarti Anda dapat menambahkan 1. Tetapi pada panggilan kedua - func (2) - sudah ada satu elemen dalam daftar, oleh karena itu [1, 2] ditampilkan.

Bonus: Tidak perlu mencampur spasi dan tab. Hanya saja, jangan.

Source: https://habr.com/ru/post/id458902/


All Articles