Cách Định Nghĩa và Sử Dụng Hàm với Từ Khóa def trong Python – Hướng Dẫn Đầy Đủ Cho Người Mới Bắt Đầu

1. def trong Python là gì?

Từ khóa def trong Python được sử dụng để định nghĩa hàm. Hàm là một cấu trúc cơ bản giúp tái sử dụng mã nguồn và tổ chức chương trình một cách hợp lý hơn. Bằng cách sử dụng def, bạn có thể tạo ra các khối mã thực hiện các tác vụ cụ thể và sử dụng lại nhiều lần. Điều này giúp mã dễ đọc hơn và giảm nguy cơ xảy ra lỗi.

Cú pháp cơ bản của từ khóa def

Cú pháp cơ bản như sau:

def tên_hàm(tham_số1, tham_số2, ...):
    xử_lý
    return giá_trị_trả_về

Sau def là tên hàm, bên trong dấu ngoặc là các tham số (nếu có). Sau dấu hai chấm : là khối mã thụt lề thể hiện nội dung xử lý. Nếu cần, bạn có thể sử dụng câu lệnh return để trả về giá trị từ hàm.

2. Cú pháp cơ bản và cách sử dụng def

Cách định nghĩa hàm cơ bản

Khi sử dụng từ khóa def để định nghĩa hàm, bạn cần chỉ định tên hàm, danh sách tham số và nội dung xử lý. Ví dụ sau là một hàm cơ bản xuất ra “Hello, World!”:

def say_hello():
    print("Hello, World!")

Hàm này sẽ in ra “Hello, World!” khi bạn gọi say_hello().

Tầm quan trọng của thụt lề (indentation)

Trong Python, thụt lề là rất quan trọng. Mọi dòng mã trong một hàm phải có cùng mức thụt lề để Python xác định phạm vi của khối lệnh. Nếu thụt lề sai, chương trình sẽ báo lỗi.

Gọi hàm

Bạn có thể gọi hàm đã định nghĩa bằng cách sử dụng tên hàm kèm theo dấu ngoặc, truyền vào tham số nếu có.

say_hello()

 

侍エンジニア塾

3. Tham số và giá trị mặc định của hàm

Tham số vị trí và tham số từ khóa

Hàm có thể nhận các tham số, bao gồm tham số vị trí và tham số từ khóa. Tham số vị trí được truyền theo thứ tự khi gọi hàm. Tham số từ khóa (keyword) có thể truyền theo tên mà không cần đúng thứ tự.

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

Với hàm trên, nếu gọi greet("Alice") thì sẽ in ra “Hello, Alice!” nhờ greeting có giá trị mặc định.

Tham số biến dài

Đôi khi bạn cần hàm nhận số lượng tham số không xác định. Trong Python, có thể dùng *args**kwargs cho mục đích này.

def print_args(*args):
    for arg in args:
        print(arg)

print_args(1, 2, 3)

Ở ví dụ trên, *args sẽ nhận tất cả các tham số truyền vào dưới dạng tuple.

4. Trả về giá trị với câu lệnh return

Cách sử dụng return

Nếu muốn hàm trả về một giá trị, bạn dùng return. Nếu không có return, hàm sẽ trả về None theo mặc định.

def add(a, b):
    return a + b

result = add(3, 4)
print(result)  # 7

Hàm add trên trả về tổng của hai số. Bạn có thể gán giá trị trả về cho một biến khác.

Trả về nhiều giá trị

Python cho phép trả về nhiều giá trị bằng cách phân tách bằng dấu phẩy, khi đó kết quả trả về là một tuple.

def swap(a, b):
    return b, a

x, y = swap(1, 2)
print(x, y)  # 2 1

 

侍エンジニア塾

5. Phạm vi (scope) và thời gian tồn tại (lifetime) của biến

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

Biến khai báo trong hàm gọi là biến cục bộ, chỉ sử dụng được trong hàm đó. Biến khai báo ngoài hàm là biến toàn cục, dùng được trong toàn bộ chương trình.

x = "global"

def func():
    x = "local"
    print(x)

func()      # local
print(x)    # global

Ở ví dụ này, biến x trong hàm func là biến cục bộ, không ảnh hưởng tới biến x bên ngoài.

Từ khóa global

