หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
ฟังก์ชันขั้นสูง
ฟังก์ชันอาร์กิวเมนต์แบบแปรผัน
วัตถุประสงค์
จับสิ่งของที่ใช้ได้ทั้งหมดภายในโกดังและบรรจุในภาชนะจัดเก็บโดยใช้ฟังก์ชันที่มีอาร์กิวเมนต์แปรผัน
มีรายการอาหารจำนวนหนึ่งที่อยู่ในโกดังที่ต้องบรรจุเพื่อทำการขนส่งไปจำหน่าย เพื่อให้ทำงานนี้ได้อย่างมีประสิทธิภาพ คุณสามารถสร้างฟังก์ชันที่กำหนดเองที่มีจำนวนอาร์กิวเมนต์ที่แปรผันได้ ฟังก์ชันเหล่านี้ไม่มีจำนวนอาร์กิวเมนต์ที่กำหนดไว้และอนุญาตให้คุณตั้งค่าอาร์กิวเมนต์ได้เท่าที่ต้องการเพื่อดำเนินการทำงานของฟังก์ชัน
มีสอง (2) วิธีในการเพิ่มจำนวนอาร์กิวเมนต์แปรผันให้กับฟังก์ชัน ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ วิธีแรกคือการสร้างรายการอาร์กิวเมนต์ แทนที่จะใส่ชื่ออาร์กิวเมนต์หลาย ๆ ตัวให้ใส่เครื่องหมาย * ด้านหน้าชื่ออาร์กิวเมนต์ตัวเดียว ซึ่งจะสร้างรายการโดยอัตโนมัติ
def custom_function(message,*arguments):
player.speak(message)
return(arguments)
value = custom_function("lalala","one","two","three")
# The message "lalala" is printed on screen
# Value now returns the list ("one","two","three")
วิธีที่สองคือการวางอาร์กิวเมนต์ภายในพจนานุกรมแทนการสร้างรายการ วิธีนี้ทำในลักษณะเดียวกับวิธีก่อนหน้าแต่แทนที่จะใส่เครื่องหมาย * ตัวเดียว ให้ใส่เครื่องหมาย ** สองตัว ซึ่งจะสร้างพจนานุกรมโดยอัตโนมัติแทนรายการ
def custom_function(message,**arguments):
player.speak(message)
return(arguments)
value = custom_function("lalala", one = 1, two = 2, three = 3)
# The message "lalala" is printed on screen
# Value now returns the dictionary:
# {'one': 1, 'three': 3, 'two': 2}
ในการบรรจุรายการทั้งหมดสำหรับการขนส่ง ให้สร้างฟังก์ชันที่กำหนดเองสองชุด คือชุดสำหรับบรรจุรายการเดี่ยวและชุดสำหรับบรรจุรายการหลาย ๆ รายการเข้าด้วยกัน ใช้อาร์กิวเมนต์แปรผันในการบรรจุรายการที่หลากหลายเข้าด้วยกันโดยไม่ต้องสร้างฟังก์ชันมากเกินไป
def pack_singles(name,*items):
length = len(items)
player.speak("There are %d types of %s, those being:"
% (length, name) )
player.speak(items)
player.place(items)
def pack_multi(name,**items):
length = len(items)
player.speak("There are %d types of %s, those being:"
% (length, name) )
player.speak(items)
player.place(items)
มีรายการ 4 (4) ประเภทที่แตกต่างกันในสนาม: "jars" , "eggs" , "berries" และ "fruit". รวบรวมรายการทั้งหมดในโกดังแล้วเดินไปยังเครื่องหมาย X บนเส้นทางการขนส่ง เดินไปยังเครื่องหมาย X สีเข้มแล้วใช้ฟังก์ชัน pack_singles เพื่อบรรจุ "jars" และ "eggs"
สำหรับ "jars" มี 4 (4) ประเภทที่คุณรวบรวมและป้อนเป็นอาร์กิวเมนต์ ได้แก่ "white", "purple", "red" และ "brown". สิ่งเหล่านี้จะถูกบรรจุในภาชนะโดย green carpet. โค้ดจะถูกเขียนดังนี้: pack_singles("jars", "white", "purple", "red", "brown")
สำหรับ "eggs" มี 3 (3) ประเภทที่คุณรวบรวมและป้อนเป็นอาร์กิวเมนต์ ได้แก่ "white", "green", และ "blue". สิ่งเหล่านี้จะถูกบรรจุในภาชนะโดย orange carpet. ใช้รูปแบบเดียวกันกับการตั้งค่าก่อนหน้า
จากนั้นเดินไปยังเครื่องหมาย X สีอ่อนและใช้ฟังก์ชัน pack_multi เพื่อบรรจุ "berries" และ "fruit". สำหรับ "berries" มี 3 (3) ประเภทที่คุณรวบรวมและป้อนเป็นอาร์กิวเมนต์ ได้แก่ "red", "blue", และ "purple". สิ่งเหล่านี้จะถูกบรรจุในภาชนะโดย blue carpet. คุณต้องระบุปริมาณที่คุณรวบรวมของแต่ละรายการดังนี้: pack_multi("berries", red = 3 , blue = 2 , purple = 4 )
สำหรับ "fruit" มี 4 (4) ประเภทที่คุณรวบรวมและป้อนเป็นอาร์กิวเมนต์ ได้แก่ "apple", "pear", "orange", และ "peach". สิ่งเหล่านี้จะถูกบรรจุในภาชนะโดย red carpet. ใช้รูปแบบเดียวกันกับการตั้งค่าก่อนหน้า ตรวจสอบให้แน่ใจว่ารายการทั้งหมดถูกรวบรวมและบรรจุเพื่อที่จะผ่านด่านนี้