8 Trik Python Digunakan oleh Pemrogram Berpengalaman

gambar



Berikut adalah delapan trik Python bagus yang saya yakin Anda belum melihat. Terapkan trik ini ke kode Python Anda untuk membuatnya lebih ringkas dan performan!



1. Menyortir objek dengan beberapa tombol



Misalkan kita ingin mengurutkan daftar kamus berikut:



people = [
{ 'name': 'John', "age": 64 },
{ 'name': 'Janet', "age": 34 },
{ 'name': 'Ed', "age": 24 },
{ 'name': 'Sara', "age": 64 },
{ 'name': 'John', "age": 32 },
{ 'name': 'Jane', "age": 34 },
{ 'name': 'John', "age": 99 },
]


Tapi kami tidak hanya ingin mengurutkannya berdasarkan nama atau usia, kami ingin mengurutkannya berdasarkan kedua bidang. Dalam SQL, ini akan menjadi pertanyaan seperti ini:



SELECT * FROM people ORDER by name, age


Sebenarnya ada solusi yang sangat sederhana untuk masalah ini, berkat kepastian Python bahwa fungsi semacam itu memberikan kegigihan . Ini berarti bahwa elemen-elemen yang dibandingkan menjaga urutan aslinya.



Untuk mencapai pengurutan berdasarkan nama dan usia, kita dapat melakukan ini:



import operator
people.sort(key=operator.itemgetter('age'))
people.sort(key=operator.itemgetter('name'))


Perhatikan bagaimana saya mengubah urutannya. Pertama kita mengurutkan berdasarkan usia, dan kemudian berdasarkan nama. Dengan bantuan operator.itemgetter()kami mendapatkan bidang usia dan nama dari setiap kamus dalam daftar.



Ini memberi kami hasil yang kami inginkan:



[
 {'name': 'Ed',   'age': 24},
 {'name': 'Jane', 'age': 34},
 {'name': 'Janet','age': 34},
 {'name': 'John', 'age': 32},
 {'name': 'John', 'age': 64},
 {'name': 'John', 'age': 99},
 {'name': 'Sara', 'age': 64}
]


Nama diurutkan terlebih dahulu, umur disortir jika nama cocok. Dengan demikian, semua Yohanes dikelompokkan berdasarkan usia.



Sumber inspirasi adalah pertanyaan dari StackOverflow .



2. Daftar inklusi (Daftar Generator)



Daftar inklusi dapat menggantikan loop jelek yang digunakan untuk mengisi daftar. Sintaks dasar untuk inklusi daftar:



[ expression for item in list if conditional ]


Contoh yang sangat sederhana untuk mengisi daftar dengan urutan angka:



mylist = [i for i in range(10)]
print(mylist)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


Dan karena Anda dapat menggunakan ekspresi, Anda dapat melakukan beberapa matematika juga:



squares = [x**2 for x in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


Atau bahkan memanggil fungsi eksternal:



def some_function(a):
    return (a + 5) / 2
    
my_formula = [some_function(i) for i in range(10)]
print(my_formula)
# [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0]


Akhirnya, Anda dapat menggunakan "jika" untuk memfilter daftar. Dalam hal ini, kami hanya menyimpan nilai-nilai yang dapat dibagi 2:



filtered = [i for i in range(20) if i%2==0]
print(filtered)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


3. Periksa penggunaan memori objek Anda



Dengan sys.getsizeof () Anda dapat memeriksa penggunaan memori suatu objek:



import sys

mylist = range(0, 10000)
print(sys.getsizeof(mylist))
# 48


Wow ... tunggu ... mengapa daftar besar ini hanya 48 byte?

Ini karena fungsi rentang mengembalikan kelas yang hanya berperilaku seperti daftar. Kisaran memori jauh lebih sedikit daripada daftar angka yang sebenarnya.

Anda dapat melihat sendiri dengan menggunakan daftar inklusi untuk membuat daftar angka aktual dari rentang yang sama:



import sys

myreallist = [x for x in range(0, 10000)]
print(sys.getsizeof(myreallist))
# 87632


Jadi, dengan bermain-main dengannya sys.getsizeof(), Anda dapat mempelajari lebih lanjut tentang Python dan penggunaan memori Anda.



4. Kelas data



Sejak versi 3.7, Python menawarkan kelas data. Ada beberapa keunggulan dibandingkan kelas reguler atau alternatif lain, seperti mengembalikan beberapa nilai atau kamus:



  • kelas data membutuhkan kode minimal
  • Anda dapat membandingkan kelas data karena ada __eq__
  • Anda dapat dengan mudah menyimpulkan kelas data untuk debugging karena ada __repr__
  • kelas data membutuhkan petunjuk jenis, yang mengurangi kemungkinan kesalahan


Berikut adalah contoh dari kelas data yang sedang beraksi:



from dataclasses import dataclass

@dataclass
class Card:
    rank: str
    suit: str
    
card = Card("Q", "hearts")

print(card == card)
# True

print(card.rank)
# 'Q'

print(card)
Card(rank='Q', suit='hearts')


Panduan terperinci dapat ditemukan di sini .



5. Paket attrs



Alih-alih kelas data, Anda dapat menggunakan attrs . Ada dua alasan untuk memilih attrs:



  • Anda menggunakan versi Python yang lebih lama dari 3,7
  • Anda ingin lebih banyak opsi


Paket ini attrsmendukung semua versi utama Python, termasuk CPython 2.7 dan PyPy. Beberapa atribut tambahan yang ditawarkan attrsdibandingkan dengan kelas data reguler adalah validator dan konverter. Mari kita lihat beberapa contoh kode:



@attrs
class Person(object):
    name = attrib(default='John')
    surname = attrib(default='Doe')
    age = attrib(init=False)
    
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)

