Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การบรรจุและการเปิดอาร์กิวเมนต์ใน Python?


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

  • ใช้ในฟังก์ชันแรปเปอร์ที่ต้องการให้เราส่งผ่านอาร์กิวเมนต์ตัวแปร