Kursus
Keterampilan ngoding Python semakin banyak dibutuhkan beberapa tahun terakhir. Untuk membantu Anda mengasah keterampilan pemrograman Python, kami mengkurasi 30 trik Python keren yang bisa Anda gunakan untuk meningkatkan kode Anda. Cobalah pelajari satu setiap hari selama 30 hari ke depan, dan lihat juga pos kami tentang praktik terbaik Python agar kode Anda kelas dunia.
Jika keterampilan Python Anda belum mantap, Anda juga bisa mengasahnya lewat Python Skill Track kami.
Trik Urutan & Struktur Data
#1 Slicing
a = "Hello World!"
print(a[::-1])
"""
!dlroW olleH
"""
Slicing adalah fitur di Python yang bergantung pada pengindeksan sehingga pengguna dapat mengakses sebagian dari sebuah urutan. Indeks hanyalah posisi elemen dalam suatu urutan. Jika tipe urutannya mutable, Anda bisa menggunakan slicing untuk mengekstrak dan memodifikasi data.
Catatan: Kita juga bisa melakukan slicing pada urutan yang immutable, tetapi mencoba memodifikasi slice akan memunculkan TypeError.
Format implementasi slice adalah: sequence[start:stop:step]. Jika tidak ada nilai yang ditentukan pada parameter start, stop, dan step, maka urutan akan menggunakan nilai default. Nilai defaultnya adalah:
- "start" default ke 0
- "stop" default ke panjang urutan
- "step" default ke 1 jika tidak ditentukan.
Saat diberikan sequence[start:stop] elemen yang dikembalikan adalah dari indeks awal hingga stop - 1 (indeks stop tidak disertakan).
Kita juga bisa melewatkan indeks negatif, yang dapat digunakan untuk membalik urutan. Misalnya, dalam daftar dengan 4 elemen, indeks ke-0 juga merupakan indeks -4, dan indeks terakhir juga -1. Pada contoh kode di atas, pengetahuan ini diterapkan pada parameter step dari urutan. Alhasil, string dicetak terbalik, mulai dari akhir urutan hingga indeks 0.
#2 Inplace swap / penugasan simultan
a = 10
b = 5
print(f"First: {a, b}")
"""
First: (10, 5)
"""
a, b = b, a + 2
print(f"Second: {a, b}")
"""
Second: (5, 12)
"""
Jika kesan awal Anda adalah nilai b akan 7 alih-alih 12, Anda terjebak pada perangkap penukaran di tempat (in-place).
Di Python, kita bisa membongkar iterable ke variabel dalam satu penugasan menggunakan pembongkaran otomatis. Misalnya:
a, b, c = [1, 2, 3]
print(a)
print(b)
print(c)
"""
1
2
3
"""
Kita juga bisa mengumpulkan beberapa nilai ke dalam satu variabel menggunakan * – trik Python ini disebut packing. Berikut contoh packing.
a, *b = 1, 2, 3
print(a, b)
"""
1 [2, 3]
"""
Menggabungkan packing dan unpacking otomatis melahirkan teknik yang dikenal sebagai penugasan simultan. Kita dapat menggunakan penugasan simultan untuk menetapkan serangkaian nilai ke serangkaian variabel.
#3 List vs. tuple
import sys
a = [1, 2, 3, 4, 5]
b = (1, 2, 3, 4, 5)
print(f"List size: {sys.getsizeof(a)} bytes")
print(f"Tuple size: {sys.getsizeof(b)} bytes")
"""
List size: 52 bytes
Tuple size: 40 bytes
"""
Kebanyakan programmer Python akrab dengan struktur data list. Hal yang sama tidak bisa dikatakan untuk tuple. Keduanya iterable, mendukung pengindeksan, dan mengizinkan penyimpanan tipe data heterogen. Namun, ada situasi di mana penggunaan tuple lebih disukai dibanding list.
Pertama, list bersifat mutable, artinya kita dapat memodifikasinya sesuka hati:
a = [1,2,3,4,5]
a[2] = 8
print(a)
"""
[1,2,8,4,5]
"""
Tuple, sebaliknya, bersifat immutable, artinya mencoba memodifikasinya akan memunculkan TypeError.
Karena alasan ini, tuple lebih hemat memori karena Python dapat mengalokasikan blok memori yang tepat sesuai kebutuhan data. Sebaliknya, pada list, memori ekstra harus dialokasikan untuk berjaga-jaga jika kita memperluasnya – ini disebut alokasi memori dinamis.
Singkatnya; Dalam skenario di mana Anda tidak ingin data berubah, maka struktur data tuple lebih disarankan daripada list karena alasan memori. Tuple juga lebih cepat daripada list.
Pelajari lebih lanjut tentang Struktur Data Python di tutorial ini.
#4 Generator
a = [x * 2 for x in range(10)]
b = (x * 2 for x in range(10))
print(a)
print(b)
"""
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
<generator object <genexpr> at 0x7f61f8808b50>
"""
List comprehension adalah cara pythonic untuk membuat list dari iterable lain – jauh lebih cepat daripada menggunakan for loop. Namun apa yang terjadi jika Anda tidak sengaja mengubah tanda kurung dari [] ke ()? Anda mendapatkan objek generator.
Di Python, tanda kurung bulat dengan logika list comprehension membuat apa yang dikenal sebagai objek generator. Generator adalah jenis iterable khusus. Tidak seperti list, mereka tidak menyimpan itemnya. Sebagai gantinya, mereka menyimpan instruksi untuk menghasilkan setiap elemen secara berurutan dan keadaan iterasi saat ini.
Setiap elemen hanya dihasilkan saat diminta menggunakan teknik yang disebut lazy evaluation. Manfaat utama trik Python ini menggunakan generator adalah penggunaan memori yang lebih sedikit karena seluruh urutan tidak dibangun sekaligus.
#5 Aliasing
a = [1, 2, 3, 4 ,5]
b = a
# Change the 4th index in b
b[4] = 7
print(id(a))
print(id(b))
print(a) # Remember we did not explicitly make changes to a.
"""
15136008
15136008
[1, 2, 3, 4, 7]
"""
Python adalah bahasa pemrograman berorientasi objek – semuanya adalah objek. Maka, menetapkan sebuah objek ke sebuah identifier berarti membuat referensi ke objek tersebut.
Saat kita menetapkan satu identifier ke identifier lain, kita berakhir dengan dua identifier yang mereferensikan objek yang sama. Ini adalah konsep yang dikenal sebagai aliasing. Perubahan di satu alias akan memengaruhi yang lain. Terkadang perilaku ini diinginkan, namun sering kali mengejutkan kita.
Salah satu solusinya adalah menghindari aliasing saat menggunakan objek yang mutable. Solusi lain bisa dengan membuat klon dari objek asli alih-alih referensi.
Cara paling sederhana untuk membuat klon adalah memanfaatkan slicing:
b = a[:]
Ini akan membuat referensi baru ke objek list pada identifier b.
Anda dapat membuat banyak solusi lain, seperti memanggil list(a) saat menetapkan data ke identifier lain dan menggunakan metode copy().
#6 Operator ‘not’
a = []
print(not a)
"""
True
"""
Trik Python berikutnya adalah cara termudah untuk memeriksa apakah struktur data Anda kosong dengan menggunakan operator not. not bawaan Python adalah operator logika yang mengembalikan True jika ekspresi tidak benar, atau False sebaliknya – ia membalik nilai kebenaran dari ekspresi dan objek boolean.
Cara lain yang mungkin Anda lihat adalah di dalam pernyataan if:
if not a:
# do something...
Ketika a bernilai True maka operator not akan mengembalikan False, dan sebaliknya.
Agak bikin pusing di awal, jadi cobalah langsung.
Trik String & Output
#7 F-string
first_name = "John"
age = 19
print(f"Hi, I'm {first_name} and I'm {age} years old!")
"""
Hi, I'm John and I'm 19 years old!
"""
Sesekali kita perlu memformat objek string; Python 3.6 memperkenalkan fitur keren bernama f-string untuk menyederhanakan proses ini. Akan membantu jika memahami bagaimana string diformat sebelum rilis baru agar makin menghargai metode ini.
Begini cara lama memformat string:
first_name = "John"
age = 19
print("Hi, I'm {} and I'm {} years old!".format(first_name, age))
"""
Hi, I'm John and I'm 19 years old!
"""
Pada dasarnya, cara baru ini lebih cepat, lebih mudah dibaca, lebih ringkas, dan lebih kecil kemungkinan salah.
Penggunaan lain f-string adalah mencetak nama identifier beserta nilainya. Ini diperkenalkan di Python 3.8.
x = 10
y = 20
print(f"{x = }, {y = }")
"""
x = 10, y = 20
"""
Lihat tutorial ini tentang Format F-string di Python untuk mempelajari lebih lanjut.
#8 Parameter ‘end’ pada fungsi print()
languages = ["english", "french", "spanish", "german", "twi"]
print(' '.join(languages))
"""
english french spanish german twi
"""
Cukup umum menggunakan pernyataan print tanpa mendefinisikan parameter opsionalnya. Akibatnya, banyak Pythonista tidak menyadari bahwa Anda bisa mengontrol output sampai batas tertentu.
Salah satu parameter opsional yang bisa kita ubah adalah end. Parameter end menentukan apa yang harus ditampilkan di akhir pemanggilan pernyataan print.
Default dari end adalah "\n" yang memberi tahu Python untuk memulai baris baru. Pada kode di atas, kita mengubahnya menjadi spasi. Dengan demikian, output mengembalikan semua elemen list kita dicetak pada baris yang sama.
#9 Menambahkan ke tuple
a = (1, 2, [1, 2, 3])
a[2].append(4)
print(a)
"""
(1, 2, [1, 2, 3, 4])
"""
Kita sudah tahu tuple bersifat immutable – lihat trik Python #3 List vs. Tuple. Mencoba mengubah state sebuah tuple akan memunculkan TypeError. Namun, jika Anda memandang objek tuple sebagai urutan nama dengan keterikatan (binding) ke objek yang tidak dapat diubah, Anda mungkin melihatnya berbeda.
Dua elemen pertama dari tuple kita adalah bilangan bulat – mereka immutable. Elemen terakhir dari tuple kita adalah list, sebuah objek mutable di Python.
Jika kita menganggap list kita hanyalah nama lain dalam urutan dengan keterikatan ke objek yang tidak dapat diubah, maka kita akan menyadari bahwa list tersebut masih bisa dimodifikasi dari dalam tuple.
Apakah kami menyarankan Anda melakukan ini dalam praktik? Mungkin tidak, tetapi ini termasuk hal yang asyik untuk diketahui!
#10 Menggabungkan dictionary
a = {"a": 1, "b": 2}
b = {"c": 3, "d": 4}
a_and_b = a | b
print(a_and_b)
"""
{"a": 1, "b": 2, "c": 3, "d": 4}
"""
Pada Python 3.9 ke atas, memungkinkan untuk menggabungkan dictionary menggunakan | (bitwise OR). Tidak banyak lagi yang perlu dikatakan tentang trik Python ini selain bahwa ini jauh lebih mudah dibaca!
Trik Gaya Kode & Sintaks
#11 Operator ternary / ekspresi kondisi
condition = True
name = "John" if condition else "Doe"
print(name)
"""
John
"""
Pada kode di atas, Anda melihat apa yang dikenal sebagai operator ternary – juga disebut sebagai ekspresi kondisional. Kita menggunakan operator ternary untuk mengevaluasi sesuatu berdasarkan apakah kondisi bernilai True atau False.
Cara lain kita bisa menulis kode di atas adalah sebagai berikut:
condition = True
if condition:
name = "John"
else:
name = "Doe"
print(name)
"""
John
"""
Meskipun kedua set kode menghasilkan output yang sama, perhatikan bagaimana kondisi ternary memungkinkan kita menulis kode yang jauh lebih pendek dan jelas. Inilah yang akan disebut Pythonista sebagai cara yang lebih ‘Pythonic’ untuk menulis kode.
#12 Menghapus duplikat dari list
a = [1, 1, 2, 3, 4, 5, 5, 5, 6, 7, 2, 2]
print(list(set(a)))
"""
[1, 2, 3, 4, 5, 6, 7]
"""
Cara paling sederhana untuk menghapus elemen duplikat dari list adalah mengonversi list menjadi set (lalu kembali ke list jika diinginkan).
Berdasarkan kemutabilan, set dan list cukup mirip di Python. Kita bisa menambah dan menghapus elemen dari kedua struktur data sesuka hati, tetapi tetap sangat berbeda.
List berurutan, diindeks berbasis nol, dan mutable. Set tidak berurutan dan tidak diindeks. Elemen dalam set harus bertipe immutable, meskipun set itu sendiri mutable – mencoba mengambil elemen melalui indeks atau memodifikasi elemen akan memunculkan error.
Perbedaan kunci lainnya antara set dan list adalah set tidak dapat berisi duplikat. Inilah yang membantu kita menghapus elemen duplikat dari list.
#13 Underscore berdiri sendiri
>>> print(_)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
>>> 1 + 2
3
>>> print(_)
3
Underscore (_) adalah identifier yang legal di Python, sehingga bisa digunakan untuk mereferensikan sebuah objek. Tetapi underscore juga punya tanggung jawab lain: menyimpan hasil evaluasi terakhir.
Dokumentasi menyatakan bahwa "interpreter interaktif membuat hasil evaluasi terakhir tersedia dalam variabel _. (Ia disimpan di modul builtins, bersama fungsi bawaan seperti print)."
Karena kita tidak menetapkan underscore ke suatu objek sebelum memanggilnya pada baris pertama, kita mendapatkan error. Namun, ketika kita menghitung hasil 1 + 2, interpreter interaktif menyimpan hasil tersebut ke identifier _ untuk kita.
#14 Underscore untuk mengabaikan nilai
for _ in range(100):
print("The index doesn't matter")
"""
The index doesn't matter
The index doesn't matter
...
"""
Pada trik Python #13, kita mengetahui interpreter interaktif menyediakan hasil terakhir evaluasi pada identifier underscore (_), tetapi itu bukan satu-satunya kasus penggunaan.
Kita juga bisa menggunakannya untuk mewakili objek yang tidak kita pedulikan atau tidak akan digunakan pada tahap selanjutnya dalam program. Ini penting karena menggunakan identifier alih-alih underscore (_) akan memunculkan error F841 saat kita melakukan linting pada program. Error F841 menyatakan bahwa nama variabel lokal telah ditetapkan tetapi tidak digunakan dalam program, yang merupakan praktik buruk.
#15 Trailing underscore
list_ = [0, 1, 2, 3, 4]
global_ = "Hi there"
Melanjutkan dari dua trik sebelumnya tentang penggunaan underscore (_), tujuan lain darinya adalah untuk menghindari konflik dengan kata kunci Python.
PEP 8 menyebutkan bahwa trailing underscore (_) harus "digunakan berdasarkan konvensi untuk menghindari konflik dengan kata kunci Python." Ia juga menyatakan bahwa "secara umum lebih baik menambahkan satu trailing underscore daripada menggunakan singkatan atau pengubahan ejaan. Jadi list_ lebih baik daripada lst."
#16 Leading underscore
class Example:
def __init__(self):
self._internal = 2
self.external = 20
Anda sering mendapati programmer Python berpengalaman cenderung memberi prefiks underscore pada nama identifier atau metode – dan ada alasannya.
Underscore yang diprefiks ke sebuah identifier atau metode memiliki makna tersirat: variabel atau metode ini hanya untuk penggunaan internal. Intinya, ini adalah disclaimer untuk programmer lain yang didefinisikan dalam PEP 8 tetapi tidak ditegakkan oleh Python. Jadi, leading underscore adalah indikator yang lemah.
Tidak seperti Java, Python tidak memiliki pembeda tegas antara variabel privat dan publik. Dengan kata lain, ini hanya bermakna karena komunitas Python menyepakatinya. Keberadaannya tidak memengaruhi perilaku program Anda.
#17 Visual underscore
Ini tips terakhir tentang underscore; Sejauh ini, kita telah membahas tiga kasus penggunaan berbeda untuk underscore, tetapi Anda bisa melihat tutorial kami untuk mempelajari lebih lanjut tentang Peran Underscore(_) di Python.
number = 1_500_000
print(number)
"""
15000000
"""
Cara lain kita dapat menggunakan underscore adalah sebagai pemisah visual untuk pengelompokan digit pada literal bilangan bulat, floating-point, dan kompleks – ini diperkenalkan di Python 3.6.
Gagasannya adalah membantu keterbacaan literal yang panjang, atau literal yang nilainya sebaiknya jelas dipisahkan menjadi bagian-bagian – Anda bisa membaca lebih lanjut di PEP 515.
Trik Gaya Kode & Sintaks
#18 __name__ == “__main__”
if __name__ == "__main__":
print("Read on to understand what is going on when you do this.")
"""
print("Read on to understand what is going on when you do this.")
"""
Kemungkinan besar Anda pernah melihat sintaks ini di beberapa program Python; Python menggunakan nama khusus bernama "__main__" dan menetapkannya ke identifier bernama __name__ jika berkas Python yang dijalankan adalah program utama.
Jika kita memutuskan untuk mengimpor modul yang ditampilkan pada cuplikan ke modul lain (berkas Python) dan menjalankan berkas tersebut, kebenaran ekspresi pada kode kita akan bernilai false. Ini karena saat kita mengimpor dari modul lain, identifier __name__ diatur ke nama modul (berkas Python).
#19 Metode ‘setdefault’
import pprint
text = "It's the first of April. It's still cold in the UK. But I'm going to the museum so it should be a wonderful day"
counts = {}
for word in text.split():
counts.setdefault(word, 0)
counts[word] += 1
pprint.pprint(counts)
"""
{'April.': 1,
'But': 1,
"I'm": 1,
"It's": 2,
'UK.': 1,
'a': 1,
'be': 1,
'cold': 1,
'day': 1,
'first': 1,
'going': 1,
'in': 1,
'it': 1,
'museum': 1,
'of': 1,
'should': 1,
'so': 1,
'still': 1,
'the': 3,
'to': 1,
'wonderful': 1}
"""
Anda mungkin ingin menetapkan nilai untuk berbagai key dalam sebuah dictionary. Misalnya, saat Anda melacak jumlah kata dalam sebuah korpus. Cara umum melakukannya adalah sebagai berikut:
- Periksa apakah key ada di dictionary
- Jika ada, naikkan nilainya sebesar 1.
- Jika tidak ada, tambahkan dan setel nilainya menjadi 1.
Beginilah tampilannya dalam kode:
counts = {}
for word in text.split():
if word in counts:
counts[word] += 1
else:
counts[word] = 1
Cara yang lebih ringkas adalah menggunakan metode setdefault() pada objek dictionary Anda.
Argumen pertama yang diteruskan ke metode adalah key yang ingin kita periksa. Argumen kedua adalah nilai yang akan disetel untuk key tersebut jika key belum ada di dictionary – jika key ada, maka metode akan mengembalikan nilai key. Jadi, nilainya tidak akan diubah.
Trik Struktur Program
#20 Mencocokkan regex
import re
number = re.compile(r"(0)?(\+44)?\d{10}")
num_1 = number.search("My number is +447999999999")
num_2 = number.search("My number is 07999999999")
print(num_1.group())
print(num_2.group())
"""
'+447999999999'
'07999999999'
"""
Regular expression memungkinkan Anda menentukan pola teks untuk dicari; Kebanyakan orang tahu kita bisa mencari sesuatu dengan CTRL + F (Windows), tetapi jika Anda tidak tahu persis apa yang dicari, bagaimana menemukannya? Jawabannya adalah mencari pola.
Misalnya, nomor Inggris mengikuti pola serupa: diawali nol ditambah sepuluh angka atau +44 alih-alih nol dan sepuluh angka – contoh kedua menunjukkan format internasionalnya.
Regular expression sangat menghemat waktu. Jika kita menulis aturan untuk menangkap contoh pada gambar alih-alih regex, bisa memakan 10+ baris kode.
Mempelajari cara kerja regular expression itu penting meski Anda tidak menulis kode. Sebagian besar editor teks dan pengolah kata modern mengizinkan Anda menggunakan regular expression untuk fitur find and replace.
#21 Pipe pada regex
import re
heros = re.compile(r"Super(man|woman|human)")
h1 = heros.search("This will find Superman")
h2 = heros.search("This will find Superwoman")
h3 = heros.search("This will find Superhuman")
print(h1.group())
print(h2.group())
print(h3.group())
"""
Superman
Superwoman
Superhuman
"""
Regular expression memiliki karakter khusus bernama pipe (|) yang memungkinkan Anda mencocokkan salah satu dari banyak ekspresi, dan dapat digunakan di mana saja. Ini sangat berguna saat Anda memiliki beberapa pola yang mirip.
Misalnya, 'Superman', 'Superwoman', dan 'Superhuman' semuanya memiliki prefiks yang sama. Dengan demikian, Anda bisa memanfaatkan pipe untuk mempertahankan bagian pola yang berulang dan mengubah bagian yang perlu berbeda. Sekali lagi, menghemat waktu berharga Anda.
Perhatikan jebakannya: jika semua ekspresi yang ingin Anda cocokkan muncul dalam teks yang sama, kemunculan pertama teks yang cocok akan dikembalikan – mis., "An example text containing Superwoman, Superman, Superhuman," akan mengembalikan Superwoman.
#22 Parameter ‘sep’ pada fungsi print()
day = "04"
month = "10"
year = "2022"
print(day, month, year)
print(day, month, year, sep = "")
print(day, month, year, sep = ".")
"""
04 10 2022
04/10/2022
04.10.2022
"""
Jumlah programmer Python yang tidak menyadari kemampuan penuh fungsi print() itu banyak; Jika “Hello World” adalah program pertama Anda, fungsi print() mungkin salah satu fungsi bawaan pertama yang Anda pelajari saat mempelajari Python. Kita menggunakan print() untuk menampilkan pesan terformat di layar, namun ada banyak hal lain dari fungsi print().
Pada kode di atas, kami menunjukkan berbagai cara menampilkan pesan terformat. Parameter sep adalah argumen opsional di fungsi print() yang memungkinkan kita menentukan bagaimana objek harus dipisahkan jika kita menyertakan lebih dari satu.
Defaultnya adalah dipisahkan dengan spasi, tetapi kita mengubah fungsionalitas ini dengan pernyataan print kita – satu di mana sep disetel ke "" dan satu lagi di mana sep disetel ke ".".
#23 Fungsi lambda
def square(num:int) -> int:
return num ** 2
print(f"Function call: {square(4)}")
"""
Function call: 16
"""
square_lambda = lambda x: x**2
print(f"Lambda function: {square_lambda(4)}")
"""
Lambda functional: 16
"""
Fungsi lambda membawa Anda ke hal-hal tingkat menengah-lanjutan yang bisa Anda lakukan dengan Python – pelajari Intermediate Python lewat kursus ini. Sekilas terlihat rumit, tetapi sebenarnya cukup sederhana.
Pada contoh kode kita, kita hanya menggunakan satu argumen, namun kita bisa saja menggunakan beberapa jika diinginkan:
square = lambda a, b: a ** b
print(f"Lambda function: {square(4, 2)}")
"""
16
"""
Intinya, kata kunci lambda memungkinkan kita membuat fungsi kecil, terbatas, dan anonim dalam satu baris. Mereka berperilaku seperti fungsi biasa yang dideklarasikan dengan kata kunci def, kecuali fungsi-fungsi ini tidak memiliki nama.
#24 Metode ‘swapcase’
string = "SoMe RaNDoM sTriNg"
print(string.swapcase())
"""
sOmE rAndOm StRInG
"""
Metode swapcase() diterapkan pada objek string untuk memungkinkan kita mengubah huruf besar menjadi huruf kecil dan sebaliknya dalam satu baris kode. Tidak banyak kasus penggunaan untuk metode swapcase(), tetapi ini menarik untuk diketahui.
#25 Metode ‘isalnum’
password = "ABCabc123"
print(password.isalnum())
"""
True
"""
Misalkan kita membuat program yang mengharuskan pengguna memasukkan kata sandi, tetapi harus memiliki kombinasi angka dan huruf. Kita bisa melakukan ini dalam satu baris kode dengan memanggil isalnum() pada instance string.
Metode ini memeriksa apakah semua karakter merupakan bagian dari alfabet (A-Za-z) dan numerik (0-9). Spasi atau simbol (!#%$&? dll.) akan mengembalikan False.
#26 Penanganan pengecualian
def get_ration(x:int, y:int) -> int:
try:
ratio = x/y
except ZeroDivisionError:
y = y + 1
ratio = x/y
return ratio
print(get_ration(x=400, y=0))
"""
400.0
"""
Program Python akan berhenti saat menemukan error.
Kadang, kita tidak menginginkan perilaku ini, seperti saat ada pengguna akhir berinteraksi dengan kode kita. Seberapa buruk jika kode kita berhenti lebih awal pada kasus seperti itu?
Ada beberapa aliran pemikiran tentang cara menangani kasus eksepsional. Kebanyakan programmer Python biasanya menganut pemikiran bahwa lebih mudah untuk meminta maaf daripada meminta izin. Artinya mereka lebih suka menangkap error yang muncul dengan menyediakan konteks sekitar yang mampu menangani pengecualian. Gagasannya, tidak ada gunanya membuang waktu mencoba melindungi dari semua kasus eksepsional yang mungkin.
Namun ini hanya berlaku ketika ada mekanisme untuk menghadapi masalah setelah terjadi.
#27 Mengidentifikasi perbedaan dalam list
list_1 = [1, 3, 5, 7, 8]
list_2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
solution_1 = list(set(list_2) - set(list_1))
solution_2 = list(set(list_1) ^ set(list_2))
solution_3 = list(set(list_1).symmetric_difference(set(list_2)))
print(f"Solution 1: {solution_1}")
print(f"Solution 2: {solution_2}")
print(f"Solution 3: {solution_3}")
"""
Solution 1: [9, 2, 4, 6]
Solution 2: [2, 4, 6, 9]
Solution 3: [2, 4, 6, 9]
"""
Berikut tiga metode berbeda untuk membandingkan perbedaan antara dua list di Python.
Catatan: Kecuali Anda tahu pasti bahwa list_1 adalah subset dari list_2, maka solusi 1 tidak sama dengan dua solusi lainnya.
#28 Args & kwargs
def some_function(*args, **kwargs):
print(f"Args: {args}")
print(f"Kwargs: {kwargs}")
some_function(1, 2, 3, a=4, b=5, c=6)
"""
Args: (1, 2, 3)
Kwargs: {'a': 4, 'b': 5, 'c': 6}
"""
Kita menggunakan *args dan **kwargs sebagai parameter fungsi ketika kita tidak mengetahui jumlah variabel yang harus diharapkan fungsi kita.
Parameter *args memungkinkan kita meneruskan sejumlah parameter variabel ke fungsi saat tidak berkata kunci (yakni parameter yang kita lewatkan tidak memerlukan nama terkait). Di sisi lain, parameter **kwargs memungkinkan kita meneruskan sejumlah parameter berkata kunci secara bebas ke fungsi.
Sebenarnya, kata *args dan **kwargs tidak begitu magis: keajaiban sebenarnya ada pada tanda bintang (*). Artinya kita bisa menggunakan kata apa pun setelah tanda bintang, namun penggunaan args dan kwargs adalah praktik umum, dan ditegakkan di kalangan pengembang Python.
#29 Ellipsis
print(...)
"""
Ellipsis
"""
def some_function():
...
# Alternative solution
def another_function():
pass
Ellipsis adalah objek Python yang dapat dipanggil dengan memberikan urutan tiga titik (...) atau memanggil objeknya langsung (Ellipsis).
Penggunaannya yang paling terkenal adalah untuk mengakses dan melakukan slicing pada array multidimensi di NumPy, misalnya:
import numpy as np
arr = np.array([[2,3], [1,2], [9,8]])
print(arr[...,0])
"""
[2 1 9]
"""
print(arr[...])
"""
[[2 3]
[1 2]
[9 8]]
"""
Namun penggunaan lain Ellipsis adalah sebagai placeholder dalam fungsi yang belum diimplementasikan.
Artinya Anda bisa menuliskan Ellipsis, ..., atau pass, dan semuanya tetap valid.
#30 List comprehension
even_numbers = [x for x in range(10) if x % 2 == 0 and x != 0]
print(even_numbers)
"""
[2, 4, 6, 8]
"""
Trik Python terakhir kita adalah list comprehension, yang merupakan cara elegan untuk membuat list dari urutan lain. Mereka memungkinkan Anda melakukan logika dan penyaringan canggih seperti yang kita lakukan pada kode di atas.
Ada cara lain untuk mencapai tujuan yang sama; misalnya, kita bisa menggunakan fungsi lambda seperti berikut:
even_numbers = list(filter(lambda x: x % 2 ==0 and x != 0, range(10)))
print(even_numbers)
"""
[0, 2, 4, 6, 8]
"""
Namun banyak Pythonista akan berargumen solusi ini jauh kurang mudah dibaca dibanding list comprehension.
FAQs
Apa trik Python paling berguna untuk pemula?
F-string barangkali yang paling langsung berguna. F-string membuat pemformatan string lebih cepat, lebih mudah dibaca, dan lebih kecil kemungkinan salah dibanding pendekatan lama seperti .format().
Apa cara tercepat menukar dua variabel di Python?
Gunakan penugasan simultan: a, b = b, a. Tidak perlu variabel sementara — Python mengevaluasi sisi kanan sepenuhnya sebelum melakukan penugasan.
Bagaimana menggabungkan dua dictionary dalam satu baris?
Di Python 3.9+, gunakan operator |: merged = dict_a | dict_b. Untuk versi lebih lama, gunakan {**dict_a, **dict_b}.
Apa perbedaan *args dan **kwargs?
*args mengumpulkan argumen posisi ekstra ke dalam tuple. **kwargs mengumpulkan argumen kata kunci ekstra ke dalam dictionary. Keajaibannya ada pada operator * dan **, bukan pada katanya — Anda bisa menamainya apa saja.
Bagaimana cara memeriksa apakah list kosong di Python?
Gunakan operator not: if not my_list:. Ini lebih Pythonic daripada memeriksa len(my_list) == 0.
Apa perbedaan antara list comprehension dan generator?
List comprehension (tanda kurung siku) membangun seluruh list di memori sekaligus. Generator (tanda kurung bulat) menghasilkan nilai satu per satu sesuai permintaan, menggunakan jauh lebih sedikit memori untuk urutan besar.
Kapan saya sebaiknya menggunakan operator ternary?
Gunakan untuk kondisional satu baris yang sederhana di mana kedua hasilnya singkat dan jelas: name = "John" if condition else "Doe". Untuk yang lebih kompleks, blok if/else biasa lebih mudah dibaca.
Apa cara termudah menghapus duplikat dari list?
Bungkus ke dalam set() lalu konversi kembali: list(set(my_list)). Perlu diingat set tidak berurutan, jadi urutan asli tidak akan dipertahankan.
