Scope, Lambda & Fungsi Tingkat Tinggi
Aturan LEGB, function anonim, serta map, filter, dan sorted dengan key.
Scope: di mana sebuah nama berlaku
Variable hanya terlihat di dalam bagian kode tempat ia dibuat. Python mencari nama dengan aturan LEGB:
- Local: di dalam function saat ini.
- Enclosing: di function pembungkus (untuk function bersarang).
- Global: tingkat atas file.
- Built-in: nama bawaan seperti
len,print,range.
x = "global"
def luar():
y = "enclosing"
def dalam():
z = "local"
print(x, y, z) # semua terlihat
dalam()
luar()
Membaca vs mengubah variable global
Membaca variable global dari function itu boleh. Memberi nilai baru membuat variable lokal baru:
hitung = 0
def tambah():
hitung = hitung + 1 # UnboundLocalError!
def tambah_global():
global hitung
hitung += 1 # butuh kata kunci global
Sebisa mungkin hindari global; kirim nilai lewat parameter dan kembalikan hasilnya.
nonlocal pada function bersarang
def penghitung():
n = 0
def tambah():
nonlocal n
n += 1
return n
return tambah
c = penghitung()
print(c(), c(), c()) # 1 2 3
Inilah closure: function dalam yang mengingat variable dari function luar.
Lambda: function mini
lambda parameter: ekspresi membuat function anonim satu ekspresi.
kuadrat = lambda n: n * n
print(kuadrat(6)) # 36
Paling berguna sebagai argumen untuk function lain. Untuk logika lebih dari satu ekspresi, gunakan def.
map, filter, sorted
angka = [1, 2, 3, 4, 5, 6]
list(map(lambda n: n * 10, angka)) # [10, 20, ..., 60]
list(filter(lambda n: n % 2 == 0, angka)) # [2, 4, 6]
map mengubah setiap elemen, filter menyaring elemen. (Comprehension di bab berikut sering lebih mudah dibaca.)
sorted dengan key
key= menentukan nilai apa yang dipakai untuk mengurutkan:
kata = ["pisang", "ara", "jeruk", "kiwi"]
sorted(kata) # urut abjad
sorted(kata, key=len) # urut panjang: ['ara', 'kiwi', 'jeruk', 'pisang']
sorted(kata, key=lambda s: s[-1]) # urut huruf terakhir
siswa = [("Ani", 80), ("Budi", 95)]
sorted(siswa, key=lambda s: s[1], reverse=True)
min() dan max() juga menerima key=.
any dan all
any(n > 5 for n in angka) # adakah yang > 5?
all(n > 0 for n in angka) # apakah semuanya > 0?
Fungsi sebagai nilai
Function adalah objek biasa: boleh disimpan di variable, dimasukkan ke list/dict, dan dikirim sebagai argumen.
operasi = {"tambah": lambda a, b: a + b, "kali": lambda a, b: a * b}
print(operasi["kali"](3, 4)) # 12