25. Module dan import — Solusi Pekerjaan Rumah

Setiap soal memiliki foldernya sendiri di bawah exercises/25/homework/solutions/. Untuk menjalankan salah satu:

cd exercises/25/homework/solutions/01-greet-module
python main.py

Soal 1 — Module greet

Soal. Lengkapi module greet.py yang mengekspos hello dan bye.

Cara berpikir. File .py biasa dengan dua function — tidak perlu pembungkus. Keduanya sederhana: masing-masing satu print.

Solusi. greet.py:

def hello(name):
    print(f"Hello, {name}!")

def bye(name):
    print(f"Goodbye, {name}.")

main.py:

import greet

greet.hello("Keiko")
greet.bye("Keiko")

Kesalahan umum.

  • Menambahkan guard if __name__ == "__main__": di module dan memanggil function di sana. Module hanya boleh mendefinisikan function; si pemanggil yang melakukan pemanggilan.
  • Menjalankan dari direktori yang salah. cd ke folder terlebih dahulu, atau Python tidak akan menemukan greet.py.

Soal 2 — Math helpers

Soal. Module dengan double dan triple.

Cara berpikir. Bentuknya sama dengan Soal 1, tapi function-nya mengembalikan nilai alih-alih mencetak. Si pemanggil yang mencetak.

Solusi. math_helpers.py:

def double(x):
    return x * 2

def triple(x):
    return x * 3

main.py:

import math_helpers as mh

print(mh.double(7))           # 14
print(mh.triple(7))           # 21
print(mh.double(mh.triple(5)))   # 30

Kesalahan umum.

  • Menaruh print di dalam function module. Mengembalikan nilai membiarkan si pemanggil memutuskan apa yang akan dilakukan dengannya.

Soal 3 — Counter

Soal. Module dengan increment, get, dan reset. Counter internal harus bertahan antar pemanggilan.

Cara berpikir. Variable di level module (di luar function apapun) hidup selama lifetime module — yang, berkat caching import Python, adalah selama lifetime program. Ketiga function membaca dan memodifikasi variable yang sama itu. Function yang menugaskan ke variable level module harus mendeklarasikannya dengan global.

Solusi. counter.py:

_count = 0

def increment():
    global _count
    _count = _count + 1

def get():
    return _count

def reset():
    global _count
    _count = 0

main.py:

import counter

counter.increment()
counter.increment()
counter.increment()
print(counter.get())     # 3

counter.reset()
print(counter.get())     # 0

Kesalahan umum.

  • Mendeklarasikan count di dalam increment. Setiap pemanggilan mengatur ulangnya ke 0, lalu menaikkannya ke 1. State yang persisten harus berada di level module, di luar function.
  • Lupa global _count di dalam increment dan reset. Tanpanya, Python membuat variable lokal yang membayangi yang di level module; nilai level module tidak pernah berubah.

Tantangan — String utilities

Soal. Module dengan tiga function string buatanmu sendiri.

Cara berpikir. Pilih tiga. Contoh menunjukkan shout, echo, dan reverse_words. reverse_words memisahkan berdasarkan spasi dengan .split() dan membalik list yang dihasilkan.

Solusi. string_utils.py:

def shout(s):
    return s.upper() + "!"

def echo(s, n):
    return " ".join([s] * n)

def reverse_words(s):
    words = s.split()
    words.reverse()
    return " ".join(words)

main.py:

import string_utils as su

print(su.shout("hello"))                      # HELLO!
print(su.echo("hi", 4))                       # hi hi hi hi
print(su.reverse_words("one two three four")) # four three two one

s.split() tanpa argumen memisahkan pada spasi apapun dan mengembalikan list kata. [s] * n membuat list berisi n salinan dari s. " ".join(...) menggabungkan dengan spasi.

Kesalahan umum.

  • Menulis s.split(" ") alih-alih s.split(). Bentuk tanpa argumen menangani banyak spasi dan spasi di awal/akhir dengan bersih; bentuk spasi tunggal tidak.

Selesai?

Part 5 selesai begitu keempat program pekerjaan rumah berjalan. Mini-project Part 5 — sebuah Petualangan Teks — menggabungkan function, list, dictionary, dan module menjadi dunia game kecil.