Nếu bạn đã thực hiện một chút lập trình trong python, bạn đã thấy từ “** args” và “** kwargs” trong các hàm của python. Nhưng chính xác thì chúng là gì?
Các toán tử * và ** đã thực hiện các phép toán khác nhau bổ sung cho nhau tùy thuộc vào nơi chúng ta đang sử dụng chúng.
Vì vậy, khi chúng ta đang sử dụng chúng trong định nghĩa phương thức, như -
def __init__(self, *args, **kwargs): pass
Thao tác trên được gọi là "pack" vì nó đóng gói tất cả các đối số vào một biến duy nhất mà lệnh gọi phương thức này nhận được thành một bộ giá trị gọi là args. Chúng ta có thể sử dụng tên khác ngoài args, nhưng args là cách làm phổ biến nhất và mang tính biểu tượng. Để hiểu lý do tại sao phải đặt một biến duy nhất, hãy xem xét ví dụ dưới đây:
Giả sử chúng ta có một hàm có ba đối số và chúng tôi có một danh sách kích thước 3 với tất cả các đối số cho hàm. Bây giờ, nếu chúng tôi chỉ cố gắng chuyển danh sách cho hàm, thì lệnh gọi sẽ không hoạt động và xảy ra lỗi.
Ví dụ 1
#function which takes three argument def func(a,b,c): print("{} {} {}".format(a, b, c)) #list of arguments lst = ['python', 'java', 'csharp'] #passing the list func(lst)
Kết quả
TypeError: func() missing 2 required positional arguments: 'b' and 'c'
Khi chúng tôi đã "chọn" biến, thì bạn sẽ thực hiện những điều không thể với một bộ giá trị thông thường. Args [0], args [1] và args [2] sẽ cho chúng ta đối số thứ nhất, thứ hai và thứ ba tương ứng. Nếu bạn chuyển đổi bộ args thành một danh sách thì chúng tôi có thể thực hiện thao tác sửa đổi, xóa và thay đổi các mục trong đó.
Để chuyển các đối số được đóng gói này sang một phương thức khác, chúng ta cần giải nén -
def __init__(self, *args, **kwargs): #some code here car(VehicleClass, self).__init__(self, *args, **kwargs) #some code below
Một lần nữa chúng ta có toán tử *, nhưng lần này là trong ngữ cảnh của một cuộc gọi phương thức. Điều cần làm bây giờ là phát nổ mảng args và gọi phương thức như thể mỗi biến là độc lập. Dưới đây là một ví dụ khác để hiểu rõ hơn -
Ví dụ 2
def func1(x, y, z): print(x) print(y) print(z) def func2(*args): #Convert args tuple to a list so we can do modification. args = list(args) args[0] = 'HTML' args[1] = 'CSS' args[2] = 'JavaScript' func1(*args) func2('Python', 'Java', 'CSharp')
Kết quả
HTML CSS JavaScript
Từ đầu ra ở trên, chúng tôi có thể thay đổi cả ba đối số trước khi chuyển chúng thành func1.
Tương tự, chúng ta có thể giải quyết thông báo TypeError trong example1.
Ví dụ:1_1
#function which takes three argument def func(a,b,c): print("{} {} {}".format(a, b, c)) #list of arguments lst = ['python', 'java', 'csharp'] #passing the list func(*lst)
Kết quả
python java csharp
Vì vậy, trong trường hợp chúng tôi không biết có bao nhiêu đối số cần được truyền cho một hàm python, chúng tôi có thể sử dụng tính năng đóng gói để đóng gói tất cả các đối số trong một bộ tuple.
#Below function uses packing to sum unknown number of arguments def Sum(*args): sum = 0 for i in range(0, len(args)): sum = sum + args[i] return sum #Driver code print("Function with 2 arguments & Sum is: \n",Sum(9, 12)) print("Function with 5 arguments & Sum is: \n",Sum(2, 3, 4, 5, 6)) print("Function with 6 arguments & Sum is: \n",Sum(20, 30, 40, 12, 40, 54))
Kết quả
Function with 2 arguments & Sum is: 21 Function with 5 arguments & Sum is: 20 Function with 6 arguments & Sum is: 196
Dưới đây là một chương trình khác để chứng minh việc sử dụng đóng gói và giải nén cả hai:
#function with three arguments def func1(x,y,z): print("Argument One: ",x) print("\nArgument Two: ",y) print("\nArgument Three: ",z) #Packing- All arguments passed to func2 are packed into tuple *args def func2(*args): #To do some modification, we need to convert args tuple to list args = list(args) #Modifying args[0] & args[1] args[0] = 'Hello' args[1] = 'TutorialsPoint' #Unpacking args and calling func1() func1(*args) #Driver code func2("I", "Love", "Coding")
Kết quả
Argument One: Hello Argument Two: TutorialsPoint Argument Three: Coding
Sử dụng ** cho từ điển
# Program to demonstrate unpacking of dictionary items using ** def func(x,y,z): print("Dicionary first item: ",x) print("\nDictionary second item: ",y) print("\nDictionary third item: ",z) d = {'x': 27, 'y': 54, 'z': 81} func(**d)
Kết quả
Dicionary first item: 27 Dictionary second item: 54 Dictionary third item: 81
Ứng dụng
-
Được sử dụng trong lập trình socket nơi chúng ta cần gửi số lượng yêu cầu không xác định (vô hạn) tới máy chủ.
-
Được sử dụng trong các khuôn khổ web như django để gửi các đối số biến để xem các hàm.
-
Được sử dụng trong các hàm trình bao bọc yêu cầu chúng ta truyền vào các đối số biến.