Nếu muốn thay đổi biến toàn cục trong hàm, bạn cần dùng từ khóa global.

x = "global"

def change_global():
    global x
    x = "changed"

change_global()
print(x)  # changed

6. Ví dụ thực tế và cách sử dụng

Tối ưu hóa chương trình bằng hàm

Sử dụng hàm giúp tối ưu hóa chương trình rất nhiều. Ví dụ, bạn có thể nhóm các phép tính hoặc xử lý dữ liệu lặp lại vào trong hàm để tránh lặp mã.

def calculate_area(radius):
    return 3.14 * radius * radius

area1 = calculate_area(5)
area2 = calculate_area(10)

Hàm calculate_area trên giúp tính diện tích hình tròn và có thể dùng lại nhiều lần.

Ví dụ sử dụng hàm

Một ví dụ khác, tạo hàm định dạng văn bản:

def format_text(text, alignment="left"):
    if alignment == "left":
        return text.ljust(20)
    elif alignment == "right":
        return text.rjust(20)
    elif alignment == "center":
        return text.center(20)

print(format_text("Hello", "center"))

Hàm này sẽ căn trái, phải hoặc giữa cho văn bản đầu vào.

7. Các khái niệm nâng cao về hàm

Hàm lồng nhau (Nested Function)

Trong Python, bạn có thể định nghĩa hàm bên trong một hàm khác, gọi là hàm lồng nhau. Hàm lồng nhau chỉ có thể truy cập bên trong hàm ngoài.

def outer():
    def inner():
        print("This is the inner function")
    inner()

Hàm không tên (Lambda)

Sử dụng từ khóa lambda, bạn có thể tạo hàm không tên (anonymous function), phù hợp cho các tác vụ ngắn, sử dụng một lần.

square = lambda x: x * x
print(square(5))  # 25

Decorator

Decorator cho phép mở rộng chức năng của hàm mà không thay đổi mã nguồn của hàm gốc. Decorator nhận một hàm làm tham số và trả về một hàm mới.

def decorator(func):
    def wrapper():
        print("Before the function")
        func()
        print("After the function")
    return wrapper

@decorator
def say_hello():
    print("Hello!")

say_hello()

8. Tổng kết

Bài viết này đã giải thích chi tiết về cách định nghĩa hàm với từ khóa def trong Python, tham số, giá trị trả về, phạm vi biến, và các chức năng nâng cao khác. Việc sử dụng hàm sẽ giúp chương trình của bạn hiệu quả và có cấu trúc hơn. Hãy tận dụng kiến thức này để tạo ra nhiều hàm hữu ích, nâng cao kỹ năng lập trình Python của bạn.

9. Câu hỏi thường gặp (FAQs)

Sự khác nhau giữa returnprint?

returnprint có vai trò khác nhau. return trả về giá trị từ hàm để sử dụng ở nơi khác, ví dụ để gán cho biến khác. print chỉ hiển thị giá trị ra màn hình, giá trị này không sử dụng lại được trong chương trình.

def add(a, b):
    return a + b

result = add(3, 4)  # result sẽ nhận giá trị 7
print(result)  # 7

def display_message():
    print("Hello, World!")

display_message()  # Sẽ in ra "Hello, World!" nhưng không trả về giá trị

Lợi ích của việc sử dụng hàm lồng nhau?

Hàm lồng nhau giúp tạo các hàm cục bộ chỉ dùng trong phạm vi hẹp, tăng tính đóng gói và khả năng tái sử dụng mã. Ngoài ra, chúng có thể truy cập các biến trong phạm vi của hàm ngoài, phù hợp cho các xử lý đặc thù.

Khi nào nên dùng tham số biến dài?

Khi số lượng tham số truyền vào hàm là không xác định, bạn nên sử dụng tham số biến dài. Ví dụ như hàm tính tổng của nhiều số bất kỳ.

def add_all(*args):
    return sum(args)

result = add_all(1, 2, 3, 4, 5)  # 15

Làm thế nào để gọi hàm đệ quy?

Hàm đệ quy là hàm tự gọi lại chính nó. Dùng trong các bài toán như tính giai thừa. Tuy nhiên, cần cẩn thận để tránh lỗi tràn ngăn xếp.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

result = factorial(5)  # 120