Giải Tin Học 10 trang 128
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 128–131
Bài 26: Hàm trong Python
🔍 Kiến thức cần nhớ
Chương trình con là một đoạn lệnh được gom lại, có tên gọi riêng, dùng để thực hiện một công việc nhất định. Trong Python, các chương trình con này được gọi là hàm (function).
Hai loại hàm:
- Hàm thiết kế sẵn (hàm dựng sẵn): do Python cung cấp, người dùng chỉ việc gọi ra dùng. Ví dụ: print(), int(), float(), str(), len(), input(), type()...
- Hàm tự định nghĩa: do người dùng tự viết để dùng trong chương trình của mình.
Cú pháp gọi hàm:
()
Cú pháp thiết lập (định nghĩa) hàm:
Hàm có trả lại giá trị:
def ():
return
Hàm không trả lại giá trị:
def ():
return # hoặc không cần dòng return
Quy tắc viết hàm:
- Bắt đầu bằng từ khoá def, theo sau là tên hàm (đặt theo quy tắc đặt tên định danh).
- Hàm có thể có hoặc không có tham số, đặt trong cặp ngoặc đơn.
- Sau cặp ngoặc là dấu hai chấm (:), khối lệnh mô tả hàm viết lùi vào, thẳng hàng.
- Lệnh return dùng để trả lại giá trị (nếu có) và kết thúc hàm.
💡 Mẹo nhớ: Cấu trúc một hàm = "def – tên – () – : – khối lệnh – return". Cứ thấy def là biết đang định nghĩa hàm.
⚙️ Bài tập
Hoạt động 1 — Tìm hiểu một số hàm của Python
Đề bài: Quan sát các lệnh trong Bảng và cho biết những câu lệnh này có điểm chung gì. Em có thể kể tên một số hàm trong số các lệnh đã học hay không? Các hàm đó có những đặc điểm chung gì?
Cách 1 — Quan sát hình thức câu lệnh
Điểm chung của các lệnh trong bảng: tất cả đều có dạng một tên lệnh, theo sau là cặp dấu ngoặc đơn mở – đóng ( ). Bên trong cặp ngoặc có thể chứa các tham số (là giá trị, biến hoặc biểu thức), hoặc cũng có thể để trống.
Một số hàm em đã học:
- print(): in dữ liệu ra màn hình.
- int(): chuyển một xâu hoặc số thực thành số nguyên.
- float(): chuyển dữ liệu thành số thực.
- str(): chuyển dữ liệu thành xâu kí tự.
- input(): nhập một xâu kí tự từ bàn phím.
- type(): cho biết kiểu dữ liệu của một đối tượng.
- len(): cho biết độ dài (số phần tử) của một xâu hoặc danh sách.
Đặc điểm chung: đều có tên hàm kèm cặp ngoặc đơn; có thể nhận tham số bên trong ngoặc; thực hiện một công việc cụ thể và phần lớn trả lại một giá trị kết quả.
⚠️ Lưu ý thi: Đừng nhầm print() với một hàm trả lại giá trị. print() chỉ in ra màn hình, nó không trả lại giá trị (trả về None).
Câu hỏi củng cố (trang 129)
Đề bài: Mô tả tham số và giá trị trả lại của mỗi hàm sau: float(), str(), len().
Cách 1 — Phân tích từng hàm
| Hàm | Tham số | Giá trị trả lại |
|---|---|---|
| float(x) | x là số hoặc xâu biểu diễn số | Số thực tương ứng với x. Ví dụ: float("3.5") → 3.5 |
| str(x) | x là một đối tượng bất kì (số, danh sách...) | Xâu kí tự biểu diễn của x. Ví dụ: str(52) → "52" |
| len(s) | s là xâu kí tự, danh sách... | Số nguyên là độ dài (số phần tử) của s. Ví dụ: len("abc") → 3 |
Hoạt động 2 — Cách thiết lập hàm trong Python
Đề bài: Quan sát hai ví dụ để biết cách viết hàm.
Ví dụ 1 — Hàm có trả lại giá trị:
def inc(n):
return n + 1
>>> inc(3)
4
- Tên hàm: inc
- Tham số: số n
- Giá trị trả lại: số n + 1
Ví dụ 2 — Hàm không trả lại giá trị:
def thong_bao(msg):
print("Thông báo:", msg)
return
>>> thong_bao("Hello")
Thông báo: Hello
- Tên hàm: thong_bao
- Tham số: xâu kí tự msg
- Giá trị trả lại: không có
Câu hỏi củng cố (trang 130)
Đề bài: Quan sát các hàm sau, giải thích cách thiết lập và chức năng của mỗi hàm.
a)
def nhap():
n = int(input("Nhập số n: "))
return n
b)
def in_day(n):
for i in range(n):
print(i, end=" ")
Cách 1 — Phân tích cấu trúc và chức năng
a) Hàm nhap():
- Cách thiết lập: định nghĩa bằng def, không có tham số, có lệnh return n.
- Chức năng: yêu cầu người dùng nhập một số, chuyển thành số nguyên và trả lại số đó. Đây là hàm có trả lại giá trị.
b) Hàm in_day(n):
- Cách thiết lập: định nghĩa bằng def, có tham số n, bên trong dùng vòng lặp for, không có return giá trị.
- Chức năng: in ra màn hình các số từ 0 đến n − 1, cách nhau bởi dấu cách. Đây là hàm không trả lại giá trị (chỉ thực hiện việc in).
Thực hành — Nhiệm vụ 1
Đề bài: Viết hàm 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.
Cách 1 — Hàm không trả lại giá trị
def chao():
ten = input("Nhập họ tên của bạn: ")
print("Xin chào,", ten)
# Gọi hàm
chao()
Hàm chao() nhập họ tên vào biến ten rồi in lời chào. Vì chỉ thực hiện việc in, hàm này không cần lệnh return.
Thực hành — Nhiệm vụ 2
Đề bài: Viết hàm prime(n) với tham số là số tự nhiên n và trả lại True nếu n là số nguyên tố, trả lại False nếu n không phải là số nguyên tố.
Cách 1 — Đếm số ước thực sự (theo hướng dẫn SGK)
Ý tưởng: số nguyên tố là số tự nhiên lớn hơn 1, không có ước nào ngoài 1 và chính nó. Dùng biến C đếm số ước thực sự của n (các ước trong khoảng từ 1 đến n − 1). Khi đó n là số nguyên tố khi và chỉ khi C = 1.
def prime(n):
c = 0 # đếm số ước thực sự của n
k = 1
while k < n:
if n % k == 0:
c = c + 1
k = k + 1
if c == 1:
return True
else:
return False
Cách 2 — Kiểm tra ước đến căn bậc hai (nhanh hơn)
Một số n chỉ cần kiểm tra ước từ 2 đến √n. Nếu không tìm thấy ước nào thì n là số nguyên tố.
def prime(n):
if n < 2:
return False
c = 2
while c * c <= n:
if n % c == 0:
return False
c = c + 1
return True
💡 Mẹo nhớ: Để kiểm tra số nguyên tố nhanh, chỉ cần quét ước đến √n, vì nếu n = a × b thì luôn có một thừa số ≤ √n.
⚠️ Lưu ý thi: Nhớ xử lý trường hợp n < 2 (gồm 0 và 1) → không phải số nguyên tố. Đây là lỗi rất hay bị bỏ sót.
⚙️ Luyện tập
Câu 1
Đề bài: 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.)
Cách 1 — Duyệt và dùng lại hàm prime()
def prime(n):
if n < 2:
return False
c = 2
while c * c <= n:
if n % c == 0:
return False
c = c + 1
return True
def uoc_nguyen_to(n):
k = 2
while k <= n:
if n % k == 0 and prime(k):
print(k, end=" ")
k = k + 1
# Ví dụ
uoc_nguyen_to(60) # Kết quả: 2 3 5
Với mỗi k từ 2 đến n, nếu k là ước của n (n % k == 0) và k là số nguyên tố thì in k ra. Việc gọi lại hàm prime() giúp chương trình ngắn gọn, dễ đọc.
💡 Mẹo nhớ: "Ước nguyên tố" phải đồng thời thoả hai điều kiện: vừa là ước của n, vừa là số nguyên tố.
Câu 2
Đề bài: Viết hàm count() đếm số các chữ số có trong xâu s. Ví dụ count("a1b1c1") = 3.
Cách 1 — Dùng phương thức isdigit()
def count(s):
c = 0
for ch in s:
if ch.isdigit():
c = c + 1
return c
# Ví dụ
print(count("a1b1c1")) # Kết quả: 3
Duyệt từng kí tự ch trong xâu s; nếu ch là chữ số (ch.isdigit() trả về True) thì tăng biến đếm c lên 1.
Cách 2 — So sánh trực tiếp với khoảng "0"–"9"
def count(s):
c = 0
for ch in s:
if "0" <= ch <= "9":
c = c + 1
return c
Cách này không dùng phương thức có sẵn mà so sánh trực tiếp kí tự với dải "0" đến "9".
⚙️ Vận dụng
Câu 1
Đề bài: Trong khi viết hàm có thể có nhiều lệnh return. Quan sát hàm sau và giải thích ý nghĩa của những lệnh return. Hàm này có điểm gì khác so với hàm prime() đã mô tả trong phần thực hành?
def prime(n):
if n < 2:
return False
c = 2
while c < n:
if n % c == 0:
return False
c = c + 1
return True
Cách 1 — Phân tích ý nghĩa từng lệnh return
Hàm này có ba lệnh return, ý nghĩa lần lượt:
- return False (dòng đầu): khi n < 2 (tức n = 0 hoặc 1), n không phải số nguyên tố nên kết thúc hàm và trả lại False ngay.
- return False (trong vòng while): khi tìm thấy một ước c của n (n % c == 0), n có ước khác 1 và chính nó nên chắc chắn không phải số nguyên tố. Hàm trả lại False và dừng ngay, không kiểm tra tiếp.
- return True (cuối hàm): nếu chạy hết vòng lặp mà không tìm thấy ước nào, nghĩa là n là số nguyên tố, hàm trả lại True.
Điểm khác so với hàm prime() trong phần thực hành:
- Hàm thực hành phải đếm toàn bộ các ước (chạy hết vòng lặp từ 1 đến n − 1) rồi mới quyết định ở cuối dựa vào biến đếm C.
- Hàm này dùng nhiều return để thoát sớm: chỉ cần phát hiện một ước là trả về False ngay, không cần duyệt hết. Nhờ vậy chương trình chạy nhanh hơn, hiệu quả hơn, đặc biệt với số lớn.
⚠️ Lưu ý thi: Lệnh return không chỉ trả lại giá trị mà còn kết thúc hàm ngay lập tức. Đây là kỹ thuật "thoát sớm" rất hay dùng để tối ưu chương trình.
Câu 2
Đề bài: 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:
- Tổng số các kí tự là chữ số của xâu.
- 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.
Cách 1 — Hai hàm dùng phương thức có sẵn
def dem_chu_so(s):
c = 0
for ch in s:
if ch.isdigit():
c = c + 1
return c
def dem_chu_cai(s):
c = 0
for ch in s:
if ch.isalpha():
c = c + 1
return c
# Chương trình chính
s = input("Nhập một xâu kí tự: ")
print("Tổng số kí tự là chữ số:", dem_chu_so(s))
print("Tổng số kí tự là chữ cái tiếng Anh:", dem_chu_cai(s))
Cách 2 — So sánh trực tiếp khoảng kí tự
def dem_chu_so(s):
c = 0
for ch in s:
if "0" <= ch <= "9":
c = c + 1
return c
def dem_chu_cai(s):
c = 0
for ch in s:
if ("a" <= ch <= "z") or ("A" <= ch <= "Z"):
c = c + 1
return c
s = input("Nhập một xâu kí tự: ")
print("Tổng số kí tự là chữ số:", dem_chu_so(s))
print("Tổng số kí tự là chữ cái tiếng Anh:", dem_chu_cai(s))
⚠️ Lưu ý thi: isalpha() chỉ đếm chữ cái nói chung. Nếu đề yêu cầu chữ cái tiếng Anh (a–z, A–Z) cho chặt chẽ, nên dùng cách so sánh khoảng kí tự như Cách 2 để loại các chữ có dấu tiếng Việt.
🎯 Ghi nhớ: - Hàm là chương trình con, định nghĩa bằng từ khoá def, có thể có hoặc không có tham số và giá trị trả lại. - Lệnh return vừa trả lại giá trị, vừa kết thúc hàm ngay lập tức — tận dụng điều này để "thoát sớm" giúp chương trình nhanh hơn. - Hàm không trả lại giá trị (chỉ in, thông báo...) có thể dùng return trống hoặc bỏ hẳn return. - Khi cần lặp lại một công việc nhiều lần ở nhiều chỗ, hãy viết thành hàm và gọi lại để chương trình gọn, dễ đọc, dễ sửa.
