BÀI 25 - Tham số của hàm - Python

BÀI 25 - Tham số của hàm - Python
Slide 1/10
⚙️🔧

BÀI 27: THAM SỐ CỦA HÀM

"Tìm hiểu cách truyền dữ liệu qua tham số và đối số"

Tin học 10 | Lập trình nâng cao
Slide 2/10

🎯 SAU BÀI NÀY EM SẼ

  • Biết cách thiết lập các tham số của hàm

    Hiểu cách định nghĩa và sử dụng tham số trong khai báo hàm.

  • Hiểu cách truyền giá trị thông qua đối số hàm

    Nắm vững cơ chế truyền dữ liệu khi gọi hàm thông qua đối số.

  • Biết viết chương trình có sử dụng chương trình con

    Ứng dụng hàm để giải quyết các bài toán thực tế.

Slide 3/10

🔍 PHÂN BIỆT THAM SỐ VÀ ĐỐI SỐ

❓ Tham số (Parameter) khác Đối số (Argument) thế nào?

# Tham số (Parameter) - Khai báo hàm
>>> def f_sum(a, b, c): ← a, b, c là THAM SỐ
return a + b + c
# Đối số (Argument) - Gọi hàm
>>> x, y = 5, 3
>>> f_sum(10, x, y) ← 10, x, y là ĐỐI SỐ
18

📌 THAM SỐ (Parameter)

✅ Xuất hiện khi ĐỊNH NGHĨA hàm

✅ Là BIẾN trong khai báo

✅ Ví dụ: a, b, c

📌 ĐỐI SỐ (Argument)

✅ Xuất hiện khi GỌI hàm

✅ Là GIÁ TRỊ truyền vào

✅ Ví dụ: 10, x, y

Slide 4/10

🔬 HOẠT ĐỘNG 1: PHÂN BIỆT THAM SỐ VÀ ĐỐI SỐ

🎯 Mục tiêu:
Quan sát ví dụ sau, tìm hiểu cách dữ liệu được truyền qua tham số hàm. Thảo luận để giải thích kết quả.

📝 Ví dụ: Cách truyền dữ liệu qua tham số

1 >>> def f(a, b, c):
2 return a + b + c
3 >>> f(1, 2, 3) ← Hàm f() được gọi với ba giá trị cụ thể
4 6
5 >>> x, y, z = 10, 20, 5
6 >>> f(x, y, z) ← Hàm f() được gọi với ba biến đã có giá trị
7 35
8 >>> f(a, b, c) ← Lời gọi hàm bị lỗi nếu tham số chưa có giá trị
9 Traceback (most recent call last):
10 File "<pyshell#6>", line 1, in <module>
11 f(a, b, c)
12 NameError: name 'a' is not defined

✅ GIẢI THÍCH CHI TIẾT

📌 Dòng 1-2: Định nghĩa hàm

Hàm f() được định nghĩa với ba tham số a, b, c. Hàm trả về giá trị là a + b + c.
⚠️ Chú ý: Trong định nghĩa hàm, các tham số được coi như biến.

📌 Dòng 3-4: Gọi hàm với giá trị cụ thể

Hàm f() được gọi với ba giá trị cụ thể: 1, 2, 3
Các giá trị được truyền qua tham số gọi là ĐỐI SỐ.
Kết quả: 1 + 2 + 3 = 6

📌 Dòng 5-7: Gọi hàm với biến đã có giá trị

Hàm f() được gọi với ba biến x, y, z đã được gán giá trị (dòng 5).
Các biến này cũng là ĐỐI SỐ.
Kết quả: x + y + z = 10 + 20 + 5 = 35

📌 Dòng 8-12: Lời gọi hàm BỊ LỖI

Hàm f() được gọi với ba biến a, b, c chưa được định nghĩa giá trị.
Python báo lỗi: NameError: name 'a' is not defined
⚠️ Lý do: Không thể truyền đối số chưa có giá trị vào hàm.

Slide 5/10

📖 GHI NHỚ

📝 KIẾN THỨC TRỌNG TÂM

🔹 Tham số (Parameter) của hàm được định nghĩa khi khai báo hàm và được dùng như biến trong định nghĩa hàm.

🔹 Đối số (Argument)giá trị được truyền vào khi gọi hàm.

