21. Functions
Kamu sudah memanggil function sejak Bab 7 — print,
input, int, random.randint,
math.sqrt. Sekarang kamu akan menulis sendiri: sebuah
function memberi nama pada sekumpulan pekerjaan yang bisa kamu gunakan
ulang.
Mendefinisikan dan memanggil
Definisi paling sederhana:
def greet():
print("Hello!")
greet() # prints Hello!
greet() # prints Hello! againBaca seperti ini: definisikan function greet yang
tidak menerima argumen dan menjalankan isinya ketika dipanggil.
Titik dua membuka isi function; indentasi menutupnya. Panggil dengan
menulis namanya diikuti ().
Python tidak punya kata kunci local. Function yang
didefinisikan di bagian atas file tersedia di seluruh file tersebut.
Taruh di sana kecuali ada alasan untuk menyarangnya.
Parameter
Sebuah function menerima input sebagai parameter di dalam tanda kurung:
def greet(name):
print(f"Hello, {name}!")
greet("Keiko") # Hello, Keiko!
greet("Python") # Hello, Python!name hanya hidup selama satu pemanggilan; si pemanggil
memberikan nilainya (disebut argumen) berdasarkan
posisi. Dengan lebih dari satu parameter:
def add(a, b):
print(f"{a} + {b} = {a + b}")
add(3, 4) # 3 + 4 = 7Python tidak diam-diam menerima argumen berlebih — memanggil
add(1, 2, 3) akan memunculkan TypeError.
Argumen yang kurang juga memunculkan TypeError kecuali
parameternya punya nilai default (lihat di bawah).
Parameter default
Sebuah parameter bisa punya nilai default. Jika si pemanggil melewatinya, nilai default akan digunakan:
def greet(name="World"):
print(f"Hello, {name}!")
greet("Keiko") # Hello, Keiko!
greet() # Hello, World!Parameter dengan default harus berada setelah parameter tanpa default.
return — mengembalikan
nilai
Untuk menghasilkan sebuah nilai alih-alih mencetak, gunakan
return:
def square(n):
return n * n
result = square(5)
print(result) # 25
print(square(7)) # 49
print(square(3) + 1) # 10return langsung mengakhiri function dan mengembalikan
nilainya. Function tanpa return mengembalikan
None.
Buka exercises/21/01-square.py. Tambahkan function
cube(n) yang mengembalikan n ** 3, lalu
panggil cube(3).
Beberapa nilai return
Sebuah function Python bisa mengembalikan beberapa nilai sekaligus sebagai tuple:
def divmod_custom(a, b):
return a // b, a % b
q, r = divmod_custom(17, 5)
print(q, r) # 3 2Python mengemas dua nilai itu menjadi tuple (3, 2) dan
multi-assignment di sebelah kiri membongkarnya menjadi q
dan r. Kamu sudah melihat ide yang sama di Bab 11 dengan
trik tukar a, b = b, a — itu bekerja dengan alasan yang
sama.
Kamu juga bisa menangkap tuple-nya sebagai satu variable dan membongkarnya nanti:
result = divmod_custom(17, 5)
print(result) # (3, 2)
print(result[0]) # 3return awal
untuk pengecekan guard
Karena return langsung mengakhiri function, sangat
berguna untuk menangani kasus mudah terlebih dahulu:
def absolute(n):
if n >= 0:
return n
return -n
print(absolute(5)) # 5
print(absolute(-7)) # 7Tidak perlu else: jika cabang pertama cocok, function
keluar di sana dan baris setelah if tidak pernah
dijalankan. Ini disebut guard, atau early
return.
Scope: di mana variable hidup
Variable yang dibuat di dalam function hanya hidup selama pemanggilan itu. Begitu function selesai, variable tersebut hilang:
def counter_step():
count = 0
count = count + 1
return count
print(counter_step()) # 1
print(counter_step()) # 1 (not 2)
print(counter_step()) # 1Setiap pemanggilan mendapat count yang baru. Untuk
menyimpan nilai antar pemanggilan, deklarasikan di luar
function:
count = 0
def step():
global count
count = count + 1
return count
print(step()) # 1
print(step()) # 2
print(step()) # 3Baris global count memberitahu Python bahwa
count di dalam step merujuk ke yang ada di
level module, bukan variable lokal yang baru. Kamu akan menggunakan pola
ini sesekali — tapi pendekatan yang lebih bersih untuk state bersama
dibahas di bab tentang class nanti.
Pekerjaan Rumah
Soal 1 — Greet
Buka exercises/21/homework/01-greet.py. Tulis function
greet(name) yang mencetak
Hello, <name>!. Panggil dengan tiga nama yang
berbeda.
Soal 2 — is_even
Buka exercises/21/homework/02-is-even.py. Tulis
is_even(n) yang mengembalikan (bukan
mencetak) True atau False apakah
n genap. Panggil pada beberapa nilai di dalam
print agar boolean-nya terlihat.
Soal 3 — Clamp
Buka exercises/21/homework/03-clamp.py. Tulis
clamp(x, lo, hi) yang mengembalikan lo jika
x di bawah lo, hi jika di atas
hi, dan x jika tidak. Uji dengan tiga
pemanggilan yang mencakup setiap kasus.
Tantangan — Swap
Buka exercises/21/homework/04-swap.py. Tulis
swap(a, b) yang mengembalikan dua nilai dengan posisi yang
ditukar. Lalu deklarasikan dua variable, panggil swap pada
keduanya, tangkap hasilnya kembali ke nama yang sama, dan cetak
sebelum dan sesudah — menggunakan multi-return dan multi-assignment dari
Bab 11.
Bingung atau sudah selesai? Buka halaman solusi pekerjaan rumah.