Làm Chủ Tham Số, Giá Trị Trả Về và Phạm Vi Biến Trong Hàm Python (Parameters, Return & Scope)

Chào bạn! Ở bài viết trước, chúng ta đã nắm được cách định nghĩa cơ bản và gọi một hàm trong Python. Tuy nhiên, để một "bộ máy" hàm thực sự linh hoạt và mạnh mẽ, bạn cần hiểu sâu hơn cách truyền dữ liệu vào hàm, cách nhận kết quả trả về, cũng như không gian sống của các biến bên trong đó.
Hãy cùng khám phá checklist chuyên sâu dưới đây để làm chủ hoàn toàn dòng chảy dữ liệu trong hàm nhé!
1. Tham Số Đầu Vào (Parameters vs Arguments)
Tham số chính là chiếc "cửa khẩu" để bạn đưa dữ liệu từ bên ngoài vào trong chiếc hộp xử lý của hàm.
- Phân biệt Parameter và Argument:
- Parameter (Tham số): Là các biến danh nghĩa được khai báo lúc bạn định nghĩa hàm (Ví dụ: price, tax_rate trong def calculate_total(price, tax_rate):).
- Argument (Đối số): Là giá trị thực tế bạn truyền vào khi tiến hành gọi hàm (Ví dụ: 100, 0.1 trong calculate_total(100, 0.1)).
- Tính nhất quán về số lượng: Đảm bảo số lượng đối số truyền vào khi gọi hàm phải khớp chính xác với số lượng tham số đã khai báo (trừ khi hàm đó có sử dụng tham số mặc định).
- Thứ tự truyền đối số (Positional Arguments): Mặc định Python sẽ gán các giá trị truyền vào theo đúng thứ tự từ trái qua phải.
- Truyền theo tên (Keyword Arguments): Bạn hoàn toàn có thể chỉ định chính xác tên tham số khi gọi hàm (Ví dụ: calculate_total(tax_rate=0.1, price=100)) để không bị phụ thuộc vào thứ tự.
- Tham số mặc định (Default Parameters): Biết cách gán giá trị mặc định cho tham số ngay lúc định nghĩa (Ví dụ: def greet(name, message="Hello"):).
- ⚠️ Lưu ý quan trọng: Các tham số có giá trị mặc định phải luôn luôn đứng sau các tham số không có giá trị mặc định.
2. Bản Chất Giá Trị Trả Về (return)
Lệnh return là con đường duy nhất để hàm gửi kết quả xử lý ngược lại cho chương trình chính bên ngoài.
- Sự khác biệt giữa return và print():
- print() chỉ hiển thị chữ lên màn hình Terminal cho người dùng xem chứ hoàn toàn không giữ lại giá trị để code tính toán tiếp.
- return giúp lưu giữ giá trị đó để gán vào biến khác hoặc làm mồi cho các phép tính tiếp theo.
- Cơ chế thoát hàm: Ngay khi dòng lệnh return được thực thi, hàm sẽ dừng lại lập tức. Mọi dòng code viết phía dưới return trong khối hàm đó đều vô tác dụng (dead code).
- Trả về nhiều giá trị: Python cho phép bạn trả về nhiều giá trị cách nhau bằng dấu phẩy (Ví dụ: return width, height). Kết quả nhận được ở bên ngoài khi hứng sẽ là một Tuple.
- Giá trị mặc định None: Nếu một hàm không có lệnh return, hoặc chỉ viết return trống, hàm đó sẽ tự động trả về giá trị None.
3. Phạm Vi Của Biến (Variable Scope)
- Biến cục bộ (Local Scope): Tất cả các tham số và biến được tạo ra bên trong phạm vi của hàm đều là biến cục bộ. Chúng sẽ "chết" (bị xóa sạch khỏi bộ nhớ) ngay khi hàm kết thúc nhiệm vụ và hoàn toàn không thể truy cập từ bên ngoài.
- Biến toàn cục (Global Scope): Biến được tạo ra ở ngoài hàm thì bên trong hàm có thể đọc được. Tuy nhiên, hàm không thể tự ý thay đổi giá trị của biến toàn cục trừ khi sử dụng từ khóa global (lưu ý nên hạn chế dùng global để tránh làm rối loạn logic chương trình).
4. Thực Hành Ngay Trên VS Code
Đã đến lúc thực chiến với 2 bài tập thiết kế luồng dữ liệu cực kỳ thực tế:
Bài tập 1: Hàm tính tiền công làm thêm (Payroll Calculator)
- Định nghĩa hàm calculate_pay(hours_worked, hourly_rate=20) với hourly_rate có giá trị mặc định là 20.
- Bên trong hàm, tính tổng số tiền bằng công thức: total_pay = hours_worked * hourly_rate.
- Sử dụng return để trả về giá trị total_pay.
- Ở ngoài hàm, thực hiện gọi hàm 2 lần:
- Lần 1: Chỉ truyền hours_worked = 40 (để hàm tự động dùng mức giá mặc định).
- Lần 2: Truyền cả hours_worked = 40 và hourly_rate = 30.
- Hứng kết quả của cả 2 lần gọi hàm vào các biến thích hợp và in ra màn hình để kiểm tra.
Bài tập 2: Hàm phân tách họ và tên (Name Splitter)
- Định nghĩa hàm split_full_name(full_name_string).
- Bên trong hàm, sử dụng phương thức tách chuỗi có sẵn của Python để chia họ và tên qua khoảng trắng (Gợi ý: sử dụng .split()).
- Gán kết quả tách được vào 2 biến cục bộ first_name và last_name.
- Dùng một lệnh return duy nhất để trả về đồng thời cả 2 biến này.
- Ở ngoài hàm, thực hiện gọi hàm và hứng kết quả bằng cú pháp unpacking: my_first, my_last = split_full_name("John Doe") rồi in hai biến này ra màn hình để nghiệm thu kết quả.
Bạn đã nắm vững cách dùng cú pháp unpacking để hứng nhiều giá trị return từ hàm chưa? Hãy để lại bình luận nếu bạn gặp bất kỳ điểm thú vị nào trong quá trình thực hành nhé!
Bình luận