ฟังก์ชันใน Python: นิยาม เรียกใช้ และคืนค่า
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
ลองนึกถึงสูตรแพนเค้กที่คุณชอบที่สุด ทุกเช้าวันอาทิตย์ คุณทำตามขั้นตอนเดิม: ผสมแป้ง ตอกไข่ เทแป้ง แล้วพลิก คุณไม่ได้คิดสูตรใหม่ทุกครั้ง แค่ทำตามสูตรที่รู้อยู่แล้ว
ฟังก์ชันใน Python ทำงานเหมือนสูตรอาหารเลย คุณเขียนขั้นตอนไว้ครั้งเดียว ตั้งชื่อให้ แล้ว เรียก (call) ชื่อนั้นทุกครั้งที่ต้องการให้ขั้นตอนเหล่านั้นทำงานอีกครั้ง เขียนครั้งเดียว ใช้ได้ทุกที่
ในบทเรียนนี้ คุณจะได้เรียนวิธีสร้างฟังก์ชันของตัวเอง ส่งข้อมูลเข้าไป และรับผลลัพธ์กลับมา เมื่อจบบทเรียน คุณจะเขียนโค้ดที่สะอาดและนำกลับมาใช้ซ้ำได้เหมือนนักพัฒนาตัวจริง
วิธีนิยามฟังก์ชันแรกของคุณ
การสร้างฟังก์ชันใน Python ใช้คีย์เวิร์ด def ตามด้วยชื่อ วงเล็บ และเครื่องหมายทวิภาค (colon) ทุกอย่างที่เยื้องอยู่ข้างใต้เป็นส่วนหนึ่งของฟังก์ชันนั้น
(ไม่มีผลลัพธ์)
ถ้ารันโค้ดด้านบน จะไม่มีอะไรเกิดขึ้น เพราะการ นิยาม (define) ฟังก์ชันก็เหมือนการจดสูตรอาหาร ยังไม่มีอะไรถูกปรุงจนกว่าจะลงมือทำตามขั้นตอนจริง ๆ
ถ้าต้องการให้ฟังก์ชันทำงานจริง ให้ เรียก ฟังก์ชันโดยเขียนชื่อตามด้วยวงเล็บ:
Hello there! Welcome to Python.
ตอนนี้คุณเห็นผลลัพธ์แล้ว วงเล็บ () หลัง greet คือสิ่งที่บอก Python ให้รันฟังก์ชันจริง ๆ ถ้าไม่มีวงเล็บ Python ก็แค่มองสูตรอาหารโดยไม่ได้ลงมือปรุง
คุณเรียกฟังก์ชันกี่ครั้งก็ได้ตามต้องการ การเรียกแต่ละครั้งจะรันโค้ดทั้งหมดในฟังก์ชันจากบนลงล่าง
Hello there! Hello there! Hello there!
พารามิเตอร์และอาร์กิวเมนต์คืออะไร
ฟังก์ชัน greet() ของเราพูดแต่ประโยคเดิมเสมอ เหมือนสูตรที่ทำได้แค่แพนเค้กธรรมดา ถ้าอยากได้แพนเค้กบลูเบอร์รี่ล่ะ เราต้องมีวิธีส่งวัตถุดิบเข้าไป
ใน Python เราส่งข้อมูลเข้าไปในฟังก์ชันผ่าน พารามิเตอร์ (parameter) พารามิเตอร์คือชื่อตัวแปรที่เขียนไว้ในวงเล็บของการนิยามฟังก์ชัน เมื่อเรียกฟังก์ชัน ค่าจริงที่ส่งเข้าไปเรียกว่า อาร์กิวเมนต์ (argument)
Hello, Alice! Hello, Bob!
ในที่นี้ name คือ พารามิเตอร์ ซึ่งเป็นตัวยึดตำแหน่ง เมื่อเราเรียก greet('Alice') สตริง 'Alice' คือ อาร์กิวเมนต์ ซึ่งเป็นค่าจริงที่มาเติมลงในตัวยึดตำแหน่งนั้น
การคืนค่าทำงานอย่างไร
จนถึงตอนนี้ ฟังก์ชันของเราแค่แสดงผลออกมา แต่ส่วนใหญ่แล้ว เราต้องการให้ฟังก์ชัน คำนวณ อะไรบางอย่างแล้วส่งผลลัพธ์กลับมาให้ นั่นคือหน้าที่ของ return
ลองคิดแบบนี้: print() เหมือนการตะโกนบอกคำตอบออกมาดัง ๆ ส่วน return เหมือนการเขียนคำตอบลงกระดาษแล้วยื่นให้คนที่ถาม
8
คำสั่ง return ทำสองอย่าง: ส่งค่ากลับไปยังจุดที่เรียกฟังก์ชัน และออกจากฟังก์ชันทันที โค้ดใด ๆ หลัง return ในฟังก์ชันเดียวกันจะไม่ถูกรัน
8
def add(a, b):
print(a + b)
# Can't reuse the result
add(3, 5)def add(a, b):
return a + b
# Can store, reuse, combine
result = add(3, 5)
print(result * 2)การใช้พารามิเตอร์หลายตัว
ฟังก์ชันรับพารามิเตอร์ได้มากเท่าที่ต้องการ แค่คั่นด้วยเครื่องหมายจุลภาค เมื่อเรียกใช้ อาร์กิวเมนต์จะจับคู่กับพารามิเตอร์ตามลำดับ อาร์กิวเมนต์ตัวแรกไปที่พารามิเตอร์ตัวแรก ตัวที่สองไปที่ตัวที่สอง ต่อไปเรื่อย ๆ
Alice is 25 years old and lives in New York. Bob is 30 years old and lives in London.
ลำดับมีความสำคัญ ถ้าสลับอาร์กิวเมนต์ จะได้ผลลัพธ์ที่ไม่มีความหมายหรือเกิดข้อผิดพลาด introduce(25, 'Alice', 'London') จะพยายามใช้ 25 เป็นชื่อ
ค่าเริ่มต้นของพารามิเตอร์คืออะไร
บางครั้งคุณอยากให้พารามิเตอร์มีค่าสำรอง คือค่าเริ่มต้นที่สมเหตุสมผลซึ่งจะใช้เมื่อผู้เรียกไม่ได้ส่งค่ามาให้ กำหนดได้ด้วยเครื่องหมาย = ในการนิยามฟังก์ชัน
Hello, Alice! Hey, Bob!
เมื่อเรียก greet('Alice') พารามิเตอร์ greeting จะใช้ค่าเริ่มต้น 'Hello' แต่เมื่อเรียก greet('Bob', 'Hey') เราจะแทนที่ค่าเริ่มต้นด้วย 'Hey'
ฟังก์ชันเรียกใช้ฟังก์ชันอื่นได้หรือไม่
ได้ และนี่คือหนึ่งในแนวคิดที่ทรงพลังที่สุดในการเขียนโปรแกรม คุณสร้างฟังก์ชันเล็ก ๆ ที่ทำงานเฉพาะอย่าง แล้วนำมาประกอบกันเหมือนตัวต่อได้
25
ในที่นี้ sum_of_squares เรียก square สองครั้ง ฟังก์ชันเล็กแต่ละตัวทำงานง่าย ๆ เพียงอย่างเดียว เมื่อรวมกันก็แก้ปัญหาที่ใหญ่ขึ้นได้ วิธีนี้ทำให้โค้ดอ่าน ทดสอบ และแก้ไขได้ง่ายขึ้น
7 is odd 10 is even
แบบฝึกหัด
เขียนฟังก์ชันชื่อ say_hello ที่รับพารามิเตอร์ name และ แสดงผล Hello, <name>! (มีเครื่องหมายอัศเจรีย์ด้วย) ตัวอย่างเช่น say_hello('World') ควรแสดง Hello, World!
อ่านโค้ดด้านล่างอย่างละเอียด โปรแกรมจะแสดงผลอะไร พิมพ์ผลลัพธ์ให้ตรงทุกตัวอักษร
def double(x):
return x * 2
result = double(7)
print(result)
print(double(3))เขียนฟังก์ชันชื่อ area ที่รับ width และ height เป็นพารามิเตอร์ แล้ว คืนค่า ผลคูณของทั้งสอง (พื้นที่ของสี่เหลี่ยมผืนผ้า) ไม่ต้องแสดงผล ให้คืนค่าอย่างเดียว
ฟังก์ชันนี้ควรคืนค่าตัวเลขที่มากกว่าจากตัวเลขสองตัว แต่เมื่อรันกลับแสดงตัวเลขออกมาแล้วตามด้วย None แก้ให้ bigger(3, 7) คืนค่า 7 และ bigger(10, 5) คืนค่า 10
เขียนฟังก์ชันชื่อ celsius_to_fahrenheit ที่รับอุณหภูมิเป็นองศาเซลเซียส แล้ว คืนค่า อุณหภูมิที่แปลงเป็นองศาฟาเรนไฮต์ สูตรคือ F = C * 9/5 + 32 ให้คืนค่าผลลัพธ์เป็นทศนิยม (float) ซึ่งสูตรนี้ให้ผลเป็นทศนิยมอยู่แล้ว
เขียนฟังก์ชันชื่อ get_grade ที่รับคะแนน score เป็นตัวเลข (0-100) แล้ว คืนค่า เกรดตัวอักษรเป็นสตริง:
'A''B''C''D''F'