BÀI 28: PHẠM VI CỦA BIẾN




CHỦ ĐỀ 5 – BÀI 28 – TIN HỌC 10

Phạm Vi Của Biến

Biến cục bộ, biến toàn cục và từ khóa global

Sau Bài Này Em Sẽ

  • Hiểu được khái niệm phạm vi của biến trong chương trình.
  • Phân biệt được biến cục bộ (Local Variable) và biến toàn cục (Global Variable).
  • Biết sử dụng từ khóa global khi cần thay đổi giá trị của biến toàn cục trong hàm.

MỞ ĐẦU

Trong khi lập trình, chúng ta thường khai báo các biến để lưu trữ dữ liệu. Tuy nhiên, không phải biến nào cũng có thể sử dụng ở mọi nơi trong chương trình.

Câu hỏi 1: Một biến được khai báo ngoài hàm thì sử dụng trong hàm như thế nào?

Biến khai báo ngoài hàm gọi là biến toàn cục. Nếu trong hàm không có biến cùng tên thì hàm có thể sử dụng giá trị của biến đó.

N = 10
def tong(a, b):
return a + b + N
print(tong(1, 2))
Giải thích
  • N = 10biến toàn cục (global variable).
  • Trong hàm tong(a, b), biến N được sử dụng trực tiếp vì không có biến N cục bộ nào cùng tên.
  • Hàm trả về:

    a+b+Na + b 

Với lời gọi: tong(1, 2) = 13

Câu hỏi 2: Biến khai báo trong hàm có dùng được ngoài hàm không?

Không. Biến khai báo trong hàm chỉ có hiệu lực trong chính hàm đó.

def demo():
x = 5
print(x)
Giải thích
  • x = 5biến cục bộ (local variable), chỉ tồn tại bên trong hàm demo().
  • print(x) sẽ in giá trị của x.
Ví dụ
def demo():
    x = 5
    print(x)

demo()

Kết quả: 5

1. Phạm Vi Của Biến Khai Báo Trong Hàm

Hoạt động 1: Tìm hiểu phạm vi của biến được khai báo trong hàm

def func(a, b):
n = 10
a = a * 2
b = a + b
return a + b + n
a = 1
b = 2
print(func(a, b))
print(a, b)
print(n)
Phân tích
  • Ban đầu:
    • a = 1
    • b = 2
  • Khi gọi func(a, b):
    • n = 10 (biến cục bộ)
    • a = a * 2a = 2
    • b = a + bb = 2 + 2 = 4
    • return a + b + n = 2 + 4 + 10 = 16

Vì vậy:

    print(func(a, b))

        In ra: 16

Sau khi hàm kết thúc, các biến ab bên ngoài không thay đổi vì Python truyền tham số theo tham chiếu đến đối tượng, nhưng việc gán lại ab trong hàm chỉ ảnh hưởng đến biến cục bộ.

    print(a, b)

        In ra: 1 2

Cuối cùng:

    print(n)

Sẽ gây lỗi:

NameError: name 'n' is not defined

nbiến cục bộ, chỉ tồn tại bên trong hàm func().

Trong hàm có ba biến a, b, n — đều là biến cục bộ. Sau khi hàm kết thúc, biến n bị hủy; a, b trong hàm cũng không còn. Hai biến a=1, b=2 ở chương trình chính vẫn giữ nguyên.

Ghi nhớ: Biến được khai báo trong hàm gọi là biến cục bộ (Local Variable). Biến cục bộ chỉ có hiệu lực trong hàm chứa nó.

Câu 1. 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

a) f(1, 2)9; sau khi gọi: a = 1, b = 2.

b) f(10, 20)630; sau khi gọi: a = 1, b = 2.


Câu 2. 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ó. Hai biến thuộc hai phạm vi khác nhau nên không ảnh hưởng đến nhau.

x = 5
def demo():
x = 10
print(x)
demo()
print(x)

Giải thích ngắn gọn:

  • x = 10 trong demo()biến cục bộ.
  • x = 5 bên ngoài là biến toàn cục, không bị thay đổi.

✔ Biến cục bộ chỉ tồn tại trong hàm. ✔ Có thể trùng tên với biến toàn cục. ✔ Khi hàm kết thúc, biến cục bộ bị hủy.

2. Phạm Vi Của Biến Khai Báo Ngoài Hàm

Biến khai báo ở chương trình chính gọi là biến toàn cục. Hãy quan sát các ví dụ sau.

Ví dụ 1: Biến cục bộ và toàn cục cùng tên

def f(n):
t = n + 1
return t
t = 10
print(f(5))
print(t)

