ฟังก์ชั่นคือ block ของ code ที่จะรันเมื่อถูกเรียก เราสามารถใส่ data ที่เรียกว่า parameters เข้าไปในฟังก์ชั่นได้ โดยฟังก์ชั่นจะคืนค่า (return) เป็นผลลัพธ์

สร้างฟังก์ชั่น

ใน Python เราจะ define หรือให้นิยามฟังก์ชั่นด้วยใช้คีย์เวิร์ด def

def my_func():
  print(“Hello”)

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

วิธีการเรียกใช้ฟังก์ชั่น คือต้องเรียกชื่อของฟังก์ชั่นและตามด้วยเครื่องหมายวงเล็บเปิด-ปิด (parenthesis)

def my_func():
  print(“Hello”)

my_func()

output:
Hello

Arguments

ข้อมูลที่เราใส่ไปในฟังก์ชั่นเรียกว่า argument
argument จะถูก pass หรือถูกระบุในฟังก์ชั่นตามหลังชื่อฟังก์ชั่นด้านในวงเล็บ เราสามารถใส่ argument กี่อันก็ได้ แต่ต้องแยกมันด้วยเครื่องหมาย comma

def my_func(name):
  print(name + “Weasley”)

my_func(“Emily”)
my_func(“Langdon”)
my_func(“Dyland”)

output:

Emily Weasley
Langdon Weasley
Dyland Weasley

Parameters และ Arguments

คำว่าว่า parameter และ argument ใช้ในเรียกข้อมูลที่เรา pass เข้าไปในฟังก์ชั่นเหมือนกัน โดยมีความแตกต่างกันดังนี้

Parameter คือตัวแปรที่ปรากฏในเครื่องหมายวงเล็บในฟังก์ชั่น

Argument คือค่าที่ถูกส่งเข้าไปในฟังก์ชั่นเมื่อถูกเรียก

จำนวน Arguments

ปกติแล้วฟังก์ชั่นต้องถูกเรียกด้วยจำนวน argument ที่ถูกต้อง หมายความว่า หากในฟังก์ชั่นกำหนดมาว่าต้องมี 2 argument เป็นต้น เวลาเราเรียกใช้ฟังก์ชั่น เราก็ต้องเรียกใช้ฟังก์ชั่นพร้อม argument 2 จำนวนตามที่ฟังก์ชั่นกำหนด หากไม่ได้ใส่ argument ตามจำนวนที่กำหนดก็จะเกิด error

def my_func(name, surname):
  print(“My name is ” + name + “ ” + surname)

my_func(“Emily”, “Ross”)

output:

My name is Emily Ross

Arbitrary Arguments, *args

หากไม่รู้จะว่า pass กี่ argument ในฟังก์ชั่น ให้ใส่เครื่องหมายดอกจันทร์ (asterisk) หน้า parameter ข้างในวงเล็บของนิยามฟังก์ชั่น

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

def my_func(*dog):
  print(“My favourite dog is ” + dogs [2])

my_func(“Richard”, “Ellis”, “Spiky”, “Timothy”)

output:
My favourite dog is Spiky

คีย์เวิร์ด Arguments

เราสามารถส่ง argument ด้วยไวยากรณ์ (syntax) key = value ได้
วิธีนี้ลำดับของ argument จะไม่สำคัญ

def my_func(dog4, dog3, dog2, dog1):
  print(“My favourite dog is ” + dog3)

my_func(dog1 = “Richard”, dog2 = “Ellis”, dog3 = “Spiky”, dog4 = “Timothy”)

output:
My favourite dog is Spiky

Arbitrary Keyword Arguments, **kwargs

หาเราไม่รู้ว่ามี argument ทั้งหมดกี่ argument ที่จะผ่านข้อมูลเข้าไปในฟังก์ชั่น เราสามารถใส่ asterisk 2 อันด้านหน้า paramerter ในขั้นตอนการนิยามฟังก์ชั่น

เมื่อใช้วิธีนี้ ฟังก์ชั่นจะรับค่า argument เป็นค่าแบบ dictionary และสามารถเข้าถึงได้โดยระบุชื่อ key ของสมาชิกใน dictionary ที่ต้องการ

def my_func(**students):
  print(“The student last name is ” + students[“lastName”])

