Positional arguments đóng vai trò quan trọng trong việc xây dựng và tương tác với các hàm trong Python. Việc sử dụng thành thạo loại đối số này là yếu tố then chốt để viết code rõ ràng và dễ bảo trì. Trong bài viết này mình sẽ giải thích cặn kẽ về positional arguments, với các ví dụ cụ thể giúp bạn nâng cao kỹ năng lập trình Python.
Positional Arguments trong Python là gì?
Positional arguments trong Python là cách chúng ta truyền dữ liệu vào hàm dựa trên thứ tự của các tham số khi định nghĩa hàm. Cụ thể, khi bạn khai báo một hàm, các biến được đặt trong cặp dấu ngoặc đơn ()
được gọi là tham số hình thức (formal arguments). Các tham số hình thức này thường được biết đến là tham số vị trí (positional arguments) bởi vì vị trí của chúng khi định nghĩa sẽ quyết định cách chúng ta truyền dữ liệu cho hàm.
Khi gọi một hàm, bạn cần lưu ý những điều sau về các tham số vị trí:
- Bắt buộc cung cấp đủ tham số: Bạn cần phải truyền đầy đủ giá trị cho tất cả các tham số hình thức đã được định nghĩa trong hàm.
- Số lượng tham số phải khớp: Số lượng tham số thực tế mà bạn truyền vào khi gọi hàm phải chính xác bằng số lượng tham số hình thức đã khai báo.
- Thứ tự truyền tham số quan trọng: Các giá trị được truyền vào hàm sẽ được gán cho các tham số hình thức theo đúng thứ tự mà các tham số này được định nghĩa.
- Kiểu dữ liệu phải tương thích: Kiểu dữ liệu của các tham số truyền vào cần phải phù hợp với kiểu dữ liệu mong đợi của các tham số hình thức.
- Tên tham số không cần giống nhau: Tên của các tham số hình thức và tên của các biến được truyền vào không nhất thiết phải giống nhau.
4 ví dụ về positional arguments trong Python
Tiếp theo, hãy cùng xem qua 4 ví dụ cụ thể để hiểu rõ hơn về cách sử dụng tham số vị trí:
Ví dụ 1
Đoạn code sau đây minh họa cách tham số vị trí hoạt động:
def hien_thi_thong_tin(ten, tuoi):
print ("Chào bạn {}! Năm nay bạn {} tuổi.".format(ten, tuoi))
ho_ten = "Nguyễn Văn A"
so_tuoi = 25
hien_thi_thong_tin(ho_ten, so_tuoi)
Kết quả khi chạy đoạn code trên sẽ như sau:
Chào bạn Nguyễn Văn A! Năm nay bạn 25 tuổi.
Giải thích code:
- Hàm
hien_thi_thong_tin
: có hai tham số hình thức (cũng là tham số vị trí):ten
(tên) vàtuoi
(tuổi). - Biến
ho_ten
: được gán giá trị là “Nguyễn Văn A”, vàso_tuoi
được gán giá trị là 25. - Khi gọi
hien_thi_thong_tin(ho_ten, so_tuoi)
: giá trị của biếnho_ten
sẽ được gán cho tham sốten
, vàso_tuoi
được gán chotuoi
. Thứ tự truyền tham số ở đây rất quan trọng. - Hàm sau đó sẽ: in ra thông tin người dùng.
Ví dụ 2
Python sẽ thông báo lỗi khi số lượng tham số bạn truyền vào không khớp với số lượng tham số đã được định nghĩa trong hàm. Ví dụ, nếu bạn định nghĩa một hàm có hai tham số vị trí, nhưng bạn chỉ truyền vào một tham số, bạn sẽ gặp phải lỗi. Hãy xem xét đoạn code sau:
def tinh_thuong(a, b):
thuong = a / b
print(thuong)
x = 20
tinh_thuong(x)
Kết quả, khi chạy đoạn code trên bạn sẽ nhận được thông báo lỗi như sau:
TypeError: tinh_thuong() missing 1 required positional argument: ‘b’
Giải thích code:
def tinh_thuong(a, b):
: Hàmtinh_thuong
được định nghĩa để nhận hai tham số vị trí làa
vàb
. Mục đích của hàm là tính thương (phép chia) của hai sốa
vàb
, sau đó in ra kết quả.x = 20
: Một biếnx
được khai báo và gán giá trị20
.tinh_thuong(x)
: Chúng ta gọi hàmtinh_thuong
nhưng chỉ truyền vào một tham sốx
, trong khi hàm được định nghĩa với hai tham sốa
vàb
. Đây chính là nguyên nhân gây ra lỗi.
Ví dụ 3
Tương tự như việc truyền thiếu tham số, nếu bạn cố tình truyền nhiều hơn số lượng tham số hình thức mà hàm yêu cầu, Python sẽ báo lỗi. Hãy xem qua hàm add
đơn giản sau đây:
def add(x, y):
z = x + y
print("x={} , y={} , x+y={}".format(x, y, z))
add(10, 20, 30)
Khi bạn chạy đoạn code trên, bạn sẽ gặp thông báo lỗi sau:
TypeError: add() takes 2 positional arguments but 3 were given
Giải thích Code và Diễn Giải Chi Tiết:
def add(x, y):
: Hàmadd
được định nghĩa với hai tham số hình thức làx
vày
, cả hai đều là tham số vị trí.z = x + y
: Hàm này chỉ đơn giản thực hiện phép cộng hai số và lưu kết quả vào biếnz
.print("x={} , y={} , x+y={}".format(x, y, z))
: Hàm sẽ in giá trị củax
,y
và tổngx+y
lên màn hình.add(10, 20, 30)
: Tại đây, khi gọi hàm, ta đã truyền vào 3 tham số (10, 20 và 30), trong khi hàmadd
chỉ được định nghĩa với hai tham số vị trí.TypeError: add() takes 2 positional arguments but 3 were given
: Thông báo lỗiTypeError: add() takes 2 positional arguments but 3 were given
cho thấy rõ ràng vấn đề: hàmadd
chỉ chấp nhận 2 tham số vị trí, nhưng thực tế lại được gọi với 3 tham số. Đây là một lỗi phổ biến mà người mới học lập trình hay mắc phải. Python kiểm tra chặt chẽ số lượng tham số, và sẽ không cho phép thực thi nếu bạn cố gắng truyền không đúng số lượng tham số.
Ví dụ 4
Một điểm quan trọng khác cần lưu ý về tham số vị trí (positional arguments) là kiểu dữ liệu của các tham số thực tế và các tham số hình thức tương ứng phải tương thích. Nếu không, chương trình sẽ báo lỗi. Hãy xem xét ví dụ sau, trong đó chúng ta cố gắng cộng một chuỗi (string
) và một số nguyên (integer
):
def add(x, y):
z = x + y
print(z)
a = "Xin chào " # Thay đổi a thành một chuỗi
b = 20
add(a, b)
Khi thực thi đoạn code trên, Python sẽ báo lỗi như sau:
z = x + y
~^~
TypeError: can only concatenate str (not “int”) to str
Giải thích code:
def add(x, y):
: Hàmadd
được định nghĩa với hai tham số hình thức làx
vày
. Cả hai tham số này đều là tham số vị trí.a = "Xin chào ", b = 20
: Biếna
được gán một chuỗi"Xin chào "
vàb
được gán giá trị số nguyên là20
.add(a, b)
: Chúng ta gọi hàmadd
và truyền vào các giá trịa
vàb
cho tham sốx
vày
tương ứng.TypeError: can only concatenate str (not "int") to str
: LỗiTypeError
xuất hiện vì Python không thể thực hiện phép cộng giữa một chuỗi và một số nguyên trực tiếp. Nó thông báo rằng bạn chỉ có thể ghép chuỗi với chuỗi, không thể ghép chuỗi với số nguyên.
Sự khác biệt giữa positional arguments và keyword arguments trong Python
Khi định nghĩa và sử dụng hàm trong Python, bạn có thể truyền dữ liệu vào hàm thông qua hai loại tham số chính: tham số vị trí và tham số từ khóa. Sự khác biệt cơ bản giữa hai loại tham số này được trình bày trong bảng dưới đây:
Tham Số Vị Trí (Positional Arguments) | Tham Số Từ Khóa (Keyword Arguments) |
Chỉ sử dụng tên của các tham số để truyền dữ liệu vào hàm. | Truyền tham số cho hàm bằng cách sử dụng cú pháp tên_tham_số = giá_trị. |
Thứ tự truyền tham số phải trùng khớp với thứ tự khai báo các tham số trong định nghĩa hàm. | Khi truyền tham số, thứ tự không quan trọng, bạn có thể thay đổi thứ tự của chúng |
Cú pháp: function(param1, param2, ...) | Cú pháp: function(param1=value1, param2=value2, ...) |
Lời kết
Vậy là chúng ta vừa cùng nhau tìm hiểu chi tiết về Positional Arguments trong Python, một khái niệm quan trọng giúp chúng ta truyền đối số vào hàm một cách có trật tự. Hy vọng qua bài viết này, bạn đã nắm vững cách sử dụng và vận dụng Positional Arguments để viết code Python hiệu quả hơn.