Nattawut Phetmak
Jack of all Trades
ใน Python การสร้างฟังก์ชันสามารถทำได้โดยคำสั่ง def
เช่นนี้ครับ
def my_function(name):
return 'hello {}.'.format(name)
ด้วยความที่เป็น dynamic type ทำให้เราไม่ต้องบอกประเภทของตัวแปรที่รับ/คืนจากฟังก์ชัน แต่ก็ทำให้เสียความสามารถของ method overloading ไป (ซึ่งถ้าอยากได้จริงๆ อาจลงมือเช็คเองโดยใช้คำสั่ง type()
ก็ได้)
และเช่นกันกับตอนแรกๆ ที่เราวน for
แทบทุกอย่างที่ตามหลังเครื่องหมาย :
ต้องขึ้นย่อหน้าใหม่พร้อม indent เพิ่ม และต้องมีคำสั่งด้วย … ถ้ายังคิดไม่ออก อย่าลืม pass ไปก่อนนะครับ
def do_nothing():
pass
อนึ่ง การแทรก string ไว้ทันทีหลัง def
ฟังก์ชัน Python จะเก็บมันไว้เป็น docs ด้วยครับ
def cube(x):
'input number, return cubic volume of input'
return x**3
def triangular_sum(n):
'''input stop number "n"
return sum 1 + 2 + 3 + ... + n
mathematics approach, O(1)'''
return n*(n+1) // 2
ซึ่งเราสามารถอ่าน docs ประจำ function ได้ในโหมด interactive shell โดยใช้คำสั่ง help()
help(cube)
# some description on cube function
และถ้าเราต้องการรู้ว่าเราได้สร้างฟังก์ชันอะไรขึ้นมาใช้แล้วบ้าง ก็สามารถเรียกดูได้โดยคำสั่ง dir()
dir()
# will return all class/module/function that imported
# __builtins__, __doc__, __name__, __package__
# this 4 are standard python3's class
การสร้างฟังก์ชันเพื่อ import มาใช้งาน ต้องเขียนไฟล์เก็บไว้เป็น filename.py
ครับ
โดยเมื่อตอนใช้งาน เราสามารถเรียกได้จาก import
เช่น สมมติเราเซฟงานด้านบนไว้ในชื่อ test.py
import test
print(test.cube(4))
# get: 64
หรือถ้าเรารู้สึกว่าชื่อเหล่านี้ยาวไป
import test as m
print(m.cube(5))
# get:125
ts = m.triangular_sum
print(ts(10))
# get: 55
หรือจะทำอย่างนี้ก็ได้ (แต่ไม่แนะนำ เพราะอาจเกิดการ lost ของ docs ประจำไฟล์)
from test import *
print(cube(7))
# get: 343
ทั้งนี้ มีข้อควรจำไว้อย่างหนึ่งว่า เมื่อเรา import
สำเร็จ การแก้ไข code ที่ไฟล์ต้นฉบับจะไม่ส่งผลต่อ code ที่ได้ import
เข้ามาแล้วนะครับ ถ้าอยากได้ใหม่ต้อง restart Python shell เอง
ถึงแม้ Python จะไม่รองรับ method overloading แต่ก็ได้จุดแข็งที่สามารถ init ตัวแปรได้นะครับ
def add(n, a=1):
'''add a to n, add 1 in case no a input'''
return n+a
print(add(5,5)) # 10
print(add(6)) # 7
และเรายังมี *args
และ **kwargs
ให้ใช้ด้วย
def sum(*args):
'''sum all arguments'''
out = 0
for i in args:
out += i
return out
print(sum(1,3,5,7,9))
# get: 25
def card(**dk):
'''print card's point'''
for c in dk:
print('{:5} = {:2}'.format(c,dk[c]))
card(a=1, jack=11, queen=12, king=13)
# will return this:
# a = 1
# king = 13
# queen = 12
# jack = 11