Skip to content

Latest commit

 

History

History
115 lines (72 loc) · 8.06 KB

File metadata and controls

115 lines (72 loc) · 8.06 KB

User defined function

ในการเขียนโปรแกรมขนาดใหญ่ เรามักจะพบว่ามีการใช้งานชุดคำสั่งเดียวกันในหลาย ๆ ที่ ซึ่งทำให้ทำอาจะเกิดปัญหาในการใช้งานหรือการปรับปรุงแก้ไขโปรแกรมได้ในอนาคตเนื่องจากการที่มีชุดคำสั่งซ้ำ ๆ กันในหลาย ๆ ที่ทำให้เกิดปัญหาต่อไปนี้

  • การแก้ไขชุดคำสั่งทำได้ยาก
  • การทดสอบชุดคำสั่งทำได้ยาก (testing)
  • การใช้ชุดคำสั่งในโปรแกรมอื่น ๆ ทำได้ยาก (reusable)
  • โปรแกรมมีขนาดใหญ่

ดังนั้นภาษาคอมพิวเตอร์ส่วนมากจะมีวิธีในการรวบรวมชุดคำสั่งเข้าด้วยกันเพื่อความสะดวกในการเรียกใช้ชุดคำสั่งเดิม ๆ ซึ่งส่วนมากเรียกว่าฟังก์ชั่น (function), method หรือ procedure

ซึ่งใน Python มีวิธีการสร้างฟังก์ชั่นได้สองวิธีคือการสร้างฟังก์ชั่นแบบมีชื่อ (named function) และแบบไม่มีชื่อ (anonymous function หรือ lambda function)

Named 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 ไม่ได้ป้องกันการป้อนข้อมูลผิดพลาดได้ แต่เป็นการเตือนนักพัฒนามากกว่า

Function is a first class citizen

ในภาษา 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)