Tham số mặc định
Đặt vấn đề
Định nghĩa hàm tính tổng của 4 số nguyên:
#!/usr/bin/python def TinhTong(num1, num2, num3, num4): return (num1 + num2 + num3 + num4) print(TinhTong(3, 4, 2, 1))
Vấn đề được nảy sinh khi chỉ muốn tính tổng của 2 hoặc 3 số nguyên.
Có nhiều cách để giải quyết vấn đề này như định nghĩa thêm một hàm mới để tính tổng của 2 hoặc 3 số nguyên, hoặc sử dụng lại hàm trên bằng cách gọi hàm và truyền vào các tham số không cần thiết với giá trị là 0. Tuy nhiên cách giải quyết vấn đề như thế là chưa thật sự tối ưu.
Python hỗ trợ lập trình viên khai báo hàm với tham số mặc định nhằm giải quyết các vấn đề trên. Hàm có tham số mặc định giúp cho lập trình viên truyền ít tham số hơn khi gọi hàm.
Lưu ý: Một lưu ý nhỏ là vấn đề nêu trên chỉ là một trong các vấn đề có thể gặp phải khi không sử dụng hàm có tham số mặc định. Có thể tồn tại nhiều vấn đề khác mà tham số mặc định trong hàm sẽ giúp giải quyết nó.
Cú pháp
def function_name(arg1, arg2,..., argn, arg_df1 = value1, arg_df2 = value2,..., arg_dfn = valuen): function_body
Trong đó:
arg1
,arg2
,...,argn
là các tham số được khai báo bình thường.arg_df1
,arg_df2
, ...,arg_dfn
là các tham số có giá trị mặc định lần lượt làvalue1
,value2
,...,valuen
.
Một số lưu ý
Một lời gọi bất kỳ đến hàm này đều phải có đầy đủ các tham số ứng với arg1
, arg2
,..., argn
(không phải tham số có giá trị mặc định). Nhưng có thể có hoặc không các tham số có giá trị mặc định ứng với arg_df1
, arg_df2
, ..., arg_dfn
. Nếu tham số nào không có thì nó sẽ tự động gán với giá trị ngầm định đã khai báo.
Các tham số có giá trị mặc định phải được khai báo liên tục và xuất hiện cuối cùng trong danh sách tham số.
Giải quyết vấn đề
Sử dụng hàm có tham số mặc định.
#!/usr/bin/python def TinhTong(num1, num2, num3 = 0, num4 = 0): return (num1 + num2 + num3 + num4) print('Tong 4 so: ', TinhTong(3, 4, 2, 1)) print('Tong 3 so: ', TinhTong(3, 4, 2)) print('Tong 2 so: ', TinhTong(3, 4))
Kết quả in ra màn hình
Tong 4 so: 10 Tong 3 so: 9 Tong 2 so: 7
Một ví dụ khác
#!/usr/bin/python def printHello(str = 'World'): print ('Hello ' + str + '!') printHello() printHello('Python')
Kết quả in ra màn hình
Hello World! Hello Python!
Tham số sử dụng từ khoá (keyword arguments)
Khi sử dụng hàm có tham số mặc định ở cách trên sẽ tồn tại một điểm hạn chế là không thể truyền tham số mặc định thứ n vào được nếu như không truyền tham số mặc định thứ n - 1, n - 2,... Hiểu được sự hạn chế này, Python cho phép lập trình viên truyền bất kỳ tham số nào trong danh sách các tham số mặc định mà không cần phải truyền vào các tham số mặc định còn lại.
Ví dụ
#!/usr/bin/python def print_infomation(name = 'STDIO Training', email = 'N/A', messenger = 'm.me/training.stdio.vn'): info = \ 'Name: ' + name + '\n' +\ 'Email: ' + email + '\n' +\ 'Messenger: ' + messenger print(info) print_infomation(email = 'training@stdio.vn')
Kết quả in ra màn hình
Name: STDIO Training Email: training@stdio.vn Messenger: m.me/training.stdio.vn
Ví dụ trên thực hiện truyền giá trị vào tham số email
mà không cần phải truyền vào tham số trước nó là name
.