Giải Tin Học 10 trang 132
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 132–133
Nguon: Tin Hoc 10 - Ket Noi Tri Thuc Voi Cuoc Song (trang 132 – 133)
🔍 Kiến thức cần nhớ
Bài 27 giúp em phân biệt hai khái niệm quan trọng khi làm việc với hàm trong Python và biết cách dùng chương trình con (hàm) để chương trình gọn gàng hơn.
Tham số (parameter):
- Là các biến được khai báo trong dấu ngoặc khi định nghĩa hàm.
- Trong định nghĩa hàm, tham số được coi như biến.
- Ví dụ:
def f(a, b, c):thì a, b, c là tham số.
Đối số (argument):
- Là giá trị cụ thể được truyền vào khi gọi hàm.
- Ví dụ:
f(1, 2, 3)thì 1, 2, 3 là đối số.
Quy tắc truyền dữ liệu:
- Khi gọi hàm, các tham số sẽ nhận giá trị thông qua đối số.
- Số lượng đối số phải bằng số lượng tham số trong khai báo hàm.
- Đối số có thể là số cụ thể (như
f(1,2,3)) hoặc biến đã được gán giá trị (nhưf(x,y,z)). - Nếu truyền vào biến chưa có giá trị, chương trình sẽ báo lỗi
NameError.
💡 Mẹo nhớ: Tham số gắn với sự khai báo (định nghĩa hàm). Đối số gắn với lời gọi hàm. "Khai báo là tham, gọi vào là đối."
Chương trình con (hàm):
- Khi một công việc được lặp đi lặp lại nhiều lần, nên viết thành hàm để gọi lại.
- Giúp chương trình có cấu trúc rõ ràng, dễ đọc, dễ hiểu và dễ bảo trì.
⚙️ Bài tập
Câu 1
Đề bài: 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?
Cách 1 — Dựa vào quy tắc truyền dữ liệu
Theo quy tắc, số lượng đối số khi gọi hàm phải bằng số lượng tham số đã khai báo trong định nghĩa hàm.
Hàm khai báo có một tham số, ví dụ:
def f(a):
return a + 1
- Nếu gọi
f(5)→ đúng (một đối số ứng với một tham số), kết quả 6. - Nếu gọi
f(5, 3)→ báo lỗi, vì truyền hai đối số cho hàm chỉ có một tham số.
Python sẽ thông báo lỗi dạng:
TypeError: f() takes 1 positional argument but 2 were given
Kết luận: Không thể. Hàm khai báo một tham số thì khi gọi chỉ được truyền đúng một đối số.
Cách 2 — Hình dung "ổ cắm và phích cắm"
Mỗi tham số là một "ổ cắm", mỗi đối số là một "phích cắm". Hàm một tham số chỉ có một ổ cắm, nên không thể nhận hai phích cắm cùng lúc. Thừa một phích cắm → lỗi.
Kết luận: Không được.
⚠️ Lưu ý thi: Đây là lỗiTypeErrorrất hay bị nhầm vớiNameError. Hãy phân biệt: số lượng đối số sai →TypeError; truyền biến chưa có giá trị →NameError.
Câu 2
Đề bài: Giả sử hàm f có hai tham số x, y khi khai báo, hàm sẽ trả lại giá trị x + 2y. Lời gọi hàm f(10, a) có lỗi hay không?
Cách 1 — Phân tích lời gọi hàm
Hàm được khai báo:
def f(x, y):
return x + 2 * y
Lời gọi f(10, a):
- Số lượng đối số là 2 (gồm 10 và a), bằng số tham số 2 → đúng về số lượng.
- Đối số thứ nhất là 10 → giá trị cụ thể, hợp lệ.
- Đối số thứ hai là biến
a→ chỉ hợp lệ nếu biến a đã được gán giá trị từ trước.
Xét hai trường hợp:
Trường hợp 1: Biến a đã có giá trị (ví dụ trước đó có lệnh a = 5).
- Lời gọi
f(10, 5)được thực hiện, kết quả = 10 + 2×5 = 20. - Không có lỗi.
Trường hợp 2: Biến a chưa được gán giá trị.
- Python báo lỗi:
NameError: name 'a' is not defined
Kết luận: Lời gọi f(10, a) có thể có lỗi hoặc không, tùy thuộc vào việc biến a đã được gán giá trị hay chưa:
- Nếu a đã có giá trị → không lỗi.
- Nếu a chưa có giá trị → báo lỗi
NameError.
Cách 2 — So sánh trực tiếp với ví dụ trong sách
Tương tự dòng 6 và dòng 8 trong ví dụ trang 131:
- Dòng 6:
f(x, y, z)chạy đúng vì x, y, z đã được gán ở dòng 5. - Dòng 8:
f(a, b, c)báo lỗi vì a, b, c chưa có giá trị.
Lời gọi f(10, a) rơi vào đúng tình huống đó: kết quả phụ thuộc hoàn toàn vào việc a đã được định nghĩa hay chưa.
⚠️ Lưu ý thi: Câu hỏi dạng này muốn em hiểu rằng "tên biến" trong lời gọi hàm chỉ dùng được khi biến đó đã tồn tại và có giá trị trong chương trình.
Hoạt động 2
Đề bài: Bài toán: viết chương trình nhập số tự nhiên n từ bàn phím và in ra tất cả các số nguyên tố nhỏ hơn hoặc bằng n. Đã biết hàm prime(n) kiểm tra n có là số nguyên tố. Em sẽ viết chương trình giải bài toán này như thế nào?
Cách 1 — Dùng hàm prime(n) làm chương trình con
Vì việc kiểm tra một số có phải số nguyên tố sẽ được lặp lại nhiều lần (kiểm tra lần lượt từng số từ 1 đến n), nên ta tách phần kiểm tra ra thành hàm prime(). Chương trình chính chỉ cần gọi lại hàm này.
Trước hết, hoàn thiện hàm prime(n) (như trang 132, cần bổ sung phần trả về kết quả):
def prime(n):
C = 0
k = 1
while k < n:
if n % k == 0:
C = C + 1
k = k + 1
if C == 1 and n > 1: # chỉ chia hết cho 1 (trong khoảng 1..n-1) và n > 1
return True
else:
return False
Giải thích hàmprime(n): biến C đếm số ước của n trong khoảng từ 1 đến n-1. Một số nguyên tố chỉ có đúng một ước trong khoảng này là số 1 (vì nó chia hết cho 1 và chính nó). Điều kiệnn > 1để loại trừ số 0 và 1 (không phải số nguyên tố).
Chương trình chính:
n = int(input("Nhập số tự nhiên n: "))
print("Các số nguyên tố nhỏ hơn hoặc bằng", n, "là:")
for i in range(2, n + 1):
if prime(i):
print(i, end=" ")
Khi chạy với n = 20, kết quả in ra:
2 3 5 7 11 13 17 19
Cách 2 — Mô tả ý tưởng tổng quát (không phụ thuộc cách viết hàm)
- Nhập số tự nhiên n từ bàn phím.
- Dùng vòng lặp duyệt lần lượt từng số i từ 2 đến n.
- Với mỗi i, gọi hàm
prime(i)để kiểm tra. - Nếu
prime(i)trả về True thì in i ra màn hình.
Việc dùng hàm con prime() giúp chương trình chính ngắn gọn, mỗi phần làm một việc rõ ràng: hàm lo việc kiểm tra, chương trình chính lo việc duyệt và in.
💡 Mẹo nhớ: Khi thấy một công việc được lặp lại nhiều lần với dữ liệu khác nhau → tách thành hàm. Đây chính là lợi ích lớn nhất của chương trình con.
⚠️ Lưu ý thi: Nhớ duyệt từ 2 (không từ 1), vì số 1 không phải số nguyên tố. Và vòng lặp duyệt đến n nên dùng range(2, n+1) để bao gồm cả số n.
🎯 Ghi nhớ: - Tham số khai báo cùng hàm, đối số truyền vào khi gọi hàm; số lượng hai loại phải bằng nhau. - Truyền sai số lượng đối số →TypeError; truyền biến chưa có giá trị →NameError. - Khi một công việc lặp lại nhiều lần, hãy viết thành chương trình con (hàm) để chương trình rõ ràng, dễ đọc và dễ bảo trì.
