หากคุณเขียนโปรแกรมเล็กน้อยใน python คุณจะเห็นคำว่า "**args" และ "**kwargs" ในฟังก์ชันของ python แต่แท้จริงแล้วมันคืออะไร?
ตัวดำเนินการ * และ ** ดำเนินการต่างกันซึ่งประกอบกันขึ้นอยู่กับว่าเราใช้งานที่ไหน
เมื่อเราใช้พวกมันในการกำหนดเมธอด เช่น -
def __init__(self, *args, **kwargs): pass
การดำเนินการข้างต้นเรียกว่า 'packing' เนื่องจากบรรจุอาร์กิวเมนต์ทั้งหมดไว้ในตัวแปรเดียวที่การเรียกเมธอดนี้ได้รับใน tuple ที่เรียกว่า args เราสามารถใช้ชื่ออื่นที่ไม่ใช่ args ได้ แต่ args เป็นวิธีการทำสิ่งต่าง ๆ ที่ใช้กันทั่วไปมากที่สุด เพื่อให้เข้าใจว่าทำไมจึงต้องใส่ตัวแปรเดียว ให้พิจารณาตัวอย่างด้านล่าง:
สมมติว่าเรามีฟังก์ชันที่รับสามอาร์กิวเมนต์ และเรามีรายการขนาด 3 กับเราที่มีอาร์กิวเมนต์ทั้งหมดสำหรับฟังก์ชัน หากเราเพียงแค่พยายามส่งรายการไปยังฟังก์ชัน การโทรจะไม่ทำงานและเกิดข้อผิดพลาด
ตัวอย่างที่ 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) ผลลัพธ์
TypeError: func() missing 2 required positional arguments: 'b' and 'c'
เมื่อเราได้ตัวแปร 'เลือก' แล้ว คุณก็ทำสิ่งที่ทูเพิลปกติไม่สามารถทำได้ Args[0], args[1] และ args[2] จะให้อาร์กิวเมนต์ที่หนึ่ง สอง และสามตามลำดับ หากคุณแปลง args tuple เป็นรายการ ในขณะที่เราสามารถดำเนินการแก้ไข ลบ และแก้ไขรายการในนั้นได้
ในการส่งอาร์กิวเมนต์ที่แพ็กเหล่านี้ไปยังวิธีอื่น เราจำเป็นต้องทำการแตกไฟล์ -
def __init__(self, *args, **kwargs): #some code here car(VehicleClass, self).__init__(self, *args, **kwargs) #some code below
เรามีตัวดำเนินการ * อีกครั้ง แต่คราวนี้อยู่ในบริบทของการเรียกใช้เมธอด ตอนนี้สิ่งที่ทำคือระเบิดอาร์เรย์ args และเรียกเมธอดราวกับว่าตัวแปรแต่ละตัวเป็นอิสระ ด้านล่างนี้เป็นอีกตัวอย่างหนึ่งเพื่อความเข้าใจที่ชัดเจน -
ตัวอย่างที่ 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') ผลลัพธ์
HTML CSS JavaScript
จากผลลัพธ์ข้างต้น เราสามารถเปลี่ยนอาร์กิวเมนต์ทั้งสามก่อนที่จะส่งต่อไปยัง func1
ในทำนองเดียวกัน เราสามารถแก้ไขข้อความ TypeError ที่พบในตัวอย่างที่ 1
ตัวอย่าง: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) ผลลัพธ์
python java csharp
ดังนั้นในกรณีที่เราไม่ทราบว่าต้องส่งอาร์กิวเมนต์กี่รายการไปยังฟังก์ชัน python เราสามารถใช้การแพ็คเพื่อแพ็คอาร์กิวเมนต์ทั้งหมดในทูเพิลได้
#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)) ผลลัพธ์
Function with 2 arguments & Sum is: 21 Function with 5 arguments & Sum is: 20 Function with 6 arguments & Sum is: 196
ด้านล่างนี้เป็นอีกโปรแกรมหนึ่งที่สาธิตการใช้การบรรจุและการแกะทั้งสองอย่าง:
#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") ผลลัพธ์
Argument One: Hello Argument Two: TutorialsPoint Argument Three: Coding
ใช้ ** สำหรับพจนานุกรม
# 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) ผลลัพธ์
Dicionary first item: 27 Dictionary second item: 54 Dictionary third item: 81
แอพพลิเคชั่น
-
ใช้ในการเขียนโปรแกรมซ็อกเก็ตที่เราต้องส่งคำขอไปยังเซิร์ฟเวอร์ที่ไม่ทราบจำนวน (ไม่สิ้นสุด)
-
ใช้ในเว็บเฟรมเวิร์ก เช่น django เพื่อส่งอาร์กิวเมนต์ตัวแปรเพื่อดูฟังก์ชัน
-
ใช้ในฟังก์ชันแรปเปอร์ที่ต้องการให้เราส่งผ่านอาร์กิวเมนต์ตัวแปร