Kiểu dữ liệu Function trong Python - Packing và unpacking arguments

0

Unpacking arguments với *

Giả sử,  có một hàm sau:
 Hàm này gồm 4 parameter và không có default argument. Vậy nên khi gọi hàm này, bạn buộc phải đưa vào 4 argument.
Nhưng bạn có một vấn đề, 4 argument cần  truyền vào khi gọi hàm này lại nằm trong một List.
Ta chỉ việc gọi lại hàm và và lấy ra từng phần tử trong list tương ứng với 4 argument a,b,c,d
Nếu như có quá nhiều argument ,Python cho phép lấy ra từng phần tử đơn giản chỉ bằng một dấu *

Khi bạn sử dụng *, bạn không chỉ có thể unpack được các List mà bên cạnh đó bạn có thể unpack các container khác như TupleChuỗi, Generator, SetDict (chỉ lấy được key).

Lưu ý:
Pass argument bằng cách unpacking argument như thế này là đang truyền vào dưới dạng positional argument. Hãy cẩn thận sử dụng kĩ thuật này với những hàm có parameter dạng keyword-only argument.
Trong trường hợp container của bạn unpack các giá trị có trong container nhưng vẫn chưa đủ yêu cầu của hàm, thì bạn có thể truyền thêm:

Packing arguments với *

Khi bạn sử dụng packing argument. Đồng nghĩa với việc bạn nhờ  một biến đi gói tất cả các giá trị truyền vào cho hàm bằng positional argument thành một Tuple. Nếu không có gì để gói (bạn không truyền vào bất cứ argument nào) thì bạn sẽ nhận được một tuple rỗng. Để giao nhiệm vụ cho một biến làm công việc này, bạn đặt một dấu trước nó.
Nếu sau một packing parameter còn có những parameter khác, khi gọi hàm muốn truyền giá trị vào cho các parameter sau packing parameter bạn cần phải sử dụng keyword argument.
Lưu ý:

Bạn không nên nhầm lẫn việc này với việc force keyword-only argument
Không được phép để 2 parameter cùng làm nhiệm vụ packing argument trong một hàm


Nếu sau một packing parameter còn có những parameter khác, khi gọi hàm muốn truyền giá trị vào cho các parameter sau packing parameter bạn cần phải sử dụng keyword argument.
sau khi sử dụng keyword argument.

Unpacking arguments với **

vd: với 1 dict
Với Dict, thì nó phức tạp hơn một xíu khi mỗi  phần tử là một cặp key và value. Vậy nên một dấu * là không đủ nội công để unpack hết được các giá trị
 Do đó ta phải nhờ đến một cặp **.
Nếu bạn unpacking một Dictionary để truyền argument vào cho hàm khi gọi hàm thì đây chính là dạng keyword argument. Vậy nên bạn phải chắc chắn rằng parameter với key là giống nhau.

Packing arguments với **

Đã có unpacking với ** thì cũng phải có packing. Khác với dấu * là gói những positional argument thì ** lại gói các keyword argument. Và đương nhiên, nó sẽ gói trong một Dict. Nếu không truyền gì vào sẽ là một dict rỗng.
Tên biến key (viết gọn của keyword arguments) cũng là một quy ước đặt tên.
Lưu ý: bạn không được phép bỏ các positional parameter sau biến packing mà có ** giống như với *.

Tags

Post a Comment

0Comments
Post a Comment (0)