การเขียนและใช้งานฟังก์ชัน (Functions)

การเรียกใช้ฟังก์ชัน

ฟังก์ชัน (Function) คือชุดคำสั่งส่วนหนึ่งของโปรแกรมที่ทำงานเพื่อวัตถุประสงค์เฉพาะอย่าง ฟังก์ชันในภาษา Python มีทั้ง Built-in ฟังก์ชันของภาษา Python เอง และฟังก์ชันที่ผู้เขียนโปรแกรมเขียนขึ้นมา การใช้ฟังก์ชันในภาษา Python จะคล้ายกับฟังก์ชันทางคณิตศาสตร์ คือ กำหนดชื่อฟังก์ชันตามด้วยสิ่งที่อยู่ในวงเล็บซึ่งเรียกว่า Arguments ซึ่งอาจจะมีได้มากกว่า 1 และในภาษา Python มีการกำหนดฟังก์ชันมาให้เรียกใช้ได้เลยอยู่บ้างแล้ว เช่น type(42) คือ การแสดงค่าประเภทของเลข 42 หรือ id(42) คือการแสดงตำแหน่งที่อยู่ของเลข 42 ในหน่วยความจำ ดังตัวอย่างต่อไปนี้

ตัวอย่าง Built-in ฟังก์ชันในภาษา Python
>>> type(42)
<class 'int'>
>>> a = 1
>>> id(a)
1538021648

การเรียกใช้โมดูล (Modules)

โมดูล (Modules) คือ ฟังก์ชันที่รวมกันไว้เป็นหมวดหมู่ และสามารถดึงมาใช้ได้ในโปรแกรมได้ด้วยการ import เช่น import math และหากเรียกใช้ฟังก์ชัน dir(math) จะแสดงฟังก์ชันในโมดูล math ออกมา ดังตัวอย่างต่อไปนี้

การเรียกใช้โมดูล math
>>> import math
>>> type(math)
<class 'module'>
>>> id(math)
56337632

การใช้งานโมดูลจะมีการใช้งานแบบ Dot Notation หากเห็นการเขียนโมดูล math ในลักษณะนี้ เช่น math.pi ตัว pi เรียกว่าเป็นตัวแปรที่อยู่ในโมดูล math ซึ่งไม่ใช่ฟังก์ชัน แต่ถ้าเขียน math.pow(2,2) คือ สองยกกำลังสอง ลักษณะนี้จะเป็นการเรียกใช้ฟังก์ชันที่อยู่ในโมดูล ดังตัวอย่างต่อไปนี้

การใช้งานโมดูลแบบ Dot Notation
>>> math.pi
3.141592653589793
>>> math.pow(2,2)
4.0

การใช้ฟังก์ชันไม่จำเป็นต้องใช้ฟังก์ชันแบบฟังก์ชันเดียว ฟังก์ชันใช้ฟังก์ชันซ้อนกันได้ คือ การรวมฟังก์ชันหลายๆ อันซ้อนกัน เรียกต่อๆ กันไปได้ ดังตัวอย่างต่อไปนี้

การเรียกใช้ฟังก์ชันแบบ Composition
>>> math.exp(math.log(3+2))
4.9999999999999

การสร้างฟังก์ชันในภาษา Python

การเขียนฟังก์ชันหรือสร้างฟังก์ชันขึ้นมาเองจะกระทำเพื่อต้องการให้โปรแกรมที่เขียนขึ้นมาทำงานเพื่อวัตถุประสงค์เฉพาะอย่าง ต้องใช้ def Statement ซึ่งย่อมาจาก Define (ตั้งค่า) เมื่อเขียนฟังก์ชันไว้ใน Source Code แล้วทำการ Run ฟังก์ชันนั้นจะถูก Define ไว้ในระบบแล้วถูกเรียกใช้ขึ้นมาได้เลย ด้วยการเรียกชื่อฟังก์ชันนั้นกี่ครั้งต่อกี่ครั้งก็ได้ ดังรูปแบบการเขียนต่อไปนี้ทั้งในแบบที่มีการคืนค่าและไม่มีการคืนค่า

รูปแบบการสร้างฟังก์ชัน
def function_name(args...):
   statement
   statement
   statement
   ...

def function_name(args...):
   statement
   statement
   statement
   ...
   return value

ส่วนวิธีการเรียกใช้ฟังก์ชันทำได้โดย เรียกชื่อฟังก์ชันนั้นตามด้วยวงเล็บซึ่งจะมี Arguments หรือไม่ก็แล้วแต่ฟังก์ชันที่กำหนดไว้ ดังตัวอย่างการเรียกใช้ฟังก์ชันที่สร้างขึ้นมาเองต่อไปนี้

ตัวอย่างฟังก์ชันที่สร้างขึ้นมาเอง
def happy_birthday_song():
   print('Happy Birthday.')
   print('Happy Birthday to you.')
ผลลัพธ์จากตัวอย่างการเรียกใช้ฟังก์ชันที่สร้างขึ้นมาเอง
>>> happy_birthday_song()
Happy Birthday.
Happy Birthday to you.

ขอบเขตของตัวแปร

วงเล็บ () เป็นการกำหนด Argument ของฟังก์ชัน ซึ่งจะกลายเป็นพารามิเตอร์ (Parameters) หรือตัวแปรที่ใช้ในฟังก์ชันนั้นๆ เท่านั้นและต้องประมวลผลให้เสร็จสิ้นในฟังก์ชัน หรือเรียกว่า Local Variables ตัวแปร Local นี้ จะไม่สามารถเรียกใช้ที่โปรแกรมหลักได้ และผู้เขียนโปรแกรมก็ไม่สามารถนำตัวแปรนี้ไปใช้ในฟังก์ชันอื่น ๆ ได้ ส่วนตัวแปร Global (Global Variables) จะประกาศไว้ในส่วนหลักของโปรแกรมที่เขียนขึ้น ฟังก์ชันย่อยและตัวโปรแกรมหลักสามารถเรียกใช้ตัวแปร Global ได้

ตัวอย่างการใช้ Local และ Global Variables
def newage(age): a = 50 #local
variable x = age + a #local variable return x

age = int(input('Enter your age: ')) #global variable print('In 50
years from now, you will be ', newage(age), end='.')
ผลลัพธ์ตัวอย่างการใช้ Local และ Global Variables
 Enter your age: 18
 In 50 years from now, you will be 68.

ตัวแปรใดก็ตามที่จะใช้เป็น Local ให้ใส่คำว่า global ไปด้านหน้าตัวแปรที่ถูกเรียกใช้ในฟังก์ชัน อันที่จริงแล้วจะไม่เขียนคำว่า global ก็ได้หากชื่อตัวแปรไม่ซ้ำกันเลย

ตัวอย่างการใช้ Global Variables
x = 5
def happy_birthday_song(name):
   global x
   print('Happy Birthday.')
   print('Happy Birthday.')
   print('Happy Birthday.')
   print('Happy Birthday to ' , name)
   print(x)
happy_birthday_song('Mike')
ผลลัพธ์ตัวอย่างการใช้ Global Variables
Happy Birthday.
Happy Birthday.
Happy Birthday.
Happy Birthday to Mike
5

ฟังก์ชัน return

ฟังก์ชันทุกอันจะต้อง return คือสิ้นสุดการทำงาน แต่ได้เว้นไว้ในฐานที่เข้าใจ เมื่อโปรแกรมไล่การทำงานมาถึงจุด return โปรแกรมจะหยุดทำงานทันทีทั้งๆ ที่ยังมีคำสั่งอื่นตามมาหลังจาก return อีกก็ตาม ฟังก์ชัน return ซึ่งไม่ได้คืน ค่าอะไรออกมาเรียกว่า Void

ตัวอย่างการใช้ return
x = 5
def happy_birthday_song(name):
   print('Happy Birthday.')
   return
   print('Happy Birthday.')
   print('Happy Birthday.')
   print('Happy Birthday to ' , name)
   print(x)

happy_birthday_song('Mike')
ผลลัพธ์ตัวอย่างการใช้ return
Happy Birthday.

การคืนค่าจากฟังก์ชัน

ฟังก์ชันสามารถ return ค่าได้ด้วย ดังเช่นตัวอย่างการหาพื้นที่สี่เหลี่ยม โดยกำหนดฟังก์ชันชื่อ rectangle_area(width, height) และฟังก์ชันมีพารามิเตอร์สองตัวสำหรับความกว้างและความยาวของสี่เหลี่ยม และฟังก์ชันทำการคืนค่า ผลลัพธ์ที่เป็นพื้นที่กลับไปด้วยคำสั่ง return

ตัวอย่างการหาพื้นที่สี่เหลี่ยม เป็นดังต่อไปนี้

ตัวอย่างการใช้ return ที่มีการส่งค่ากลับ
def happy_birthday_song(name):
   print('Happy Birthday.')
   print('Happy Birthday.')
   print('Happy Birthday.')
   print('Happy Birthday to ' , name)
   return name

def rectangle_area(width, height):
   return width * height  #การส่งค่ากลับ

