Khái niệm và Cách sử dụng Hàm trong Python

Giới thiệu về Hàm

Tại sao cần sử dụng hàm?

Sử dụng hàm giúp giải quyết các vấn đề sau:

  • Cấu trúc tổ chức code rõ ràng, dễ đọc
  • Tránh lặp lại code khi có chức năng tương tự
  • Dễ dàng mở rộng và bảo trì khi cần thay đổi chức năng

Hàm là gì?

Hàm giống như một công cụ đã được chuẩn bị sẵn sàng để sử dụng nhiều lần. Ví dụ như một người thợ sửa chữa có sẵn hộp công cụ chứa búa, cờ lê, kìm,... Khi cần đóng đinh, họ chỉ cần lấy búa ra dùng mà không cần phải làm một cái búa mới.

Người thợ sửa chữa ====> Lập trình viên

Công cụ có chức năng cụ thể ====> Hàm

Để sử dụng công cụ, cần chuẩn bị trước, sau đó có thể dùng lại nhiều lần. Tương tự, để sử dụng hàm, cần phải định nghĩa trước rồi mới gọi.

Phân loại hàm

  1. Hàm tích hợp sẵn: Python đã định nghĩa sẵn một số hàm đơn giản để tiện cho việc phát triển. Chúng ta có thể sử dụng ngay mà không cần định nghĩa, như len(), sum(), max().
  2. Hàm tự định nghĩa: Khi các hàm tích hợp sẵn không đủ đáp ứng nhu cầu, chúng ta có thể tự tạo hàm theo yêu cầu riêng.

Định nghĩa Hàm

Cách tự định nghĩa hàm

Cú pháp:

def ten_ham(thamso1, thamso2, thamso3,...):
    '''Chú thích'''
    Nội dung hàm
    return giá_trị_trả_về

Tên hàm nên phản ánh ý nghĩa của nó.

Ví dụ về hàm xác thực người dùng và mật khẩu

def xac_thuc_nguoi_dung(ten_nguoi_dung:str, mat_khau:str)->int:
    """
    Hàm xác thực người dùng
    :param ten_nguoi_dung: Tên người dùng
    :param mat_khau: Mật khẩu
    :return: Kết quả xác thực
    """
    if ten_nguoi_dung == 'admin' and mat_khau == '123456':
        return 1

ten_nd = input('Nhập tên người dùng>>: ').strip()
mk = input('Nhập mật khẩu>>: ').strip()
ket_qua = xac_thuc_nguoi_dung(ten_nd, mk)
print(ket_qua)

Nguyên tắc sử dụng hàm: Định nghĩa trước, gọi sau

Hàm giống như "biến", "biến" phải được định nghĩa trước khi được sử dụng. Nếu gọi hàm chưa được định nghĩa, tương tự như sử dụng một biến không tồn tại.

Hàm thực hiện những gì ở giai đoạn định nghĩa?

Chỉ kiểm tra cú pháp, không thực thi code. Lỗi cú pháp sẽ được phát hiện ở giai đoạn định nghĩa, trong khi lỗi logic chỉ được phát hiện khi thực thi.

Ba hình thức định nghĩa hàm

  1. Không tham số: Áp dụng khi chỉ cần thực hiện một số thao tác, tương tác với người dùng, in ra...
  2. Có tham số: Cần tham số từ bên ngoài để thực hiện logic, ví dụ tính độ dài, tìm giá trị lớn nhất/nhỏ nhất.
  3. Hàm rỗng: Thiết kế cấu trúc chương trình.

Gọi Hàm

Cách gọi hàm

Gọi hàm: tên hàm theo sau là dấu ngoặc đơn

  1. Tìm tên hàm
  2. Thực thi code theo tên hàm

Giá trị trả về của hàm

  • Không có return -> None
  • return 1 giá trị -> trả về 1 giá trị
  • return nhiều giá trị cách nhau bằng dấu phẩy -> tuple

Khi nào cần giá trị trả về?

Cần có giá trị trả về: Khi gọi hàm, thực hiện một chuỗi thao tác và cần có kết quả cụ thể. Thường là hàm có tham số.

Không cần giá trị trả về: Khi chỉ cần thực hiện một chuỗi thao tác mà không cần kết quả cụ thể. Thường là hàm không tham số.

Ba hình thức gọi hàm

  1. Dạng câu lệnh: ten_ham()
  2. Dạng biểu thức: 3*len('xin chao')
  3. Làm tham số cho hàm khác: range(len('xin chao'))

Tham số hàm và Biến cục bộ

Tham số hình thức và Tham số thực tế

