Kodokon kodokon.com

ฟังก์ชัน: def, พารามิเตอร์, return และขอบเขตตัวแปร

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

10 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

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

PYTHON
def net_price(price, tax_rate):
    total = price * (1 + tax_rate)
    return round(total, 2)

result = net_price(100, 0.2)
print(result)  # 120.0
ฟังก์ชันรับพารามิเตอร์สองตัวและส่งค่ากลับด้วย return

ค่าเริ่มต้น (default values) ทำให้ฟังก์ชันยืดหยุ่นโดยไม่ต้องสร้างเวอร์ชันแยกมากมาย จงประกาศมันไว้หลังพารามิเตอร์ที่จำเป็น ตอนเรียกใช้ อาร์กิวเมนต์แบบระบุชื่อ (keyword arguments) (currency="USD") จะบอกเจตนาของคุณอย่างชัดเจน ในโค้ดระดับมืออาชีพ คุณจะใช้มันทันทีที่ฟังก์ชันมีพารามิเตอร์มากกว่าสองตัว การเรียกจะอ่านเข้าใจได้ทันทีโดยไม่ต้องเปิดดูตัวฟังก์ชัน

PYTHON
def format_price(amount, currency="EUR", digits=2):
    return f"{amount:.{digits}f} {currency}"

print(format_price(19.9))                  # 19.90 EUR
print(format_price(19.9, currency="USD"))  # 19.90 USD
print(format_price(19.9, digits=0))        # 20 EUR
อาร์กิวเมนต์แบบระบุชื่อช่วยให้คุณระบุเฉพาะสิ่งที่เปลี่ยนไป
PYTHON
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

print(add_item("pen"))   # ['pen']
print(add_item("book"))  # ['book']
ด้วยรูปแบบ None การเรียกแต่ละครั้งจะเริ่มจากลิสต์ใหม่เสมอ

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

PYTHON
rate = 0.2

def apply_tax(price):
    return round(price * (1 + rate), 2)

def set_rate(new_rate):
    rate = new_rate  # local variable, no effect

print(apply_tax(100))  # 120.0
set_rate(0.1)
print(apply_tax(100))  # 120.0, the global is untouched
การอ่านตัวแปรส่วนกลางทำได้ แต่การกำหนดค่าให้มันจะสร้างตัวแปรเฉพาะที่

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. ฟังก์ชัน Python ที่ไม่มีคำสั่ง return จะคืนค่าอะไร?
    • 0
    • None
    • สายอักขระว่าง
    • เกิดข้อผิดพลาดขึ้น
  2. ทำไมคุณจึงควรเลี่ยง def add_item(item, items=[])?
    • ลิสต์ค่าเริ่มต้นถูกสร้างเพียงครั้งเดียวและถูกใช้ร่วมกันทุกการเรียก
    • ลิสต์ไม่สามารถใช้เป็นค่าเริ่มต้นได้
    • มันทำให้เกิด SyntaxError ตอนประกาศฟังก์ชัน
  3. จะเกิดอะไรขึ้นเมื่อคุณกำหนดค่าให้ตัวแปรภายในฟังก์ชัน ทั้งที่มีตัวแปรส่วนกลางชื่อเดียวกันอยู่?
    • Python แก้ไขตัวแปรส่วนกลาง
    • Python สร้างตัวแปรเฉพาะที่ ส่วนตัวแปรส่วนกลางยังคงเดิม
    • Python แจ้งข้อผิดพลาดเรื่องชื่อชนกัน