Function

ใน 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

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus