Computer >> Máy Tính >  >> Lập trình >> Python

Đóng gói và mở gói các đối số trong Python?

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.