🔹 Khi gọi hàm, các tham số (parameter) sẽ được truyền bằng giá trị thông qua đối số (argument) của hàm.

🔹 Số lượng giá trị được truyền vào hàm bằng với số tham số trong khai báo của hàm.

Slide 6/10

✏️ BÀI TẬP CỦNG CỐ

📌 Câu 1:

Một hàm khi khai báo có một tham số, nhưng khi gọi hàm có thể có hai đối số được không?

❌ KHÔNG ĐƯỢC!

Lý do: Số lượng đối số khi gọi hàm PHẢI BẰNG với số lượng tham số trong khai báo hàm.

# Ví dụ
>>> def ham_mot_tham_so(x):
return x * 2
>>> ham_mot_tham_so(5) ← ĐÚNG: 1 tham số, 1 đối số
10
>>> ham_mot_tham_so(5, 10) ← SAI: 1 tham số, 2 đối số
TypeError: ham_mot_tham_so() takes 1 positional argument but 2 were given
⚠️ Kết luận:
Python sẽ báo lỗi TypeError nếu số đối số không khớp với số tham số!

📌 Câu 2:

Giả sử hàm f có hai tham số x, y khi khai báo, hàm sẽ trả lại giá trị x + 2*y. Lời gọi hàm f(10, a) có lỗi hay không?

⚠️ TÙY TRƯỜNG HỢP!

✅ Trường hợp 1: KHÔNG LỖI

Nếu biến a đã được định nghĩa và có giá trị trước khi gọi hàm.

>>> def f(x, y):
return x + 2 * y
>>> a = 5 ← Biến a đã có giá trị
>>> f(10, a) ← KHÔNG LỖI
20 # Kết quả: 10 + 2*5 = 20
❌ Trường hợp 2: CÓ LỖI

Nếu biến a chưa được định nghĩa trước khi gọi hàm.

>>> def f(x, y):
return x + 2 * y
>>> f(10, a) ← Biến a chưa được định nghĩa
NameError: name 'a' is not defined
💡 Kết luận:

Lời gọi hàm f(10, a) chỉ chạy được khi biến a đã được gán giá trị trước đó!

Slide 7/10

🔧 HOẠT ĐỘNG 2: KHI NÀO NÊN SỬ DỤNG CHƯƠNG TRÌNH CON?

🎯 Bài toán:
Viết chương trình yêu cầu nhập số tự nhiên n từ bàn phím và in các số nguyên tố nhỏ hơn hoặc bằng n ra màn hình.

💭 Suy nghĩ:

Trong Bài 26, em đã biết hàm prime(n) kiểm tra số n có là số nguyên tố hay không.
❓ Em sẽ viết chương trình giải bài toán này như thế nào?

📝 Ví dụ 1: Sử dụng chương trình con

Việc kiểm tra một số có là số nguyên tố được lặp đi lặp lại từ 1 đến n.
Do đó nên sử dụng hàm prime(n) để kiểm tra, giúp chương trình cấu trúc rõ ràng và dễ hiểu hơn.

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
# Chương trình chính
n = int(input("Nhập số tự nhiên n: "))
for k in range(1, n + 1):
if prime(k):
print(k, end=" ")
🎯 Ví dụ chạy chương trình:

Nhập số tự nhiên n: 20
2 3 5 7 11 13 17 19
Slide 8/10

💡 VÍ DỤ 2: CHƯƠNG TRÌNH SỬ DỤNG CHƯƠNG TRÌNH CON

🎯 Bài toán:
Cho trước hai dãy số A, B. Chương trình chính cần tính tổng các số hạng dương của mỗi dãy này.

Chúng ta sẽ thiết lập hàm tongduong(A) để tính tổng các số hạng lớn hơn 0 của một dãy A.
Chương trình chính sẽ gọi hàm tongduong(A).

📝 Chương trình:

>>> def tongduong(A):
S = 0
for k in A:
if k > 0:
S = S + k
return S
# Chương trình chính
>>> A = [0, 2, -1, 5, 10, -3]
>>> B = [1, -10, -11, 8, 2, 0, -5]
>>> tongduong(A) ← Tổng số dương của dãy A
17
>>> tongduong(B) ← Tổng số dương của dãy B
11

