Bài F14. Tham số của hàm và phạm vi của biến

Nội dung lý thuyết

1. Tham số, đối số, biến cục bộ, biến toàn cục

  • Tham số (parameter): Là các biến được khai báo trong phát biểu định nghĩa hàm và được sử dụng để chứa giá trị được truyền vào khi hàm được gọi. Tham số được sử dụng để xác định các dữ liệu cần thiết để hàm hoạt động.

Ví dụ 1: Khai báo và sử dụng tham số của hàm

# Hàm kiểm tra n có phải là số nguyên tố
def nguyenTo(n):
    kt = True
    i = 2
    if n < 2:
        kt = False
    else:
        for i in range(2, int(n**0.5) + 1):
            if n % i == 0:
                kt = False
                break
    return kt

# Chương trình chính
k = int(input("Nhập số tự nhiên: "))
if nguyenTo(k):  # Lệnh gọi hàm nguyenTo()
    print(f"{k} là số nguyên tố.")
else:
    print(f"{k} không là số nguyên tố.")

Trong đó, dòng 1 có n được khai báo giữa cặp dấu ngoặc tròn () gọi là tham số. Nếu có nhiều hơn một tham số thì các tham số sẽ cách nhau bằng dấu phẩy.

  • Đối số (argument): Là các giá trị được ghi trong lệnh gọi hàm và được gán cho các tham số tương ứng khi hàm được gọi. Đối số phản ánh các giá trị thực tế được chuyển cho hàm khi gọi và được gán cho các tham số tương ứng.
    • Đảm bảo rằng các đối số phải được cung cấp theo thứ tự như các tham số được liệt kê trong định nghĩa hàm.
    • Ví dụ: nguyenTo(k) thì kđối số truyền cho tham số n.
  • Biến cục bộ: Là các biến được tạo trong một hàm và chỉ có phạm vi trong hàm đó. Không thể truy xuất ở bên ngoài hàm này.
    Ví dụ: kt ở dòng 2 là biến cục bộ của hàm nguyenTo()

  • Biến toàn cục: Là biến được tạo ở bên ngoài mọi hàm hoặc được khai báo trong các hàm với từ khóa global. Có phạm vi trong toàn bộ chương trình.
    Ví dụ: k ở dòng 11 (trong ví dụ 1) là biến toàn cục vì được tạo bên ngoài hàm.

Ví dụ 2: So sánh biến cục bộ và toàn cục

So sánh biến cục bộ và toàn cục

Giải thích:

  • Ở chương trình 1: lỗi xảy ra vì biến s là cục bộ, không được dùng trong chương trình chính.

  • Ở chương trình 2: biến s là toàn cục, có thể được dùng ở cả chương trình chính và trong hàm chuNhat().

Mặc dù trong hàm có lệnh gán giá trị cho biến s, nhưng vì không khai báo global, nên s là biến cục bộ mới, không ảnh hưởng tới biến toàn cục.

Lưu ý:

Khi muốn sử dụng và thay đổi giá trị biến toàn cục trong hàm, phải dùng lệnh:

global <danh sách biến toàn cục>

Ví dụ 3: Thay đổi giá trị biến toàn cục trong hàm

def kiemTra():
    global s  # Khai báo s là biến toàn cục
    if n % 2 == 0:
        s = "Số chẵn"  # Gán giá trị mới cho biến s
    else:
        s = "Số lẻ"    # Gán giá trị mới cho biến s

# Chương trình chính
n = int(input("Nhập số nguyên: "))
s = ""  # Biến s là xâu rỗng
kiemTra()
print(s)  # Biến s khác xâu rỗng

2. Cách sử dụng hàm

Hàm giúp:

  • Viết chương trình ngắn gọn, dễ hiểu, dễ quản lý

  • Tăng hiệu quả, dễ bảo trì, nâng cấp

  • Giúp tái sử dụng khi chương trình có phần xử lý giống nhau.

Python hỗ trợ tạo hàm tự định nghĩa (do người lập trình viết) và hàm có sẵn (do thư viện cung cấp).

Bài toán 1: Kiểm tra số đẹp

Đề bài: Số nguyên dương gọi là số đẹp nếu:

  • Có chứa ít nhất một chữ số chẵn

  • Tổng chữ số là số nguyên tố

Hướng dẫn giải:

  • Bước 1: Viết hàm kiểm tra số nguyên tố

  • Bước 2: Tính tổng chữ số của một số

  • Bước 3: Kiểm tra số đẹp

  • Bước 4: Chương trình chính

Chương trình tham khảo:

def nguyenTo(n):
    if n < 2:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

def tongChuSo(n):
    s = 0
    for i in str(n):
        s += int(i)
    return s

def soDep(n):
    if not nguyenTo(n):  # Kiểm tra n có phải là số nguyên tố không
        return "Không"
    if not nguyenTo(tongChuSo(n)):  # Kiểm tra tổng chữ số có phải là số nguyên tố không
        return "Không"
    caseSoNguyenTo = ['2', '3', '5', '7']
    for i in str(n):  # Kiểm tra từng chữ số có phải là số nguyên tố không
        if i not in caseSoNguyenTo:
            return "Không"
    return "Có"

# Chương trình chính
n = int(input("Nhập n: "))
print("Kết quả kiểm tra số đẹp:", soDep(n))

Bài toán 2: Mã phiếu dự thưởng

Đề bài: Tổ chức chương trình tặng thưởng. Mỗi người nhận được một mã phiếu.

Yêu cầu: Đếm số phiếu có chứa số và sắp xếp danh sách phiếu theo thứ tự tăng dần số trong mã.

Hướng dẫn giải:

  • Bước 1: Viết hàm catSo(maPhieu) – Tách số từ mã phiếu

  • Bước 2: Chương trình chính

Chương trình tham khảo:

def catSo(maPhieu):
    s = ""
    for i in maPhieu:
        if i.isdigit():
            s += i
    return int(s)

# Chương trình chính
n = int(input("Nhập số lượng phiếu: "))
dsPhieu = []

for i in range(n):
    maPhieu = input("Nhập mã phiếu: ")
    so = catSo(maPhieu)
    dsPhieu.append([so, maPhieu])

# Sắp xếp theo số tăng dần trong mã phiếu
dsPhieu.sort()

print("Trình tự các khách hàng bóc thăm:")
for phieu in dsPhieu:
    print(phieu[1]