my_func(firstName = “Emily”, lastName = “Ross”)

output:
The student last name is Ross

Default Parameter Value

การตั้งค่า default parameter สำหรับฟังก์ชั่นที่ถูกเรียกโดยไม่มี argument ให้ใช้ค่า default ที่ตั้งไว้แทน

def my_func(country = “Thailand”)
  print(“I am from ” + country)

my_func(“England”)
my_func()
my_func(“Spain”)

output:
I am from England
I am from Thailand
I am from Spain

ส่งผ่าน List เป็น Argument

เราสามารถส่ง data ชนิดใดก็ได้เข้าไปเป็น argument ในฟังก์ชั่น เมื่อถูกส่งผ่านเข้าไปแล้ว data เหล่านั้นจะถูกใช้ในแบบชนิดของมัน เช่น หาก argument เป็น list เมื่อไปอยู่ในฟังก์ชั่นมันก็จะถูกใช้งานในรูปแบบ list

def my_func(food):
  for x in food:
    print(x)

fruits = [“mango”, “pineapple”, “apple”]

my_func(fruits)

output:
mango
pineapple
apple

Return Values

การคืนค่าหรือการให้ฟังก์ชั่นคืนค่า จำเป็นต้องใช้ statement ที่เรียกว่า return

def my_func(x):
  return 2 + x

print(my_func(2))
print(my_func(3))
print(my_func(4))

output:
4
5
6

The Pass Statement

การนิยามฟังก์ชั่นหรือ function definition จะว่างไม่ได้ ไม่เช่นนั้นจะเกิด error แต่หากมีเหตุจำเป็นที่จะต้องให้ฟังก์ชั่นนี้ว่างไปก่อน เราสามารถใช้ statement ที่ชื่อ pass ในฟังก์ชั่นเพื่อป้องกันการเกิด error เวลารันโปรแกรม

def my_func():
  pass

Recursion

Python รองรับ function recursion หมายความว่า นิยามฟังก์ชั่นนั้นจะเรียกตัวมันเอง

Recursion เป็นแนวคิดที่พบได้ทั่วไปทางคณิตศาสตร์และการเขียนโปรแกรม หมายถึงฟังก์ชั่นที่เรียกตัวเอง (call itself) ประโยชน์ในการใช้ฟังก์ชั่น recursion คือ เราสามารถ loop ผ่าน data ทั้งหมดจนได้ผลลัพธ์ที่ต้องการ

นักพัฒนาควรจะระมัดระวังการใช้เขียนฟังก์ชั่นแบบ recursion เพราะหากเกิดความผิดพลาดขึ้นมา โปรแกรมอาจจะรันตลอดไป คล้ายกับ infinite loop (ผลที่ได้คือรันจนเครื่องค้าง เป็นต้น) หรือโปรแกรมอาจจะใช้ความจำเครื่องมากเกินไป
อย่างไรก็ตาม หากเขียน recursion ได้ถูกต้อง ก็สามารถทำให้โปรแกรมนั้นมีประสิทธิภาพมาก

ตัวอย่าง recursive function

def f(k):
  if(k > 0):
    result = k + f(k - 1)
    print(result)
  else:
    result = 0
  return result

f(5)

output:
1
3
6
10
15	

คำอธิบายฟังก์ชั่น

ฟังก์ชั่น f มี 1 parameter และ argument 5 ถูกส่งผ่านเข้า parameter k
เงื่อนไขของฟังก์ชั่น หาก k มีค่ามากกว่า 0 ให้ตัวแปร result มีค่าเท่ากับ k + f(k-1)
จากนั้น print ตัวแปร result
กรณี k มีค่าเท่ากับ 0 ให้คืนค่าตัวแปร result

การทำงานของฟังก์ชั่น

ฟังก์ชั่นนี้ทำงานแบบกลับหลัง คือ คำนวณลึกลงไปเรื่อยๆ นำผลลัพธ์ที่ลึกที่สุดมาคำนวณในชั้นที่ตื้นขึ้นมา จนถึงชั้นบนสุด จึงจะได้ผลลัพธ์สุดท้าย
เนื่องจากเงื่อนไขของฟังก์ชั่นคือ k ต้องมีค่ามากกว่า 0 ดังนั้นค่าของ k จะลดลงเรื่อยๆ (ในเงื่อนไขของ f(k-1)) ทุกครั้งที่ฟังก์ชั้นทำงาน ค่าของ k จะลดลง 1 จนกว่าค่าของ k จะมีค่าเท่ากับ 0 ฟังก์ชั่นจึงจะคืนค่าตัวแปร result

เริ่มที่ 0 ก่อน เพราะเมื่อค่า k มีค่าเป็น 0 มันถูกกำหนดไว้ในเงื่อนไข else แล้วว่า ให้ result = 0 ดังนั้นเราจึงได้ค่า result = 0

ขั้นตอนต่อมา คือ กลับขึ้นไปหนึ่งชั้น เมื่อกี้ค่า k = 0 ทีนี้กลับมาที่ค่า k = 1 เนื่องจาก k มากกว่า 0
ตัวแปร result = 1 + f(k-1)

เนื่องจากขั้นตอนที่แล้ว ผลลัพธ์คืนค่าของฟังก์ชั่น ดังนั้นสามารถแทน f(k-1) ได้เท่ากับ 0
result = 1 + 0 
print result พิมพ์ค่าของตัวแปร result ซึ่งขณะนี้คือ 1
จากนั้นคืนค่า result หมายความว่า เมื่อเรียกฟังก์ชั่นครั้งต่อไป ผลลัพธ์ที่ได้จากการคืนค่าฟังก์ชั่นคือ 1

กลับขึ้นมาอีกหนึ่งชั้น ขณะนี้ k มีค่าเท่ากับ 2 นำ k และ ผลลัพธ์ที่ฟังก์ชั่นคืนค่ามาเข้าสมการ
result = 2 + 1
return result และค่าของ result คือ 3 

กลับขึ้นมาที่ชั้นต่อไป ขณะนี้ k มีค่าเท่ากับ 3 นำ k และ ผลลัพธ์ที่ฟังก์ชั่นคืนค่ามาเข้าสมการ
result = 3 + 3
return result และค่าของ result คือ 6

กลับขึ้นมาที่ชั้นต่อไป ขณะนี้ k มีค่าเท่ากับ 4 นำ k และ ผลลัพธ์ที่ฟังก์ชั่นคืนค่ามาเข้าสมการ
result = 4 + 6
return result และค่าของ result คือ 10

กลับขึ้นมาที่ชั้นต่อไป ขณะนี้ k มีค่าเท่ากับ 5 นำ k และ ผลลัพธ์ที่ฟังก์ชั่นคืนค่ามาเข้าสมการ
result = 5 + 10
return result และค่าของ result คือ 15

จบที่ชั้นที่ 5 เพราะ argument ที่เรียกคือ 5

การทำงานของฟังก์ชั่น recursion

การคำนวณอีกแบบหนึ่งเพื่อให้เห็นภาพการทำงานของฟังก์ชั่น recursion คือ การแจงฟังก์ชั่นแต่ละชั้นออกมาในรูปสามเหลี่ยม ชั้นของฟังก์ชั่นจะอยู่ด้านบน แต่ละชั้นให้เขียนค่า return ที่ได้จากชั้นก่อน ส่วนด้านล่างเป็นการนำค่า return ที่ได้ของฟังก์ชั่นชั้นก่อนมาคำนวณตามเงื่อนไข

จากตัวอย่างด้านบน เงื่อนไขคือนำค่า return ที่ได้มาบวกด้วยค่า k ของแต่ละชั้น ซึ่งค่า k ของแต่ละชั้นถูกลดน้อยลงชั้นละหนึ่ง เมื่อคำนวณย้อนกลับจากชั้นที่ลึกสุดขึ้นมาด้านบน จึงเป็นการบวกค่า k จากชั้นลึกสุดที่มีค่าน้อยสุดคือ บวกด้วยหนึ่ง จากนั้นขยับขึ้นมาเป็น สอง สาม สี่ และห้า ตามลำดับ

จบการบันทึกการเรียนที่ฟังก์ชั่น recursion ซึ่งค่อนข้างซับซ้อน และอาจไม่พบฟังก์ชั่นแบบนี้บ่อยสักเท่าไหร่ แม้จะเป็นการเขียนฟังก์ชั่นที่มีประสิทธิภาพมากก็ตาม