Tham số hình thức chỉ được cấp phát bộ nhớ khi được gọi và được giải phóng khi kết thúc. Do đó, chúng chỉ có hiệu lực bên trong hàm.

Tham số thực tế có thể là hằng, biến, biểu thức, hàm,... Khi gọi hàm, chúng phải có giá trị xác định để truyền cho tham số hình thức.

Loại tham số

  1. Tham số vị trí: Định nghĩa từ trái sang phải
    def in_thong_tin(a, b, c):
        print(a)
        print(b)
        print(c)
    in_thong_tin('Xin', 'chào', 'bạn')  # Truyền giá trị theo vị trí
    
  2. Tham số mặc định: Định nghĩa với giá trị mặc định
    def dang_ky_hoc_vien(ten, tuoi, khoa_hoc, quoc_gia="VN"):
        print("----Thông tin đăng ký----")
        print("Tên:", ten)
        print("Tuổi:", tuoi)
        print("Quốc tịch:", quoc_gia)
        print("Khóa học:", khoa_hoc)
    
  3. Tham số từ khóa: Truyền giá trị dưới dạng key=value
    dang_ky_hoc_vien(tuoi=25, ten="An", khoa_hoc="Python")
    
  4. Tham số không cố định: Số lượng tham số không xác định
    def dang_ky_hoc_vien(ten, tuoi, *thong_tin_khac, **thong_tin_chi_tiet):
        print(ten, tuoi, thong_tin_khac, thong_tin_chi_tiet)
    

Biến cục bộ và Biến toàn cục

Biến được định nghĩa trong chương trình chính gọi là biến toàn cục, có phạm vi sử dụng trong toàn bộ chương trình. Biến được định nghĩa trong hàm gọi là biến cục bộ, chỉ có phạm vi sử dụng trong hàm đó.

Khi biến toàn cục và biến cục bộ cùng tên:

  • Trong hàm có định nghĩa biến cục bộ, biến cục bộ có hiệu lực
  • Ngoài hàm, biến toàn cục có hiệu lực

Bài tập

  1. Viết hàm, người dùng truyền vào tên file cần sửa và nội dung cần sửa, thực hiện hàm để sửa file.
  2. Viết hàm, tính số lượng chữ số, chữ cái, khoảng trắng và ký tự khác trong chuỗi được truyền vào.
  3. Viết hàm, kiểm tra đối tượng (chuỗi, danh sách, tuple) truyền vào có độ dài lớn hơn 5 hay không.
  4. Viết hàm, kiểm tra độ dài danh sách truyền vào, nếu lớn hơn 2 thì chỉ giữ 2 phần tử đầu và trả về nội dung mới.
  5. Viết hàm, lấy các phần tử ở vị trí lẻ của danh sách hoặc tuple và trả về danh sách mới.
  6. Viết hàm, kiểm tra độ dài của mỗi giá trị trong từ điển, nếu lớn hơn 2 thì chỉ giữ 2 phần tử đầu và trả về từ điển mới. Giá trị trong từ điển chỉ có thể là chuỗi hoặc danh sách.

Mã giải bài tập

# Bài 1
def sua_file(ten_file, noi_dung_cu, noi_dung_moi):
    import os
    with open(ten_file, 'r', encoding='utf-8') as f_doc, \
         open('.backup', 'w', encoding='utf-8') as f_viet:
        for line in f_doc:
            if noi_dung_cu in line:
                line = line.replace(noi_dung_cu, noi_dung_moi)
            f_viet.write(line)
    os.remove(ten_file)
    os.rename('.backup', ten_file)

# Bài 2
def dem_ky_thu(msg):
    ket_qua = {
        'chu_so': 0,
        'chu_cai': 0,
        'khoang_trang': 0,
        'khac': 0,
    }
    for ky_tu in msg:
        if ky_tu.isdigit():
            ket_qua['chu_so'] += 1
        elif ky_tu.isalpha():
            ket_qua['chu_cai'] += 1
        elif ky_tu.isspace():
            ket_qua['khoang_trang'] += 1
        else:
            ket_qua['khac'] += 1
    return ket_qua

# Bài 4
def cat_danh_sach(seq):
    if len(seq) > 2:
        return seq[:2]
    return seq

# Bài 5
def lay_phan_tu_le(seq):
    return seq[1::2]

# Bài 6
def sua_tu_dien(dic):
    tu_dien_moi = {}
    for k, v in dic.items():
        if len(v) > 2:
            tu_dien_moi[k] = v[:2]
    return tu_dien_moi

Thẻ: python Functions Programming Parameters variables

Đăng vào ngày 1 tháng 6 lúc 09:50