Giải Tin Học 10 trang 138
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 138–139
Nguon: Tin Hoc 10 - Ket Noi Tri Thuc Voi Cuoc Song (trang 138 – 139)
🔍 Kiến thức cần nhớ
Phạm vi của biến trong Python:
- Mọi biến khai báo bên trong hàm đều có tính địa phương (cục bộ) — chỉ có hiệu lực bên trong hàm, không ảnh hưởng ra ngoài.
- Biến khai báo bên ngoài hàm:
- Có thể được truy cập để đọc giá trị bên trong hàm (Ví dụ 2).
- Nhưng không thể bị thay đổi từ bên trong hàm như một biến thông thường (Ví dụ 1).
- Muốn biến bên ngoài vẫn có tác dụng (thay đổi được) bên trong hàm thì phải khai báo lại bằng từ khóa global.
💡 Mẹo nhớ: Biến trong hàm giống "phòng riêng" — đặt tên trùng với bên ngoài cũng không sao, vì chúng là hai biến khác nhau. Chỉ khi dùng global thì hàm mới "với tay ra ngoài" sửa được biến chung.
⚙️ Bài tập
Câu 1 (trang 137)
Đề bài: Giả sử có các lệnh sau:
>>> a,b = 1,2
>>> def f(a,b):
a = a + b
b = b*a
return a + b
Giá trị của a, b bằng bao nhiêu sau khi thực hiện lệnh sau?
a) f(1, 2)
b) f(10, 20)
Cách 1 — Phân tích phạm vi biến
Điểm mấu chốt: a, b trong hàm f là biến cục bộ, hoàn toàn tách biệt với biến a, b = 1, 2 khai báo bên ngoài. Khi gọi hàm, các phép gán chỉ làm thay đổi biến cục bộ, không động chạm tới biến bên ngoài.
a) Thực hiện f(1, 2):
Bên trong hàm (a = 1, b = 2):
- a = a + b = 1 + 2 = 3
- b = b × a = 2 × 3 = 6
- return a + b = 3 + 6 = 9 (hàm trả lại 9)
→ Hai biến a, b bên ngoài vẫn giữ nguyên: a = 1, b = 2
b) Thực hiện f(10, 20):
Bên trong hàm (a = 10, b = 20):
- a = a + b = 10 + 20 = 30
- b = b × a = 20 × 30 = 600
- return a + b = 30 + 600 = 630 (hàm trả lại 630)
→ Hai biến a, b bên ngoài vẫn giữ nguyên: a = 1, b = 2
Cách 2 — Suy luận nhanh
Vì hàm f không dùng từ khóa global, nên dù tham số được tính toán thế nào, biến a, b bên ngoài không bao giờ bị thay đổi.
→ Kết luận ngay: cả hai trường hợp a = 1, b = 2.
Giá trị 9 và 630 chỉ là kết quả trả về của hàm, không phải giá trị của a, b bên ngoài.
⚠️ Lưu ý thi: Đề hỏi "giá trị của a, b" (biến bên ngoài) chứ không hỏi "hàm trả lại gì". Nhiều bạn nhầm, trả lời 9 và 630 là sai. Phải đọc kỹ đối tượng được hỏi.
Câu 2 (trang 137)
Đề bài: Ta có thể khai báo một biến bên trong hàm trùng tên với biến đã khai báo trước đó bên ngoài hàm không?
Cách 1 — Trả lời theo lý thuyết
Có thể. Biến khai báo bên trong hàm là biến cục bộ, nó hoàn toàn độc lập với biến cùng tên bên ngoài. Hai biến này chỉ trùng tên gọi, nhưng được lưu ở hai vùng nhớ khác nhau:
- Biến cục bộ chỉ tồn tại và có hiệu lực trong thời gian hàm chạy.
- Biến bên ngoài không bị ảnh hưởng.
Cách 2 — Minh họa bằng ví dụ
>>> x = 5
>>> def g():
x = 100 # biến cục bộ x, trùng tên với x bên ngoài
return x
>>> g()
100
>>> x
5 # x bên ngoài vẫn là 5
Kết quả cho thấy việc đặt trùng tên hoàn toàn hợp lệ và không gây xung đột.
💡 Mẹo nhớ: Trùng tên = "che khuất tạm thời". Trong hàm, tên đó chỉ tới biến cục bộ; ra khỏi hàm, tên đó lại tới biến bên ngoài.
Câu 3 (trang 138)
Đề bài: Giả sử hàm f(x,y) được định nghĩa như sau:
>>> def f(x,y):
a = 2*(x + y)
print(a + n)
Kết quả nào được in ra khi thực hiện các lệnh sau?
n = 10
f(1,2)
Cách 1 — Tính từng bước
Khi gọi f(1, 2), ta có x = 1, y = 2:
- a = 2 × (x + y) = 2 × (1 + 2) = 2 × 3 = 6
- Biến n không khai báo trong hàm → hàm truy cập biến n bên ngoài (n = 10), đây là phép đọc giá trị (giống Ví dụ 2).
- print(a + n) = print(6 + 10) = print(16)
Kết quả in ra màn hình: 16
Cách 2 — Gộp biểu thức
Thay trực tiếp: 2 × (1 + 2) + 10 = 6 + 10 = 16.
⚠️ Lưu ý thi: Hàm chỉ đọc giá trị n nên không cần global. Nếu trong hàm có lệnh gán n (ví dụ n = n + 1) mà n chưa khai báo cục bộ thì sẽ báo lỗi. Phân biệt rõ "đọc" (được phép) và "gán" (cần thận trọng).
⚙️ Thực hành — Phạm vi của biến
Nhiệm vụ 1 (trang 138)
Đề bài: Viết hàm với đầu vào là danh sách A chứa các số và số thực x. Hàm trả lại một danh sách kết quả B từ danh sách A bằng cách chỉ giữ lại các phần tử lớn hơn hoặc bằng x.
Cách 1 — Theo hướng dẫn của SGK (dùng vòng lặp)
Biến B kiểu danh sách được định nghĩa bên trong hàm (đây chính là minh họa cho biến cục bộ), khởi tạo rỗng rồi bổ sung dần các phần tử thỏa mãn điều kiện ≥ x.
def Select(A, x):
B = [] # biến cục bộ, danh sách rỗng ban đầu
for k in range(len(A)): # duyệt theo chỉ số từng phần tử của A
if A[k] >= x: # nếu phần tử lớn hơn hoặc bằng x
B.append(A[k]) # thêm phần tử đó vào B
return B # trả lại danh sách kết quả
Chạy thử:
>>> A = [3, 7, 1, 9, 4, 10]
>>> Select(A, 5)
[7, 9, 10]
Giải thích: chỉ các phần tử 7, 9, 10 thỏa mãn ≥ 5 nên được giữ lại trong B.
Cách 2 — Dùng list comprehension (ngắn gọn, sáng tạo)
Python cho phép tạo danh sách trực tiếp bằng một dòng:
def Select(A, x):
return [e for e in A if e >= x]
Cách này cho kết quả y hệt Cách 1 nhưng ngắn hơn, được giới sử dụng Python rất ưa chuộng.
>>> Select([3, 7, 1, 9, 4, 10], 5)
[7, 9, 10]
💡 Mẹo nhớ: Mẫu "duyệt – kiểm tra – thêm vào danh sách mới" (lọc phần tử) xuất hiện rất nhiều: lọc số chẵn, lọc số dương, lọc theo điều kiện... Hãy thuộc khung này.
⚠️ Lưu ý thi: Biến B phải khởi tạo B = [] bên trong hàm trước vòng lặp. Quên dòng này sẽ báo lỗi "name 'B' is not defined".
Nhiệm vụ 2 (trang 138 – 139)
Đề bài: Viết hàm với đầu vào là xâu kí tự Str và số c, đầu ra là danh sách các từ được tách ra từ xâu Str nhưng đã được chuyển thành chữ in hoa hoặc chữ in thường, hoặc chỉ chuyển kí tự đầu các từ thành chữ in hoa tùy thuộc vào tham số đầu vào c.
⚠️ Lưu ý: Phần đề Nhiệm vụ 2 ở trang 138 mới chỉ nêu mở đầu ("...tùy thuộc vào tham số đầu vào c như sau:"), còn bảng quy ước giá trị của c và phần hướng dẫn nằm ở trang 139 (chưa có trong ảnh). Dưới đây mình giải theo quy ước thông dụng nhất của SGK: - c = 0: chuyển tất cả thành chữ in thường - c = 1: chuyển tất cả thành chữ in hoa - c = 2: chỉ viết hoa chữ cái đầu mỗi từ
Cách giải — Tách từ rồi xử lý theo c
def ChuanHoa(Str, c):
words = Str.split() # tách xâu thành danh sách các từ
B = [] # danh sách kết quả (biến cục bộ)
for w in words:
if c == 0:
B.append(w.lower()) # in thường
elif c == 1:
B.append(w.upper()) # in hoa
elif c == 2:
B.append(w.capitalize()) # viết hoa chữ cái đầu
return B
Chạy thử:
>>> ChuanHoa("Hoc Tin Hoc", 0)
['hoc', 'tin', 'hoc']
>>> ChuanHoa("Hoc Tin Hoc", 1)
['HOC', 'TIN', 'HOC']
>>> ChuanHoa("hoc tin hoc", 2)
['Hoc', 'Tin', 'Hoc']
Các phương thức xử lý xâu sử dụng:
split()— tách xâu thành danh sách các từ (theo dấu cách).lower()— đổi sang chữ thường.upper()— đổi sang chữ hoa.capitalize()— viết hoa kí tự đầu, còn lại in thường.
💡 Mẹo nhớ: Bộ ba phương thức xâu hay dùng:upper(UP = lên = hoa),lower(LOW = thấp = thường),capitalize(Capital = thủ đô/chữ đầu).
🎯 Ghi nhớ: - Biến trong hàm là cục bộ, không ảnh hưởng ra ngoài và có thể trùng tên với biến ngoài. - Hàm được phép đọc giá trị biến ngoài, nhưng muốn thay đổi thì phải dùng global. - Mẫu xử lý danh sách "khởi tạo rỗng → duyệt → thêm phần tử thỏa điều kiện" là khung giải rất nhiều bài lọc/biến đổi dữ liệu. - Bạn nên gửi thêm ảnh trang 139 để mình hoàn thiện chính xác bảng quy ước và phần còn lại của Nhiệm vụ 2 nhé.