🔍 Giải thích:

✅ Dãy A có các số dương: 2, 5, 10 → Tổng = 17

✅ Dãy B có các số dương: 1, 8, 2 → Tổng = 11

💡 Lợi ích: Hàm tongduong() được viết một lần nhưng sử dụng nhiều lần cho các dãy khác nhau!

Slide 9/10

📖 GHI NHỚ - LỢI ÍCH CỦA CHƯƠNG TRÌNH CON

🌟 TẠI SAO NÊN SỬ DỤNG CHƯƠNG TRÌNH CON?

🔹 1. Phân chia bài toán

Giúp phân chia việc giải một bài toán lớn thành giải quyết các bài toán nhỏ và phát huy được tinh thần làm việc nhóm.

🔹 2. Cấu trúc rõ ràng

Chương trình chính có cấu trúc rõ ràng, dễ hiểu hơn khi sử dụng các hàm con.

🔹 3. Dễ bảo trì và nâng cấp

Nếu cần hiệu chỉnh, phát triển và nâng cấp cũng thuận tiện hơn.

🔹 4. Tái sử dụng code

Một hàm được viết một lần có thể sử dụng nhiều lần ở các vị trí khác nhau trong chương trình.

💡 NGUYÊN TẮC VÀNG

"Một đoạn code xuất hiện nhiều lần
→ Hãy biến nó thành một hàm!"

Slide 10/15

✏️ BÀI TẬP CỦNG CỐ BỔ SUNG

📌 Câu 1:

Sử dụng hàm prime, em hãy viết chương trình in ra các số nguyên tố trong khoảng từ m đến n, với m, n là hai số tự nhiên và 1 < m < n.

✅ ĐÁP ÁN:

def prime(n):
"""Kiểm tra n có phải số nguyên tố không"""
if n < 2:
return False
C = 0
k = 1
while k < n:
if n % k == 0:
C = C + 1
k = k + 1
return C == 1
# Chương trình chính
m = int(input("Nhập số m: "))
n = int(input("Nhập số n: "))
print(f"Các số nguyên tố từ {m} đến {n}:")
for k in range(m, n + 1):
if prime(k):
print(k, end=" ")
🎯 Ví dụ chạy chương trình:

Nhập số m: 10
Nhập số n: 50
Các số nguyên tố từ 10 đến 50:
11 13 17 19 23 29 31 37 41 43 47

📌 Câu 2:

Em hãy nêu một công việc/bài toán nào đó mà có thể sử dụng hàm để giải.

💡 GỢI Ý MỘT SỐ BÀI TOÁN:

1️⃣ Tính điểm trung bình của học sinh

Viết hàm tinh_dtb(toan, van, anh) để tính điểm trung bình của 3 môn. Có thể sử dụng hàm này để tính điểm cho nhiều học sinh khác nhau.

2️⃣ Tính tiền điện hàng tháng

Viết hàm tinh_tien_dien(so_kwh) để tính tiền điện theo bậc thang. Có thể dùng cho nhiều hộ gia đình.

3️⃣ Kiểm tra năm nhuận

Viết hàm nam_nhuan(nam) để kiểm tra một năm có phải năm nhuận không. Sử dụng khi cần kiểm tra nhiều năm khác nhau.

4️⃣ Tính diện tích và chu vi

Viết các hàm dien_tich_hinh_tron(r), chu_vi_hinh_tron(r) để tính toán cho nhiều hình tròn khác nhau.

5️⃣ Chuyển đổi đơn vị

Viết hàm doi_sang_usd(vnd) để chuyển đổi tiền tệ từ VND sang USD. Dễ dàng chuyển đổi nhiều giá trị khác nhau.

Slide 11/15

💻 THỰC HÀNH - NHIỆM VỤ 1

🎯 Nhiệm vụ:
Thiết lập hàm f_sum(A, b) có chức năng tính tổng các số của danh sách A theo quy định sau:
  • Nếu b = 0 thì tính tổng các số của danh sách A.
  • Nếu b ≠ 0 thì chỉ tính tổng các số dương của A.

📝 Hướng dẫn:

Chương trình luôn kiểm tra giá trị của đối số b khi tính tổng các số của danh sách A.

✅ ĐÁP ÁN:

def f_sum(A, b):
S = 0
for x in A:
if b == 0:
S = S + x
else:
if x > 0:
S = S + x
return S
# Ví dụ sử dụng
A = [5, -3, 8, -1, 10, 0]
print("Tổng tất cả các số:", f_sum(A, 0)) # 19
print("Tổng các số dương:", f_sum(A, 1)) # 23
🎯 Giải thích:

b = 0: Tổng = 5 + (-3) + 8 + (-1) + 10 + 0 = 19
b ≠ 0: Chỉ tính số dương: 5 + 8 + 10 = 23

Slide 12/15

💻 THỰC HÀNH - NHIỆM VỤ 2

🎯 Nhiệm vụ:
Thiết lập hàm f_dem(msg, sep) có chức năng đếm số các từ của một xâu msg với ký tự tách từ là sep.
📌 Ví dụ:

f_dem("Mùa thu lịch sử", " ") → Trả lại giá trị 4
f_dem("Mùa-thu-lịch-sử", "-") → Trả lại giá trị 4

📝 Hướng dẫn:

Để tách xâu msg thành các từ, chúng ta dùng lệnh split(). Tham số sep chính là tham số của lệnh split().

✅ ĐÁP ÁN:

def f_dem(msg, sep):
xlist = msg.split(sep)
return len(xlist)
# Ví dụ sử dụng
print(f_dem("Mùa thu lịch sử", " ")) # 4
print(f_dem("Mùa-thu-lịch-sử", "-")) # 4
print(f_dem("Python,Java,C++,JavaScript", ",")) # 4
🔍 Giải thích cách hoạt động:

1️⃣ msg.split(sep) tách xâu msg thành danh sách các từ dựa vào ký tự phân cách sep
2️⃣ len(xlist) đếm số phần tử trong danh sách = số từ đã tách được

Slide 13/15

💻 THỰC HÀNH - NHIỆM VỤ 3

🎯 Nhiệm vụ:
Thiết lập hàm merge_str(s1, s2) với s1, s2 là hai xâu cần gộp.

Hàm này sẽ gộp hai xâu s1, s2 theo cách lấy lần lượt từng ký tự của s1, s2 đưa vào xâu kết quả. Nếu có một xâu hết ký tự thì đưa phần còn lại của xâu dài hơn vào xâu kết quả.

📌 Ví dụ:

Nếu s1 = "1111", s2 = "0000" thì xâu kết quả là "10101010"

📝 Hướng dẫn:

Gọi S là xâu kết quả sau khi gộp hai xâu s1s2.

✅ ĐÁP ÁN:

def merge_str(s1, s2):
S = ""
l1 = len(s1)
l2 = len(s2)
l = min(l1, l2)
# Gộp từng ký tự của s1 và s2 đến khi hết xâu ngắn hơn
for i in range(l):
S = S + s1[i] + s2[i]
# Thêm phần còn lại của xâu dài hơn (nếu có)
if l1 < l2:
for i in range(l, l2):
S = S + s2[i]
if l2 < l1:
for i in range(l, l1):
S = S + s1[i]
return S
# Ví dụ sử dụng
print(merge_str("1111", "0000")) # "10101010"
print(merge_str("ABC", "12345")) # "A1B2C345"
print(merge_str("Hello", "***")) # "H*e*l*lo"
🔍 Giải thích thuật toán:

1️⃣ Tìm độ dài xâu ngắn hơn: l = min(l1, l2)
2️⃣ Gộp lần lượt từng ký tự của s1 và s2 cho đến khi hết xâu ngắn hơn
3️⃣ Thêm phần còn lại của xâu dài hơn vào cuối kết quả

Slide 14/15

🎯 LUYỆN TẬP & VẬN DỤNG

📚 PHẦN LUYỆN TẬP

Bài 1:

Thiết lập hàm power(a, b, c) với a, b, c là số nguyên. Hàm trả lại giá trị (a + b)c.

def power(a, b, c):
return (a + b) ** c
# Ví dụ sử dụng
print(power(2, 3, 2)) # (2+3)^2 = 25
print(power(5, 5, 3)) # (5+5)^3 = 1000
print(power(1, 2, 4)) # (1+2)^4 = 81

