Bài 27

Tham số của hàm

Biết cách thiết lập các tham số của hàm, hiểu được cách truyền giá trị thông qua đối số hàm, biết viết chương trình có sử dụng chương trình con.

🚀

1. Khởi động (Engagement)

Quan sát các lệnh sau và cho biết sự khác nhau giữa tham số (parameter) và đối số (argument).

💡 Câu hỏi suy ngẫm: Khi chúng ta gọi một hàm, làm thế nào dữ liệu được truyền qua tham số vào hàm? Có sự khác biệt gì giữa việc truyền số nguyên, xâu kí tự và các kiểu dữ liệu khác?

Trong bài học này, chúng ta sẽ tìm hiểu sâu về cách thiết lập các tham số của hàm và cơ chế truyền giá trị thông qua đối số hàm.

📖

2. Hình thành kiến thức (Knowledge)

1. Tham số và đối số của hàm

Quan sát ví dụ sau, tìm hiểu cách dữ liệu được truyền qua tham số vào hàm:

>>> def f(a, b, c):
...     return a + b + c
>>> f(1, 2, 3)
6
>>> x, y, z = 10, 20, 5
>>> f(x, y, z)
35
>>> f(a, b, c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
f(a, b, c)
NameError: name 'a' is not defined
Python Script

Phân tích:

  • Hàm f() có ba tham số a, b, c
  • f(1, 2, 3) - Hàm f() được gọi với ba giá trị cụ thể
  • f(x, y, z) - Hàm f() được gọi với ba biến đã có giá trị
  • f(a, b, c) - Lời gọi hàm bị lỗi nếu các tham số được truyền vào chưa có giá trị

Khái niệm:

  • Tham số (Parameter): Là các biến đại diện được ghi trong định nghĩa hàm (def f(a, b, c):)
  • Đối số (Argument): Là giá trị thật sự em truyền vào khi gọi hàm (f(1, 2, 3))

2. Cách truyền dữ liệu qua tham số

Dữ liệu được truyền vào hàm thông qua cơ chế truyền giá trị. Khi gọi hàm, các đối số được gán cho các tham số tương ứng theo thứ tự.

Ví dụ:

def tinh_tong(a, b):
    return a + b

# Khi gọi tinh_tong(5, 3):
# a = 5, b = 3
ket_qua = tinh_tong(5, 3)  # ket_qua = 8
Python Script

3. Các ví dụ về hàm với tham số

Ví dụ 1: Hàm không trả lại giá trị

def Nhap_xau():
    msg = input("Nhập một xâu: ")
    return msg

def Inday(n):
    for k in range(n):
        print(k, end = " ")
Python Script

Ví dụ 2: Hàm kiểm tra số nguyên tố

def prime(n):
    C = 0
    k = 1
    while k < n:
        if n % k == 0:
            C = C + 1
        k = k + 1
    if C == 1:
        return True
    else:
        return False
Python Script

4. Thiết lập hàm có nhiều lệnh return

Trong khi viết hàm có thể có nhiều lệnh return. Quan sát hàm sau:

def prime(n):
    if n < 2:
        return False
    C = 0
    k = 2
    while k < n:
        if n % k == 0:
            return False
        k = k + 1
    return True
Python Script

Hàm này có điểm khác so với hàm prime() trước đó:

  • Tối ưu hơn: kiểm tra n < 2 trước
  • Thoát sớm khi tìm thấy ước (return False)
  • Không cần biến đếm C
🧩

3. Luyện tập (Practice)

Bài tập thực hành

Bài tập 1:

Viết hàm với tham số là số tự nhiên n in ra các số là ước nguyên tố của n.

Gợi ý: Sử dụng hàm prime() trong phần thực hành.

Chương trình mẫu:

def prime(n):
    if n < 2:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

def in_uoc_nguyen_to(n):
    print("Các ước nguyên tố của", n, "là:")
    for i in range(1, n + 1):
        if n % i == 0 and prime(i):
            print(i, end=" ")
    print()

# Sử dụng hàm
so = int(input("Nhập số tự nhiên: "))
in_uoc_nguyen_to(so)
Python Script

Bài tập 2:

Viết hàm numbers(s) đếm số các chữ số có trong xâu s.

Ví dụ: numbers("0101abc") = 4.

Gợi ý:

def numbers(s):
    dem = 0
    for ch in s:
        if ch.isdigit():
            dem += 1
    return dem

# Sử dụng hàm
xau = input("Nhập xâu: ")
print("Số chữ số trong xâu:", numbers(xau))
Python Script

Bài tập 3:

Viết hàm meeting() yêu cầu người dùng nhập họ tên rồi đưa lời chào ra màn hình.

Gợi ý:

def meeting():
    ten = input("Nhập họ tên của em: ")
    print("Xin chào", ten)

# Gọi hàm
meeting()
Python Script

Thực hành tại máy:

Viết chương trình yêu cầu nhập từ bàn phím một xâu kí tự, sau đó thông báo:

  1. Tổng số các kí tự là chữ số của xâu
  2. Tổng số các kí tự là chữ cái tiếng Anh trong xâu

Viết hàm cho mỗi yêu cầu trên.

Chương trình mẫu:

def dem_chu_so(s):
    dem = 0
    for ch in s:
        if ch.isdigit():
            dem += 1
    return dem

def dem_chu_cai_tieng_anh(s):
    dem = 0
    for ch in s:
        if ch.isalpha() and ch.isascii():
            dem += 1
    return dem

# Sử dụng các hàm
xau = input("Nhập xâu kí tự: ")
print("Số chữ số:", dem_chu_so(xau))
print("Số chữ cái tiếng Anh:", dem_chu_cai_tieng_anh(xau))
Python Script
🌟

4. Vận dụng (Application)

Bài tập vận dụng

Bài tập 1: Hàm tính UCLN và BCNN

Viết hàm ucln(a, b) trả về ước chung lớn nhất của hai số a, b. Viết hàm bcnn(a, b) trả về bội chung nhỏ nhất của hai số a, b.

Gợi ý:

def ucln(a, b):
    while b != 0:
        a, b = b, a % b
    return a

def bcnn(a, b):
    return abs(a * b) // ucln(a, b)

# Sử dụng hàm
x = int(input("Nhập số thứ nhất: "))
y = int(input("Nhập số thứ hai: "))
print("UCLN:", ucln(x, y))
print("BCNN:", bcnn(x, y))
Python Script

Bài tập 2: Hàm kiểm tra năm nhuận

Viết hàm la_nam_nhuan(nam) trả về True nếu năm đó là năm nhuận, False nếu không.

Điều kiện năm nhuận:

  • Năm chia hết cho 4 nhưng không chia hết cho 100
  • Hoặc năm chia hết cho 400

Gợi ý:

def la_nam_nhuan(nam):
    if (nam % 4 == 0 and nam % 100 != 0) or (nam % 400 == 0):
        return True
    else:
        return False

# Sử dụng hàm
nam = int(input("Nhập năm: "))
if la_nam_nhuan(nam):
    print(nam, "là năm nhuận")
else:
    print(nam, "không phải là năm nhuận")
Python Script

Bài tập 3: Hàm đổi tiền

Viết hàm doi_tien(so_tien) đổi số tiền thành các mệnh giá: 500k, 200k, 100k, 50k, 20k, 10k, 5k, 1k.

Gợi ý:

def doi_tien(so_tien):
    menh_gia = [500000, 200000, 100000, 50000, 20000, 10000, 5000, 1000]
    for mg in menh_gia:
        if so_tien >= mg:
            so_to = so_tien // mg
            print(f"{mg:,}đ: {so_to} tờ")
            so_tien = so_tien % mg

# Sử dụng hàm
tien = int(input("Nhập số tiền cần đổi: "))
doi_tien(tien)
Python Script

Thảo luận:

  • Lợi ích của việc chia chương trình thành các hàm nhỏ là gì?
  • Khi nào nên dùng nhiều lệnh return trong một hàm?
  • Tại sao cần kiểm tra điều kiện đầu vào của tham số trong hàm?

Ghi nhớ kiến thức 🎯

  • ✅ Tham số là biến trong định nghĩa hàm, đối số là giá trị khi gọi hàm.
  • ✅ Dữ liệu được truyền vào hàm theo cơ chế truyền giá trị.
  • ✅ Có thể có nhiều lệnh return trong một hàm.
  • ✅ Hàm giúp chương trình có cấu trúc rõ ràng và dễ bảo trì.
  • ✅ Nên kiểm tra điều kiện đầu vào của tham số để tránh lỗi.

Chúc mừng bạn đã hoàn thành bài học này! 🏆