Chọn đến phần học sinh cần nhanh chóng thông qua mục lục bằng cách click đến phần đó
Câu hỏi mở đầu trang 131
Câu hỏi mở đầu
Đề bài: 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).
>>> def f_sum(a,b,c): # a, b, c là tham số
return a+b+c
>>> x,y = 5,3
>>> f_sum(10,x,y) # 10, x, y là đối số
18
Lời giải:
Sự khác nhau giữa tham số và đối số:
| Tiêu chí | Tham số (parameter) | Đối số (argument) |
|---|---|---|
| Vị trí xuất hiện | Trong định nghĩa hàm (sau def <tên hàm>). |
Trong lời gọi hàm. |
| Vai trò | Được dùng như biến trong định nghĩa hàm. | Là giá trị cụ thể được truyền vào hàm khi gọi. |
| Ví dụ trên | a, b, c trong def f_sum(a,b,c). |
10, x, y trong f_sum(10,x,y). |
1. Tham số và đối số của hàm
Hoạt động 1 trang 131
Đề bài: 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. Thảo luận để giải thích kết quả.
1 >>> def f(a,b,c):
2 return a+b+c
3 >>> f(1,2,3)
4 6
5 >>> x,y,z = 10,20,5
6 >>> f(x,y,z)
7 35
8 >>> f(a,b,c)
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
13 >>>
Lời giải:
Giải thích từng dòng:
- Dòng 1 – 2: Định nghĩa hàm
f()có $3$ tham số là $a$, $b$, $c$. Hàm trả lại giá trị $a + b + c$. - Dòng 3 – 4: Gọi
f(1,2,3)với $3$ giá trị cụ thể $1, 2, 3$. Đối số là $3$ số cụ thể → kết quả $1 + 2 + 3 = 6$. - Dòng 5 – 7: Gán $x = 10$, $y = 20$, $z = 5$. Gọi
f(x,y,z)với $3$ biến đã có giá trị. Đối số là giá trị của các biến → kết quả $10 + 20 + 5 = 35$. - Dòng 8 – 12: Gọi
f(a,b,c)nhưng $a$, $b$, $c$ chưa được gán giá trị (chưa định nghĩa) → báo lỗiNameError: name 'a' is not defined.
→ Kết luận: Khi gọi hàm, các đối số phải là giá trị cụ thể hoặc biến đã có giá trị.
Câu hỏi củng cố mục 1 trang 132
Đề bài:
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?
Lời giải:
→ Không được.
Giải thích: Theo SGK trang 132: “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”. Nếu khai báo $1$ tham số thì khi gọi hàm bắt buộc phải truyền đúng $1$ đối số.
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 + 2y$. Lời gọi hàm f(10,a) có lỗi hay không?
Lời giải:
→ Còn tuỳ thuộc vào biến $a$:
- Nếu biến $a$ đã được định nghĩa và có giá trị → lời gọi
f(10,a)không lỗi, hàm trả lại giá trị $10 + 2a$. - Nếu biến $a$ chưa được định nghĩa → lời gọi báo lỗi
NameError: name 'a' is not defined(giống dòng 12 ở Hoạt động 1).
Chú ý: Số đối số ($2$) khớp với số tham số ($2$) nên không lỗi về số lượng. Lỗi (nếu có) là do đối số chưa có giá trị.
2. Cách sử dụng chương trình con
Hoạt động 2 trang 132
Đề bài: Bài toán đưa ra là viết chương trình chí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. Trong phần thực hành của Bài 26 em đã biết hàm prime(n) kiểm tra số $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?
Lời giải:
Ý tưởng: Việc kiểm tra một số có là số nguyên tố được lặp lại nhiều lần (từ $1$ đến $n$), nên nên dùng hàm prime() đã có để chương trình rõ ràng, dễ hiểu hơn.
Chương trình gồm $2$ phần:
- Phần 1: Định nghĩa hàm
prime(n)(đã có ở Bài 26). - Phần 2: Chương trình chính — nhập $n$, duyệt $k$ từ $1$ đến $n$, nếu
prime(k)làTruethì in $k$.
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=" ")
Câu hỏi củng cố mục 2 trang 133
Đề bài:
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$.
Lời giải:
Ý tưởng: Tương tự ví dụ ở Hoạt động 2, nhưng vòng for duyệt từ $m$ đến $n$ thay vì từ $1$ đến $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
m = int(input("Nhập m: "))
n = int(input("Nhập n: "))
for k in range(m, n+1):
if prime(k):
print(k, end=" ")
Ví dụ khi chạy (nhập $m = 5$, $n = 20$):
Nhập m: 5
Nhập n: 20
5 7 11 13 17 19
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.
Lời giải:
Một số bài toán/công việc nên sử dụng hàm:
- Tính giai thừa của một số tự nhiên.
- Tính ƯCLN, BCNN của hai số.
- Kiểm tra số chính phương.
- Tính chu vi, diện tích của hình tròn, hình vuông, hình tam giác.
- Đếm số lần xuất hiện của một kí tự trong xâu.
- Đảo ngược một xâu kí tự.
Quy tắc chung: Nếu một công việc cần lặp đi lặp lại nhiều lần ở các vị trí khác nhau trong chương trình thì nên tách thành hàm.
Thực hành trang 134 – 135
Nhiệm vụ 1 trang 134
Đề bài: 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 tất cả các số của danh sách $A$.
- Nếu $b$ khác $0$ thì chỉ tính tổng các số dương của $A$.
Hướng dẫn thực hành:
Ý tưởng: Duyệt từng phần tử của danh sách $A$. Trong mỗi bước duyệt, kiểm tra giá trị của đối số $b$ để quyết định cộng hay không.
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ụ kiểm tra:
>>> A = [1, -2, 3, -4, 5]
>>> f_sum(A, 0) # Tính tổng tất cả
3
>>> f_sum(A, 1) # Chỉ tính tổng số dương
9
Kiểm tra: $1 + (-2) + 3 + (-4) + 5 = 3$ ✓ và $1 + 3 + 5 = 9$ ✓
Nhiệm vụ 2 trang 134
Đề bài: 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 4
f_dem("Mùa thu lịch sử", "-") # Trả lại 1
Hướng dẫn thực hành:
Ý tưởng: Dùng lệnh split(sep) để tách xâu msg theo kí tự sep thành danh sách, sau đó dùng len() đếm số phần tử của danh sách.
def f_dem(msg, sep):
xlist = msg.split(sep)
return len(xlist)
Giải thích:
- Với
f_dem("Mùa thu lịch sử", " "): tách theo dấu cách →['Mùa', 'thu', 'lịch', 'sử']→ $4$ từ. - Với
f_dem("Mùa thu lịch sử", "-"): không có dấu"-"→ cả xâu là $1$ phần tử → $1$ từ.
Nhiệm vụ 3 trang 134 – 135
Đề bài: Thiết lập hàm merge_str(s1, s2) với $s_1$, $s_2$ là hai xâu cần gộp.
Hàm sẽ gộp hai xâu $s_1$, $s_2$ theo cách: lấy lần lượt từng kí tự của $s_1$, $s_2$ đư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 $s_1 = $ "1111", $s_2 = $ "0000" thì xâu kết quả là "10101010".
Hướng dẫn thực hành:
Ý tưởng:
- Gọi $l_1$, $l_2$ là độ dài hai xâu, $l$ là giá trị nhỏ hơn.
- Bước 1: Duyệt $i$ từ $0$ đến $l – 1$, mỗi bước nối $s_1[i]$ và $s_2[i]$ vào $S$.
- Bước 2: Nếu $s_1$ ngắn hơn → nối phần còn lại của $s_2$ vào $S$. Ngược lại thì nối phần còn lại của $s_1$.
def merge_str(s1, s2):
S = ""
l1 = len(s1)
l2 = len(s2)
l = min(l1, l2)
for i in range(l):
S = S + s1[i] + s2[i]
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ụ kiểm tra:
>>> merge_str("1111", "0000")
'10101010'
>>> merge_str("abc", "12345")
'a1b2c345'
Chú ý: Lệnh
min(l1, l2)trả về giá trị nhỏ hơn trong hai số $l_1$, $l_2$.
Luyện tập trang 135
Luyện tập 1 trang 135
Đề bài: 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$.
Lời giải:
Ý tưởng: Dùng phép luỹ thừa ** đã học trong Bài 17.
def power(a, b, c):
return (a+b)**c
Ví dụ kiểm tra:
>>> power(2, 3, 4)
625
>>> power(1, 1, 10)
1024
Kiểm tra: $(2 + 3)^4 = 5^4 = 625$ ✓ và $(1 + 1)^{10} = 2^{10} = 1024$ ✓
Luyện tập 2 trang 135
Đề bài: 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 các số này. Yêu cầu sử dụng hàm khi viết chương trình.
Lời giải:
Ý tưởng:
- Viết hàm
tinh_tong(a, b)trả lại $a + b$. - Trong chương trình chính: nhập xâu, tách bằng
split(), chuyển sang số nguyên rồi gọi hàm.
def tinh_tong(a, b):
return a + b
# Chương trình chính
s = input("Nhập hai số tự nhiên cách nhau bởi dấu cách: ")
sline = s.split()
a = int(sline[0])
b = int(sline[1])
print("Tổng hai số là:", tinh_tong(a, b))
Ví dụ khi chạy (nhập 15 25):
Nhập hai số tự nhiên cách nhau bởi dấu cách: 15 25
Tổng hai số là: 40
Vận dụng trang 135
Vận dụng 1 trang 135
Đề bài: 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 ƯCLN của hai số. Yêu cầu sử dụng hàm khi viết chương trình.
Lời giải:
Ý tưởng:
- Viết hàm
ucln(a, b)tìm ƯCLN bằng thuật toán Euclid: lặp lại $b = a \% b$, $a = b$ cho đến khi $b = 0$. - Chương trình chính: nhập xâu, tách bằng
split(","), chuyển sang số nguyên rồi gọi hàm.
def ucln(a, b):
while b != 0:
r = a % b
a = b
b = r
return a
# Chương trình chính
s = input("Nhập hai số tự nhiên cách nhau bởi dấu phẩy: ")
sline = s.split(",")
a = int(sline[0])
b = int(sline[1])
print("ƯCLN của hai số là:", ucln(a, b))
Ví dụ khi chạy (nhập 24,36):
Nhập hai số tự nhiên cách nhau bởi dấu phẩy: 24,36
ƯCLN của hai số là: 12
Kiểm tra: $\text{ƯCLN}(24, 36) = 12$. ✓
Chú ý: Vì hai số cách nhau dấu phẩy (không phải dấu cách), nên dùng
split(",")chứ không phảisplit().
Vận dụng 2 trang 135
Đề bài: 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$ khá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() và s.lower() để chuyển đổi các kí tự của xâu $s$ sang chữ in hoa và in thường.
Lời giải:
Ý tưởng:
- Nếu $c == 0$ → trả về
ho_ten.upper()(chữ in hoa). - Ngược lại → trả về
ho_ten.lower()(chữ in thường).
def change(ho_ten, c):
if c == 0:
return ho_ten.upper()
else:
return ho_ten.lower()
Ví dụ kiểm tra:
>>> change("Nguyễn Văn An", 0)
'NGUYỄN VĂN AN'
>>> change("Nguyễn Văn An", 1)
'nguyễn văn an'
>>> change("Trần Thị Bình", 5)
'trần thị bình'
Chú ý: Phương thức
.upper()chuyển xâu sang chữ in hoa,.lower()chuyển sang chữ in thường. Hai phương thức này không làm thay đổi xâu gốc mà trả về xâu mới.

Thầy Phạm Thành Danh
(Người kiểm duyệt, ra đề)
Chức vụ: Trưởng ban biên soạn môn Tin Học THPT
Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1
Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa
