Trong Python, danh sách (mảng), bộ giá trị và từ điển có thể được mở rộng (giải nén) và các phần tử tương ứng của chúng có thể được chuyển cùng nhau dưới dạng đối số hàm.
Khi gọi một hàm, hãy chỉ định đối số bằng * cho danh sách và bộ giá trị và ** cho từ điển. Lưu ý số lượng dấu hoa thị *.
Các chi tiết sau đây được mô tả ở đây.
- Mở rộng (giải nén) một danh sách hoặc bộ dữ liệu với * (một dấu hoa thị)
- Đối với các hàm có đối số mặc định
- Đối với các hàm có đối số độ dài thay đổi
- Mở rộng (giải nén) từ điển với ** (hai dấu hoa thị)
- Đối với các hàm có đối số mặc định
- Đối với các hàm có đối số độ dài thay đổi
Xem bài viết sau để biết cách sử dụng cơ bản của các hàm Python, đối số mặc định và đối số có độ dài thay đổi với *, ** khi xác định hàm.
- CÓ LIÊN QUAN:Cách sử dụng và ghi chú các đối số mặc định trong các hàm Python
- CÓ LIÊN QUAN:Cách sử dụng đối số độ dài thay đổi trong Python(
*args
,**kwargs
)
Mở rộng (giải nén) một danh sách hoặc bộ dữ liệu với * (một dấu hoa thị)
Khi một danh sách hoặc bộ giá trị được chỉ định làm đối số với *, nó sẽ được mở rộng và mỗi phần tử được truyền dưới dạng một đối số riêng biệt.
def func(arg1, arg2, arg3):
print('arg1 =', arg1)
print('arg2 =', arg2)
print('arg3 =', arg3)
l = ['one', 'two', 'three']
func(*l)
# arg1 = one
# arg2 = two
# arg3 = three
func(*['one', 'two', 'three'])
# arg1 = one
# arg2 = two
# arg3 = three
t = ('one', 'two', 'three')
func(*t)
# arg1 = one
# arg2 = two
# arg3 = three
func(*('one', 'two', 'three'))
# arg1 = one
# arg2 = two
# arg3 = three
Giải thích sau đây dành cho một danh sách, nhưng điều tương tự cũng áp dụng cho một tuple.
Nếu số phần tử không khớp với số đối số, lỗi TypeError sẽ xảy ra.
# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'
# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given
Đối với các hàm có đối số mặc định
Nếu một đối số mặc định được đặt, thì đối số mặc định sẽ được sử dụng nếu số lượng phần tử không đủ. Nếu số lượng phần tử quá lớn, lỗi TypeError sẽ xảy ra.
def func_default(arg1=1, arg2=2, arg3=3):
print('arg1 =', arg1)
print('arg2 =', arg2)
print('arg3 =', arg3)
func_default(*['one', 'two'])
# arg1 = one
# arg2 = two
# arg3 = 3
func_default(*['one'])
# arg1 = one
# arg2 = 2
# arg3 = 3
# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given
Đối với các hàm có đối số độ dài thay đổi
Nếu một đối số có độ dài thay đổi được đặt, tất cả các phần tử sau phần tử cho đối số vị trí sẽ được chuyển cho đối số có độ dài thay đổi.
def func_args(arg1, *args):
print('arg1 =', arg1)
print('args =', args)
func_args(*['one', 'two'])
# arg1 = one
# args = ('two',)
func_args(*['one', 'two', 'three'])
# arg1 = one
# args = ('two', 'three')
func_args(*['one', 'two', 'three', 'four'])
# arg1 = one
# args = ('two', 'three', 'four')
Mở rộng (giải nén) từ điển với ** (hai dấu hoa thị)
Khi một dict từ điển được chỉ định làm đối số với **, các khóa phần tử sẽ được mở rộng dưới dạng tên đối số và giá trị dưới dạng giá trị đối số và mỗi khóa được truyền dưới dạng đối số riêng biệt.
def func(arg1, arg2, arg3):
print('arg1 =', arg1)
print('arg2 =', arg2)
print('arg3 =', arg3)
d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}
func(**d)
# arg1 = one
# arg2 = two
# arg3 = three
func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# arg2 = two
# arg3 = three
Nếu không có khóa nào khớp với tên đối số hoặc có khóa không khớp thì sẽ xảy ra lỗi TypeError.
# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'
# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'
Đối với các hàm có đối số mặc định
Hình ảnh trong đó chỉ các giá trị của tên đối số khớp với các khóa trong từ điển mới được cập nhật.
Một khóa không khớp với tên đối số sẽ dẫn đến lỗi TypeError.
def func_default(arg1=1, arg2=2, arg3=3):
print('arg1 =', arg1)
print('arg2 =', arg2)
print('arg3 =', arg3)
func_default(**{'arg1': 'one'})
# arg1 = one
# arg2 = 2
# arg3 = 3
func_default(**{'arg2': 'two', 'arg3': 'three'})
# arg1 = 1
# arg2 = two
# arg3 = three
# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'
Đối với các hàm có đối số độ dài thay đổi
Nếu các đối số có độ dài thay đổi được đặt, bất kỳ phần tử nào có khóa không phải là tên đối số được chỉ định làm đối số sẽ được chuyển đến đối số độ dài thay đổi.
def func_kwargs(arg1, **kwargs):
print('arg1 =', arg1)
print('kwargs =', kwargs)
func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three'}
func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three', 'arg4': 'four'}
func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg3': 'three'}