# Output: 
#   Person(name='John', surname='Doe', age=NOTHING)
#   Person(name='Bill', surname='Gates', age=60)


Para penulis attrssebenarnya bekerja di PEP yang memperkenalkan kelas data. Kelas data sengaja dibuat lebih sederhana (lebih mudah dipahami), sementara attrs menawarkan serangkaian fitur lengkap yang mungkin Anda butuhkan!



Contoh lebih lanjut dapat ditemukan di halaman contoh attrs .



6. Menggabungkan kamus (Python 3.5+)



Dimulai dengan Python 3.5, lebih mudah untuk menggabungkan kamus:



dict1 = { 'a': 1, 'b': 2 }
dict2 = { 'b': 3, 'c': 4 }
merged = { **dict1, **dict2 }
print (merged)
# {'a': 1, 'b': 3, 'c': 4}


Jika ada tombol berpotongan, kunci dari kamus pertama akan ditimpa.



Dalam Python 3.9, menggabungkan kamus menjadi lebih bersih. Penggabungan di atas dalam Python 3.9 dapat ditulis ulang sebagai:



merged = dict1 | dict2


7. Cari nilai yang paling umum



Untuk menemukan nilai paling umum dalam daftar atau string:



test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
print(max(set(test), key = test.count))
# 4


Apakah Anda mengerti mengapa ini berhasil? Cobalah untuk mencari tahu sendiri sebelum membaca lebih lanjut.



Anda bahkan sudah mencobanya, bukan? Saya akan memberitahu Anda:



  • max()akan mengembalikan nilai tertinggi dalam daftar. Argumen keymengambil fungsi argumen tunggal untuk menyesuaikan urutan pengurutan, dalam hal ini test.count. Fungsi ini diterapkan ke setiap elemen iterable.
  • test.count- fungsi daftar built-in. Dibutuhkan argumen dan akan menghitung jumlah kemunculan argumen itu. Jadi itu test.count(1)akan mengembalikan 2 dan test.count(4)mengembalikan 4.
  • set(test) mengembalikan semua nilai unik dari pengujian, jadi {1, 2, 3, 4}


Jadi, dalam satu baris kode ini, kami menerima semua nilai unik untuk pengujian tersebut {1, 2, 3, 4}. Maka itu akan maxberlaku fungsi untuk mereka list.countdan mengembalikan nilai maksimum.



Dan tidak - saya tidak menciptakan satu-liner ini.



Pembaruan: Sejumlah komentator dengan tepat mencatat bahwa ada cara yang jauh lebih efisien untuk melakukan ini:



from collections import Counter
Counter(test).most_common(1)
# [4: 4]


8. Mengembalikan beberapa nilai



Fungsi dalam Python dapat mengembalikan lebih dari satu variabel tanpa kamus, daftar, atau kelas. Ini berfungsi seperti ini:



def get_user(id):
    # fetch user from database
    # ....
    return name, birthdate

name, birthdate = get_user(4)


Ini bagus untuk sejumlah nilai pengembalian yang terbatas. Tapi apapun yang lebih dari 3 nilai harus ditempatkan di kelas (data).



gambar



Pelajari detail cara mendapatkan profesi yang dicari dari awal atau Tingkatkan keterampilan dan gaji dengan menyelesaikan kursus online berbayar SkillFactory:











All Articles