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! again

Baca 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 = 7

Python 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)       # 10

return 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 2

Python 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])   # 3

return 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))   # 7

Tidak 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())   # 1

Setiap 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())   # 3

Baris 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.