Cách truyền tham số dạng *args và **kwargs trong python
Thực sự thì không nhất thiết phải là *args và **kwargs. điều quan trọng là tham số có 1 dấu sao * hay là 2 dấu sao **. Đặt tên tham số là *var hay **vars hay bất cứ thứ gì bạn muốn.
Nhưng để dễ hiểu thì nên dùng tên chuẩn là *args và **kwargs
1. *args và **kwargs dùng để làm gì?
- Khi khai báo 1 hàm, sử dụng *args và **kwargs cho phép bạn truyền vào bao nhiêu tham số cũng được mà không cần biết trước số lượng.
Ví dụ:
//với giả sử các tham số truyền vào đều là số
def sum(*args):
total = 0
for number in args:
total += number
return total
// gọi hàm
sum(1, 2, 3,19)
sum( 1, 100)
2. *args và **kwargs khác gì nhau?
- Cho những bạn chưa biêt: Khi gọi hàm trong Python, có 2 kiểu truyền tham số:
- Truyền tham số theo tên.
- Truyền tham số bình thường theo thứ tự khai báo đối số.
Ví dụ
def register(name, password):
....
#Truyền tham số theo kiểu thông thường, phải theo đúng thứ tự
register( 'Coulson', 'hail_Hydra')
#Truyền tham số theo tên, Không cần phải theo thứ tự khai báo thao số
register( password='cookHim', name='Skye')
- *args nhận các tham số truyền bình thường. Sử dụng args như một list.
- **kwargs nhận tham số truyền theo tên. Sử dụng kwargs như một. dictionary
Ví dụ
def test_args(*args):
for item in args:
print item
>>test_args('Hello', 'world!')
Hello
world!
def test_kwargs(*kwargs):
for key, value in kwargs.iteritems():
print '{0} = {1}'.format(key, value)
>>test_kwargs(name='Dzung', age=10)
age = 10
name = Dzung
3. Thứ tự sử dụng và truyền tham số *args, **kwargs và tham số bình thường
Khi sử dụng phải khai báo đối số theo thứ tự:
đối số xác đinh --> *args --> **kwargs
Đây là thứ tự bắt buộc. Và khi truyền tham số bạn cũng phải truyền theo đúng thứ tự này. Không thể truyền lẫn lộn giữa 2 loại.
Khi sử dụng đồng thời *args **kwargs thì không thể truyền tham số bình thường theo tên
Ví dụ
def show_detail(name, *args, **kwargs):
.....
show_detail(name='Coulson', 'agent', age='40', level='A')
>>Error
def show_detail_2(name, **kwargs):
....
show_detail_2(name='Coulson', age='40', level='A')
>> Chạy Ok