หากคุณเขียนโปรแกรมเล็กน้อยใน 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 เพื่อส่งอาร์กิวเมนต์ตัวแปรเพื่อดูฟังก์ชัน
-
ใช้ในฟังก์ชันแรปเปอร์ที่ต้องการให้เราส่งผ่านอาร์กิวเมนต์ตัวแปร