x = rectangle_area(4, 3)
print('The area of rectangle is', str(x))

ผลลัพธ์ของตัวอย่างการหาพื้นที่สี่เหลี่ยม เป็นดังต่อไปนี้

ผลลัพธ์ตัวอย่างการใช้ return ที่มีการส่งค่ากลับ
The area of rectangle is 12

อีกตัวอย่างของฟังก์ชันที่สร้างขึ้นมาเองโดยมีการใช้ return

ตัวอย่างฟังก์ชันที่สร้างขึ้นมาเองโดยมีการใช้ return
def newage(age):
   x = age+50
   return x #การส่งค่ากลับ

age = int(input('Enter your age: '))
print('In 50 years from now, you will be ', newage(age), end='.')

ผลลัพธ์จากตัวอย่างฟังก์ชันที่สร้างขึ้นมาเองโดยมีการใช้ return เป็นดังต่อไปนี้

ผลลัพธ์จากตัวอย่างฟังก์ชันที่สร้างขึ้นมาเองโดยมีการใช้ return
>>> Enter your age: 6
In 50 years from now, you will be 56.

การเขียนโปรแกรมเชิงฟังก์ชัน (Functional Programming)

การเขียนโปรแกรมเชิงฟังก์ชัน (Functional Programming) เป็นรูปแบบการเขียนโปรแกรมที่เก่าแก่ที่สุดและเป็นรูปแบบที่กลับมาได้รับความนิยมมากในปัจจุบัน คือสร้างฟังก์ชันแล้วให้ฟังก์ชันทำงานร่วมกันโดยไม่มีการใช้ Global Variables เลย ฟังก์ชันหนึ่งทำงานส่งผลลัพธ์แก่อีกฟังก์ชันหนึ่งต่อๆ กันไปเรื่อยๆ ซึ่งภาษา Python สามารถใช้เขียนโปรแกรมแบบนี้ได้ ฟังก์ชันแล้ว return ค่าเป็นผลลัพธ์แก่อีกฟังก์ชันหนึ่งไปเรื่อยๆ

จากรูป ทำงานเหมือนกันกับ แล้ว แล้ว

จากรูป x=f(g(h(x))) ทำงานเหมือนกันกับ x = h(x) แล้ว x = g(x) แล้ว x = f(x)

Functional Programming
x = f(g(h(x)))
x = h(x)
x = g(x)
x = f(x)

ฟังก์ชันที่เรียกตัวเอง (Recursion)

Recursion คือการเรียกใช้ฟังก์ชันซ้อนฟังก์ชันนั้นๆ เอง หรือ ฟังก์ชันเรียกใช้ตัวมันเอง จากฟังก์ชัน countdown() ในตัวอย่าง เมื่อมีการเรียกฟังก์ชัน countdown(5) โปรแกรมจะทำงานลดหลั่นลงไปเรื่อยๆ คือตั้งแต่ 5, 4, 3, 2, 1 ตราบเท่าที่ n ยังมากกว่า 0 แต่เมื่อเงื่อนไขเป็นเท็จแล้ว โปรแกรมจะแสดงคำว่า Go! แทน ซึ่งมีลักษณะการเขียนดังนี้

ตัวอย่างการใช้ Recursion
def countdown(n):
   if x > 0:
      print(n, end=' ')
      countdown(n-1)
   else:
      print('Go.', end=' ')

ซึ่งจะได้ผลลัพธ์ดังนี้

ผลลัพธ์จากตัวอย่างการใช้ Recursion
>>> countdown(5)
5 4 3 2 1 Go.

แบบฝึกหัด

  1. ตั้งชื่อฟังก์ชัน hello เพื่อแสดงผลว่า สวัสดีคุณ

  2. สร้างฟังก์ชันคำนวณพื้นที่ รับค่า ความกว้าง และ ความยาว

  3. สร้างฟังก์ชันชื่อ maximal_2 รับ arguments 2 ค่า และ return ค่าที่มากที่สุดออกมา

  4. สร้างฟังก์ชันชื่อ maximal_3 รับ arguments 3 ค่า และ return ค่าที่มากที่สุดออกมา

  5. สร้างฟังก์ชันรับ arguments 3 ค่า และ return ผลคูณออกมา

  6. สร้างฟังก์ชันรับค่าตัวเลขในหน่วยเมตรต่อวินาที แล้ว return ผลในหน่วยกิโลเมตรต่อชั่วโมง

  7. สร้างฟังก์ชันหาผลต่างของรายรับกับรายจ่าย และส่งผลกลับมา