Giải thích ngắn gọn:

  • Trong hàm: t = 5 + 1 = 6 → trả về 6.
  • Biến t trong hàm là biến cục bộ, không ảnh hưởng đến t = 10 bên ngoài.

Ví dụ 2: Sử dụng biến toàn cục trong hàm

def f(a, b):
return a + b + N
N = 10
print(f(1, 2))
Giải thích ngắn gọn: Nbiến toàn cục, nên f(1, 2) = 1 + 2 + 10 = 13.

Ví dụ 3: Dùng từ khóa global để thay đổi biến toàn cục

def f(n):
global t
t = 2 * n + 1
return t
t = 10
print(f(1))
print(t)
Giải thích ngắn gọn: global t làm thay đổi biến toàn cục t, nên sau khi gọi f(1), giá trị của t3.

Ghi nhớ: Biến toàn cục có thể được đọc trong hàm. Muốn thay đổi giá trị của biến toàn cục trong hàm phải khai báo bằng từ khóa global.

Đề bài đúng cú pháp:

def f(x, y):
    a = 2 * (x + y)
    print(a + n)

n = 10
f(1, 2)
Tính toán
  • a = 2 × (1 + 2) = 6
  • a + n = 6 + 10 = 16
Đáp án : 16

✔ Biến toàn cục có thể đọc trong hàm. ✔ Muốn thay đổi phải dùng global. ✔ Không nên lạm dụng biến toàn cục.

THỰC HÀNH

Nhiệm vụ 1: Hàm Select(A, x)

Viết hàm trả về danh sách B gồm các phần tử của A có giá trị ≥ x.

def Select(A, x):
B = []
for i in range(len(A)):
if A[i] >= x:
B.append(A[i])
return B

A = [12, 5, 18, 3, 20, 7, 15]
print(Select(A, 10))
Giải thích ngắn gọn: Hàm Select(A, x) trả về danh sách gồm các phần tử trong A có giá trị lớn hơn hoặc bằng x. Với x = 10, các phần tử thỏa mãn là 12, 18, 20, 15.

Nhiệm vụ 2: Hàm Tach_tu(Str, c)

Tách xâu thành danh sách từ. c=0: in hoa, c=1: in thường, c=2: viết hoa chữ đầu.

def Tach_tu(Str, c):
A = Str.split()
for i in range(len(A)):
if c == 0:
A[i] = A[i].upper()
elif c == 1:
A[i] = A[i].lower()
elif c == 2:
A[i] = A[i].title()
return A
s = "hoc lap trinh python"
print(Tach_tu(s, 0))
print(Tach_tu(s, 1))
print(Tach_tu(s, 2))

Giải thích ngắn gọn:

  • c = 0: Chuyển tất cả từ thành chữ hoa (upper()).
  • c = 1: Chuyển tất cả từ thành chữ thường (lower()).
  • c = 2: Viết hoa chữ cái đầu của mỗi từ (title()).

Nhiệm vụ 3: Chia chương trình thành hàm

Nhập dãy số, tạo danh sách số dương (B) và số âm (C). Mỗi công việc viết thành một hàm riêng.

def Nhap_DuLieu():
s = input("Nhập các số: ")
A = s.split()
for i in range(len(A)):
A[i] = int(A[i])
return A
def getB(A):
B = []
for x in A:
if x > 0:
B.append(x)
return B
def getC(A):
C = []
for x in A:
if x < 0:
C.append(x)
return C
A = Nhap_DuLieu()
print("Danh sách A:", A)
B = getB(A)
C = getC(A)
print("Danh sách B:", B)
print("Danh sách C:", C)
Danh sách A: [12, -5, 0, 18, -9, 4, -2]
Danh sách B: [12, 18, 4]
Danh sách C: [-5, -9, -2]

Giải thích ngắn gọn:

  • Nhap_DuLieu(): Nhập dãy số và chuyển thành danh sách số nguyên.
  • getB(A): Lấy các số dương (> 0).
  • getC(A): Lấy các số âm (< 0).
  • Số 0 không thuộc danh sách B hay C.
 

LUYỆN TẬP

Viết hàm với đầu vào, đầu ra như sau: 
– Đầu vào là danh sách sList, các phần tử là xâu kí tự. 
- Đầu ra là danh sách cList, các phần tử là ki tự đầu tiên của các xâu kí tự tương ứng trong danh sách sList.

def first_char(slist):
clist = []
for s in slist:
clist.append(s[0])
return clist
A = ["Python", "Java", "Pascal", "Scratch"]
print(first_char(A))

