ในการเขียนโปรแกรมขนาดใหญ่ เรามักจะพบว่ามีการใช้งานชุดคำสั่งเดียวกันในหลาย ๆ ที่ ซึ่งทำให้ทำอาจะเกิดปัญหาในการใช้งานหรือการปรับปรุงแก้ไขโปรแกรมได้ในอนาคตเนื่องจากการที่มีชุดคำสั่งซ้ำ ๆ กันในหลาย ๆ ที่ทำให้เกิดปัญหาต่อไปนี้
- การแก้ไขชุดคำสั่งทำได้ยาก
- การทดสอบชุดคำสั่งทำได้ยาก (testing)
- การใช้ชุดคำสั่งในโปรแกรมอื่น ๆ ทำได้ยาก (reusable)
- โปรแกรมมีขนาดใหญ่
ดังนั้นภาษาคอมพิวเตอร์ส่วนมากจะมีวิธีในการรวบรวมชุดคำสั่งเข้าด้วยกันเพื่อความสะดวกในการเรียกใช้ชุดคำสั่งเดิม ๆ ซึ่งส่วนมากเรียกว่าฟังก์ชั่น (function), method หรือ procedure
ซึ่งใน Python มีวิธีการสร้างฟังก์ชั่นได้สองวิธีคือการสร้างฟังก์ชั่นแบบมีชื่อ (named function) และแบบไม่มีชื่อ (anonymous function หรือ lambda function)
การสร้าง named function ใช้คำสั่ง def ตามด้วยชื่อฟังก์ชั่นและวงเล็บ เช่น
def do_nothing():
passตัวอย่างด้านบนแสดงการสร้างฟังก์ชั่นอย่างง่าย ที่ประกอบไปด้วยชื่อ และชุดคำสั่งที่ประกอบด้วยคำสั่ง pass ซึ่งโปรแกรมจะไม่ทำอะไร
ซึ่งเราสามารถเรียกใช้ฟังก์ชั่นได้โดยใช้ชื่อของฟังก์ชั่นตามด้วยวงเล็บ เช่น
do_nothing()ซึ่งโปรแกรมจะไม่แสดงผลใด ๆ ทั้งนี้เราสามารถเขียนชุดคำสั่งที่ต้องการในฟังก์ชั่นได้ เหมือนกับการเขียนชุดคำสั่งทั่วไป เช่น
def do_nothing():
print("I'm doing nothin'."
do_nothing() # I'm doing nothin.ฟังก์ชั่นอาจจะส่งค่ากลับมายัง caller ได้หรือเรียกว่า return ค่าโดยใช้คำสั่ง return ดังตัวอย่าง
def double_it(number):
'''Return a number times two.
'''
return number * 2
value = double_it(4) # value will be 8.จากตัวอย่างข้างบน ค่า 8 (4 x 2) จะส่งกลับมาที่ตัวแปร value ทั้งนี้เมื่อฟังก์ชั่นรันคำสั่ง return จะหยุดการทำงานทันที ดังนั้นคำสั่งที่ต่อจากคำสั่ง return จะไม่ทำงาน
ข้อควรระวังเมื่อทำงานกับฟังก์ชั่นใน Python คือชนิดของข้อมูลที่เป็น parameter เนื่องจาก Python เป็นภาษาที่ dynamic ดังนั้นจะไม่มีการตรวจสอบชนิดของข้อมูล ทำให้บางครั้งอาจจะได้รับ output ที่ไม่เป็นตามต้องการได้เช่น
value = double_it('hello') # value will be 'hellohello'.จากตัวอย่างด้านบนจะพบว่าฟังก์ชั่นคืนค่าเป็น string ที่เชื่อมต่อกันสองชุด เนื่องจากเครื่องหมาย * ใน Python เมื่อใช้กับตัวหนังสือจะหมายถึงการเชื่อมต่อกัน
ซึ่งคุณสมบัติของฟังก์ชั่นที่สามารถทำงานกับชนิดข้อมูลได้หลากหลายนี้เรียกว่า polymorphism อย่างไรก็ตามหากเราต้องการเตือนผู้ใช้งานว่าชนิดของข้อมูลที่เราต้องการให้ใช้กับฟังก์ชั่นเป็นชนิดใด (type hint) เราสามารถกำหนดชนิดของข้อมูลได้ดังนี้
def double_it(number:int) -> int:
return number * 2
หากเราใช้ระบบที่สนับสนุน type hint เช่น Pycharm ระบบจะสามารถเตือนได้เมื่อเราใช้ parameter ผิดประเภท อย่างไรก็ตามเมื่อผู้ใช้ใช้โปรแกรม type hint จะไม่ได้ถูกนำมาพิจารณา
ดังนั้นการใช้ type hint ไม่ได้ป้องกันการป้อนข้อมูลผิดพลาดได้ แต่เป็นการเตือนนักพัฒนามากกว่า
ในภาษา Python ฟังก์ชั่นถือว่าเป็น first class citizen หมายความว่าเราสามารถปฏิบัติต่อฟังก์ชั่นเสมือนกับ object อื่น ๆ ทั่วไป เช่น เราสามารถ assign ฟังก์ชั่นให้กับตัวแปรได้
def double_it(number: int)->int:
return number * 2
times_two = double_it
value = times_two(4) # value will be 8.การสร้างฟังก์ชั่นที่ดีควรมีขนาดเล็ก ทำงานเฉพาะด้าน จึงจะเหมาะสมกับการทดสอบและการนำไปใช้งานได้หลากหลาย
ตัวอย่างฟังก์ชั่นที่ใช้คำนวณค่า BMI ชื่อว่า calculate_bmi โดยกำหนดให้ฟังก์ชั่นรับพารามิเตอร์ (parameter) สองค่าได้แก่น้ำหนักและส่วนสูง (weight, height)
def calculate_bmi(weight:int, height:int) -> float:
return weight / (height ** 2)เพื่อให้การคำนวณค่า BMI ถูกต้องเราอาจจะเพิ่มคำสั่งที่ช่วยตรวจสอบค่าดังนี้
def calculate_bmi(weight:int, height:int) -> float:
if weight is None or height is None:
print('Weight and height must be given.')
return
if weight < 0 or height < 0:
print('Invalid input: values cannot be negative.')
return None
return weight / (height ** 2)