Chúng ta sử dụng hai toán tử * (với tuple) và ** (với dictionary).

1. Tình huống

Xem xét một tình huống trong đó chúng ta có một hàm nhận bốn đối số. Chúng ta muốn thực hiện gọi hàm này và chúng ta có một list của size 4 có tất cả các đối số cho hàm. Nếu chúng ta chỉ đơn giản truyền list tới hàm, cuộc gọi sẽ không hoạt động.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------

# A Python program to demonstrate need  
# of packing and unpacking 
  
# A sample function that takes 4 arguments 
# and prints them. 
def fun(a, b, c, d): 
    print(a, b, c, d) 
  
# Driver Code 
my_list = [1, 2, 3, 4] 
  
# This doesn't work 
fun(my_list) 

Kết quả:

TypeError: fun() takes exactly 4 arguments (1 given)

Giải nén

Chúng ta có thể sử dụng toán tử * để giải nén list để tất cả các phần tử của nó có thể được truyền qua dưới dạng các tham số khác nhau.


# A sample function that takes 4 arguments 
# and prints the, 
def fun(a, b, c, d): 
    print(a, b, c, d) 
  
# Driver Code 
my_list = [1, 2, 3, 4] 
  
# Unpacking list into four arguments 
fun(*my_list) 

Kết quả:

(1, 2, 3, 4)

Một ví dụ khác, hãy xem xét hàm tích hợp range()cần các đối số bắt đầu và kết thúc riêng biệt. Nếu chúng không khả dụng một cách riêng biệt, hãy viết lệnh gọi hàm với 

*-operator để giải nén các đối số ra khỏi list hoặc tuple:


>>> 
>>> range(3, 6)  # normal call with separate arguments 
[3, 4, 5] 
>>> args = [3, 6] 
>>> range(*args)  # call with arguments unpacked from a list 
[3, 4, 5] 

Đóng gói

Khi chúng ta không biết có bao nhiêu đối số cần được truyền tới một hàm trong python, chúng ta có thể sử dụng Packing để đóng gói tất cả các đối số trong một tuple.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------


# A Python program to demonstrate use 
# of packing 
  
# This function uses packing to sum 
# unknown number of arguments 
def mySum(*args): 
    sum = 0
    for i in range(0, len(args)): 
        sum = sum + args[i] 
    return sum 
  
# Driver code 
print(mySum(1, 2, 3, 4, 5)) 
print(mySum(10, 20)) 

Kết quả:

15
30

Hàm mySum() trên đã đóng gói tất cả các đối số mà cuộc gọi phương thức này nhận được vào một biến đơn. Khi chúng ta có biến ‘đóng gói’ này, chúng ta có thể thực hiện mọi thứ với nó mà chúng ta có thể làm với một tuple bình thường. args[0] và args[1] lần lượt sẽ cung cấp cho bạn đối số thứ nhất và thứ hai. Vì các tuple của chúng ta là bất biến, bạn có thể truyền đổi args tuple thành một list để bạn cũng có thể sửa đổi, xóa và sắp xếp lại các mục trong đó.

2. Đóng gói và giải nén

Dưới đây là một ví dụ cho thấy cả tính đóng gói và giải nén.


# A Python program to demonstrate both packing and 
# unpacking. 
  
# A sample python function that takes three arguments 
# and prints them 
def fun1(a, b, c): 
    print(a, b, c) 
  
# Another sample function. 
# This is an example of PACKING. All arguments passed 
# to fun2 are packed into tuple *args. 
def fun2(*args): 
  
    # Convert args tuple to a list so we can modify it 
    args = list(args) 
  
    # Modifying args 
    args[0] = 'Geeksforgeeks'
    args[1] = 'awesome'
  
    # UNPACKING args and calling fun1() 
    fun1(*args) 
  
# Driver code 
fun2('Hello', 'beautiful', 'world!') 

Kết quả:

(Geeksforgeeks, awesome, world!)

sử dụng dictionary

# A sample program to demonstrate unpacking of 
# dictionary items using ** 
def fun(a, b, c): 
    print(a, b, c) 
  
# A call with unpacking of dictionary 
d = {'a':2, 'b':4, 'c':10} 
fun(**d) 

Kết quả

2 4 10

Ở đây ** đã giải nén từ điển được sử dụng cùng nó và truyền các mục trong từ điển dưới dạng đối số từ khóa cho hàm. Vì vậy, việc viết “fun(1, **d)” tương đương với việc viết “fun(1, b=4, c=10)”


# A Python program to demonstrate packing of 
# dictionary items using ** 
def fun(**kwargs): 
  
    # kwargs is a dict 
    print(type(kwargs)) 
  
    # Printing dictionary items 
    for key in kwargs: 
        print("%s = %s" % (key, kwargs[key])) 
  
# Driver code 
fun(name="cafedev", ID="101", language="Python") 

Kết quả:

<class 'dict'>
language = Python
name = cafedev
ID = 101

3. Các ứng dụng và các điểm quan trọng

1. Được sử dụng trong lập trình ổ cắm để gửi một số lượng lớn yêu cầu đến máy chủ.

2. Được sử dụng trong khung Django để gửi các đối số biến để xem các hàm.

3. Có các hàm bao bọc yêu cầu chúng ta truyền vào các đối số biến.

4. Sửa đổi các đối số trở nên dễ dàng, nhưng đồng thời xác nhận là không phù hợp, vì vậy chúng phải được sử dụng cẩn thận.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!