Bài 2:

Viết chương trình thực hiện: Nhập hai số tự nhiên từ bàn phím, hai số cách nhau bởi dấu cách. Tính và in ra tổng của hai số này.
Yêu cầu: Sử dụng hàm khi viết chương trình.

def tinh_tong(a, b):
"""Hàm tính tổng hai số"""
return a + b
# Chương trình chính
nhap = input("Nhập hai số cách nhau bởi dấu cách: ")
danh_sach = nhap.split(" ")
so1 = int(danh_sach[0])
so2 = int(danh_sach[1])
ket_qua = tinh_tong(so1, so2)
print(f"Tổng của {so1} và {so2} là: {ket_qua}")
🎯 Ví dụ chạy:

Nhập hai số cách nhau bởi dấu cách: 15 20
Tổng của 15 và 20 là: 35

🚀 PHẦN VẬN DỤNG

Bài 1:

Viết chương trình thực hiện: Nhập hai số tự nhiên từ bàn phím, hai số cách nhau bởi dấu phẩy, in ra ước chung lớn nhất (ƯCLN) của hai số.
Yêu cầu: Sử dụng hàm khi viết chương trình.

def ucln(a, b):
"""Tính ƯCLN của hai số bằng thuật toán Euclid"""
while b != 0:
temp = b
b = a % b
a = temp
return a
# Chương trình chính
nhap = input("Nhập hai số cách nhau bởi dấu phẩy: ")
danh_sach = nhap.split(",")
so1 = int(danh_sach[0])
so2 = int(danh_sach[1])
ket_qua = ucln(so1, so2)
print(f"ƯCLN của {so1} và {so2} là: {ket_qua}")
🎯 Ví dụ chạy:

Nhập hai số cách nhau bởi dấu phẩy: 48,18
ƯCLN của 48 và 18 là: 6

Bài 2:

Thiết lập hàm change() có hai tham số là xâu ho_ten và số c. Hàm sẽ trả lại xâu ký tự ho_ten là chữ in hoa nếu c = 0. Nếu tham số c ≠ 0 thì hàm trả lại xâu ho_ten là chữ in thường.
Gợi ý: Sử dụng các phương thức s.upper()s.lower() để chuyển đổi các ký tự của xâu s sang chữ in hoa và in thường.

def change(ho_ten, c):
"""
Chuyển đổi xâu ho_ten:
- c = 0: Chuyển sang chữ IN HOA
- c ≠ 0: Chuyển sang chữ in thường
"""
if c == 0:
return ho_ten.upper()
else:
return ho_ten.lower()
# Ví dụ sử dụng
ten = "Nguyễn Văn An"
print(change(ten, 0)) # NGUYỄN VĂN AN
print(change(ten, 1)) # nguyễn văn an
print(change("PYTHON Programming", 0)) # PYTHON PROGRAMMING
print(change("PYTHON Programming", 5)) # python programming
Slide 15/15

🎉 TỔNG KẾT BÀI HỌC

🎓

KIẾN THỨC TRỌNG TÂM

📌 1. THAM SỐ VÀ ĐỐI SỐ

Tham số (Parameter): Biến trong khai báo hàm

Đối số (Argument): Giá trị khi gọi hàm

✅ Số lượng đối số phải bằng số lượng tham s���

✅ Đối số phải có giá trị khi gọi hàm

📌 2. SỬ DỤNG CHƯƠNG TRÌNH CON

✅ Phân chia bài toán lớn thành bài toán nhỏ

✅ Code rõ ràng, dễ hiểu, dễ bảo trì

✅ Tái sử dụng code hiệu quả

✅ Phát huy tinh thần làm việc nhóm

📌 3. CÚ PHÁP QUAN TRỌNG

# Định nghĩa hàm với tham số
def ten_ham(tham_so_1, tham_so_2):
# Xử lý
return ket_qua
# Gọi hàm với đối số
ten_ham(doi_so_1, doi_so_2)

🎉 HOÀN THÀNH BÀI HỌC!

✨ Chúc các em học tốt và thực hành nhiều! ✨
📚 Hãy thử viết các hàm với nhiều tham số khác nhau!
💪 Áp dụng chương trình con để giải bài toán phức tạp!

Lên đầu trang