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
attrs
mendukung semua versi utama Python, termasuk CPython 2.7 dan PyPy. Beberapa atribut tambahan yang ditawarkan attrs
dibandingkan 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
attrs
sebenarnya 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. Argumenkey
mengambil 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 itutest.count(1)
akan mengembalikan 2 dantest.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 max
berlaku fungsi untuk mereka list.count
dan 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).
Pelajari detail cara mendapatkan profesi yang dicari dari awal atau Tingkatkan keterampilan dan gaji dengan menyelesaikan kursus online berbayar SkillFactory:
- Machine Learning (12 )
- Data Science (12 )
- (9 )
- Β«Python -Β» (9 )