Mở rộng và chuyển danh sách, bộ giá trị và từ điển dưới dạng đối số hàm trong Python

Kinh doanh

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.

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'}