2.14. การกำหนดฟังก์ชัน

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

คีย์เวิร์ดคือ def:

def greet(name):
    print("hello,", name)

greet("Alice")
greet("Bob")

ผลลัพธ์:

hello, Alice
hello, Bob

บรรทัดที่ขึ้นต้นด้วย def คือ นิยาม -- มันสร้างฟังก์ชันแต่ไม่รันเนื้อหา การเรียก greet("Alice") คือสิ่งที่รันบล็อกที่เยื้องเข้า

2.14.1. พารามิเตอร์และอาร์กิวเมนต์

ชื่อในวงเล็บบนบรรทัด def คือ พารามิเตอร์ -- ตัวแทนสำหรับค่าที่ผู้เรียกจะส่งมา ค่าจริงที่ส่งเข้ามาคือ อาร์กิวเมนต์ ฟังก์ชันสามารถรับพารามิเตอร์ศูนย์ตัวขึ้นไป:

def square(x):
    return x * x

def add(a, b):
    return a + b

def is_even(n):
    return n % 2 == 0

การเรียกด้วยจำนวนอาร์กิวเมนต์ที่ผิดจะยก TypeError ทันที

2.14.2. return

คำสั่ง return สิ้นสุดฟังก์ชันทันทีและส่งค่ากลับไปยังผู้เรียก:

def absolute(x):
    if x < 0:
        return -x
    return x

ฟังก์ชันที่ไม่มีคำสั่ง return (หรือมี return เปล่าไม่มีค่า) จะคืน None:

>>> def shout(text):
...     print(text.upper())
...
>>> result = shout("hi")
HI
>>> print(result)
None

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

2.14.2.1. การคืนค่าหลายค่า

Python คืนหนึ่งอ็อบเจกต์ต่อการเรียก แต่อ็อบเจกต์นั้นสามารถเป็น tuple ได้ -- และผู้เรียกสามารถแกะมันได้ทันที:

def minmax(values):
    return (min(values), max(values))

lo, hi = minmax([3, 1, 4, 1, 5, 9])

วงเล็บรอบค่าที่คืนเป็นตัวเลือก; return a, b และ return (a, b) มีความหมายเหมือนกัน

2.14.3. Docstrings

string literal ที่วางเป็นคำสั่งแรกของเนื้อหาฟังก์ชันคือ docstring มันถูกเก็บไว้บนอ็อบเจกต์ฟังก์ชันและเป็นสิ่งที่ help() แสดง:

def scale(value, factor):
    """Multiply ``value`` by ``factor`` and return the result."""
    return value * factor

IDE แสดง docstrings ใน tooltip เมื่อเคอร์เซอร์วางอยู่เหนือชื่อฟังก์ชัน ดังนั้นแม้แต่สรุปบรรทัดเดียวก็คุ้มค่า สตริงที่ใช้เครื่องหมาย triple-quote ช่วยให้ docstring ยาวหลายบรรทัดเมื่อต้องการรายละเอียดเพิ่มเติม

2.14.4. ธรรมเนียมการตั้งชื่อ

ชื่อฟังก์ชันใช้ snake_case -- คำตัวพิมพ์เล็กคั่นด้วยขีดล่าง ชื่อควรอธิบายสิ่งที่ฟังก์ชันทำ:

  • ดี: read_temperature, parse_header, is_valid

  • หลีกเลี่ยง: do_stuff, handle1, temp_func

ขีดล่างนำหน้า (_helper) ทำเครื่องหมายฟังก์ชันว่าเป็น internal ของโมดูล ธรรมเนียมนี้ได้รับการเคารพอย่างกว้างขวางแต่ Python ไม่บังคับใช้