Giải thích ngắn gọn:
Hàm first_char(slist) lấy ký tự đầu tiên của mỗi chuỗi trong danh sách và trả về một danh sách mới.

  • "Python"'P'
  • "Java"'J'
  • "Pascal"'P'
  • "Scratch"'S'

➡️ Kết quả: ['P', 'J', 'P', 'S']

Viết hàm Tach_day() với đầu vào là danh sách A, đầu ra là hai danh sách B, C được mô tả như sau:
    - Danh sách B thu được từ A bằng cách lấy ra các phần tử có chỉ số chẵn.
    - Danh sách C thu được từ A bằng cách lấy ra các phần tử có chỉ số lẻ.
def tach_day(A):
B = []
C = []
for i in range(len(A)):
if i % 2 == 0:
B.append(A[i])
else:
C.append(A[i])
return B, C
A = [10, 20, 30, 40, 50, 60, 70]
B, C = tach_day(A)
print(B)
print(C)
[10, 30, 50, 70]
[20, 40, 60]

Giải thích ngắn gọn:

  • B: chứa các phần tử ở vị trí chẵn (chỉ số 0, 2, 4, 6).
  • C: chứa các phần tử ở vị trí lẻ (chỉ số 1, 3, 5).

VẬN DỤNG

1. Viết hàm có hai tham số đầu vào là m, n. Đầu ra trả lại hai giá trị là:
    - UCLN của m, n.
    - Bội chung nhỏ nhất (BCNN) của m, n.
Gợi ý: Sử dụng công thức ƯCLN(m, n) x BCNN(m, n) = m x n.
def UCLN(a, b):
while b != 0:
a, b = b, a % b
return a
def BCNN(a, b):
return a * b // UCLN(a, b)
m, n = map(int, input("Nhập hai số: ").split())
print("UCLN =", UCLN(m, n))
print("BCNN =", BCNN(m, n))
UCLN = 6
BCNN = 36

Giải thích ngắn gọn:

  • UCLN(a, b): Tìm Ước chung lớn nhất bằng thuật toán Euclid.
  • BCNN(a, b): Tính Bội chung nhỏ nhất theo công thức:

    BCNN=a×bUCLN(a,b)\text{BCNN} = \frac{a \times b}{\text{UCLN}(a, b)}
2. Viết chương trình nhập ba số tự nhiên từ bàn phím day, month, year, các số cách nhau bởi dấu cách. Các số này biểu diễn giá trị của ngày, tháng, năm nào đó. Chương trình cần kiểm tra và in ra thông báo số liệu đã nhập vào đó có hợp lệ hay không.
def nam_nhuan(year):
if year % 400 == 0:
return True
if year % 4 == 0 and year % 100 != 0:
return True
return False
def hop_le(day, month, year):
if month < 1 or month > 12:
return False
ngay = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if nam_nhuan(year):
ngay[1] = 29
if day < 1:
return False
if day > ngay[month - 1]:
return False
return True
day, month, year = map(int, input().split())
if hop_le(day, month, year):
print("Ngày hợp lệ")
else:
print("Ngày không hợp lệ")
29 2 2024 → Ngày hợp lệ
31 4 2025 → Ngày không hợp lệ

Giải thích ngắn gọn:

  • nam_nhuan(year): Kiểm tra năm nhuận.
  • hop_le(day, month, year): Kiểm tra ngày, tháng, năm có hợp lệ hay không.
  • Nếu năm nhuận thì tháng 2 có 29 ngày, ngược lại có 28 ngày.
 

TỔNG KẾT KIẾN THỨC

Biến cục bộ (Local Variable)

  • Khai báo trong hàm
  • Chỉ dùng trong hàm
  • Bị hủy sau khi hàm kết thúc
  • Không ảnh hưởng biến ngoài hàm

Biến toàn cục (Global Variable)

  • Khai báo ngoài hàm
  • Có thể đọc trong các hàm
  • Tồn tại suốt chương trình
  • Muốn thay đổi trong hàm phải dùng global
x = 10
def tang():
global x
x = x + 1
tang()
print(x)
Giải thích ngắn gọn: global x cho phép hàm tang() thay đổi biến toàn cục x. Ban đầu x = 10, sau khi gọi tang(), x tăng lên 11.

Phạm vi của biến quyết định nơi biến có thể được sử dụng. Nên hạn chế biến toàn cục; ưu tiên truyền dữ liệu qua tham số và giá trị trả về để chương trình rõ ràng, dễ bảo trì.

Fascinating blue spiral design with intricate geometric patterns.

"Phạm vi của biến – hiểu rõ để viết chương trình sạch và dễ kiểm soát!"


D. TRẮC NGHIỆM 

Bài cũ hơn Bài mới hơn
Đọc tiếp:
Lên đầu trang