การเขียนและใช้งานฟังก์ชัน (Functions)
การเรียกใช้ฟังก์ชัน
ฟังก์ชัน (Function) คือชุดคำสั่งส่วนหนึ่งของโปรแกรมที่ทำงานเพื่อวัตถุประสงค์เฉพาะอย่าง
ฟังก์ชันในภาษา Python มีทั้ง Built-in ฟังก์ชันของภาษา Python เอง
และฟังก์ชันที่ผู้เขียนโปรแกรมเขียนขึ้นมา การใช้ฟังก์ชันในภาษา Python
จะคล้ายกับฟังก์ชันทางคณิตศาสตร์ คือ กำหนดชื่อฟังก์ชันตามด้วยสิ่งที่อยู่ในวงเล็บซึ่งเรียกว่า
Arguments ซึ่งอาจจะมีได้มากกว่า 1 และในภาษา Python
มีการกำหนดฟังก์ชันมาให้เรียกใช้ได้เลยอยู่บ้างแล้ว เช่น type(42)
คือ
การแสดงค่าประเภทของเลข 42 หรือ id(42)
คือการแสดงตำแหน่งที่อยู่ของเลข 42
ในหน่วยความจำ ดังตัวอย่างต่อไปนี้
>>> type(42)
<class 'int'>
>>> a = 1
>>> id(a)
1538021648
การเรียกใช้โมดูล (Modules)
โมดูล (Modules) คือ ฟังก์ชันที่รวมกันไว้เป็นหมวดหมู่
และสามารถดึงมาใช้ได้ในโปรแกรมได้ด้วยการ import
เช่น import math
และหากเรียกใช้ฟังก์ชัน dir(math)
จะแสดงฟังก์ชันในโมดูล math ออกมา
ดังตัวอย่างต่อไปนี้
>>> import math
>>> type(math)
<class 'module'>
>>> id(math)
56337632
การใช้งานโมดูลจะมีการใช้งานแบบ Dot Notation หากเห็นการเขียนโมดูล math ในลักษณะนี้
เช่น math.pi
ตัว pi
เรียกว่าเป็นตัวแปรที่อยู่ในโมดูล math
ซึ่งไม่ใช่ฟังก์ชัน
แต่ถ้าเขียน math.pow(2,2)
คือ สองยกกำลังสอง
ลักษณะนี้จะเป็นการเรียกใช้ฟังก์ชันที่อยู่ในโมดูล ดังตัวอย่างต่อไปนี้
>>> math.pi
3.141592653589793
>>> math.pow(2,2)
4.0
การใช้ฟังก์ชันไม่จำเป็นต้องใช้ฟังก์ชันแบบฟังก์ชันเดียว ฟังก์ชันใช้ฟังก์ชันซ้อนกันได้ คือ การรวมฟังก์ชันหลายๆ อันซ้อนกัน เรียกต่อๆ กันไปได้ ดังตัวอย่างต่อไปนี้
>>> 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 ได้
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='.')
Enter your age: 18
In 50 years from now, you will be 68.
ตัวแปรใดก็ตามที่จะใช้เป็น Local ให้ใส่คำว่า global
ไปด้านหน้าตัวแปรที่ถูกเรียกใช้ในฟังก์ชัน อันที่จริงแล้วจะไม่เขียนคำว่า global
ก็ได้หากชื่อตัวแปรไม่ซ้ำกันเลย
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')
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
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 เป็นดังต่อไปนี้
>>> 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)
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! แทน
ซึ่งมีลักษณะการเขียนดังนี้
def countdown(n):
if x > 0:
print(n, end=' ')
countdown(n-1)
else:
print('Go.', end=' ')
ซึ่งจะได้ผลลัพธ์ดังนี้
>>> countdown(5)
5 4 3 2 1 Go.
แบบฝึกหัด
ตั้งชื่อฟังก์ชัน
hello
เพื่อแสดงผลว่า สวัสดีคุณสร้างฟังก์ชันคำนวณพื้นที่ รับค่า ความกว้าง และ ความยาว
สร้างฟังก์ชันชื่อ
maximal_2
รับ arguments 2 ค่า และ return ค่าที่มากที่สุดออกมาสร้างฟังก์ชันชื่อ
maximal_3
รับ arguments 3 ค่า และ return ค่าที่มากที่สุดออกมาสร้างฟังก์ชันรับ arguments 3 ค่า และ return ผลคูณออกมา
สร้างฟังก์ชันรับค่าตัวเลขในหน่วยเมตรต่อวินาที แล้ว return ผลในหน่วยกิโลเมตรต่อชั่วโมง
สร้างฟังก์ชันหาผลต่างของรายรับกับรายจ่าย และส่งผลกลับมา