0Pricing
Python Academy · บทเรียน

ฟังก์ชันเจเนอเรเตอร์

สร้างค่าแบบประเมินเมื่อจำเป็นด้วย yield

ฟังก์ชันเจเนอเรเตอร์ เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

ตัวสร้างคืออะไร

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

def gen():
    yield 1
    yield 2
    yield 3

g = gen()
print(type(g).__name__)
print(list(g))

yield หยุดการทำงานชั่วคราว

ทุกครั้งที่คุณเรียก next() ฟังก์ชันจะทำงานจนพบ yield จากนั้นคืนค่าดังกล่าวและหยุดสถานะไว้ การเรียกครั้งถัดไปจะทำงานต่อจากตำแหน่งหลัง yield ทันที

def steps():
    print('start')
    yield 'a'
    print('resumed')
    yield 'b'

g = steps()
print(next(g))
print(next(g))

การวนซ้ำผ่านตัวสร้าง

เนื่องจากตัวสร้างเป็นตัววนซ้ำ ลูป for จะควบคุมการทำงานให้โดยอัตโนมัติและหยุดเมื่อตัวฟังก์ชันจบการทำงาน (ซึ่งจะทำให้เกิด StopIteration ภายใน)

def countdown(n):
    while n > 0:
        yield n
        n -= 1

for x in countdown(4):
    print(x)

การประเมินผลเมื่อร้องขอ

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

def naturals():
    n = 1
    while True:
        yield n
        n += 1

g = naturals()
print(next(g), next(g), next(g))

สถานะระหว่างการส่งค่า

ตัวแปรภายในจะคงค่าไว้ระหว่างจุด yield ตัวสร้างจะจดจำตำแหน่งที่หยุดทำงานไว้ได้เองตามธรรมชาติ โดยไม่ต้องจัดการดัชนีด้วยตนเอง

def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

g = fib()
print([next(g) for _ in range(7)])

ตัวสร้างเทียบกับการสร้างรายการ

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

def squares_list(n):
    result = []
    for i in range(n):
        result.append(i * i)
    return result

def squares_gen(n):
    for i in range(n):
        yield i * i

print(squares_list(5))
print(list(squares_gen(5)))

การหยุดก่อนถึงจุดสิ้นสุด

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

def naturals():
    n = 1
    while True:
        print('producing', n)
        yield n
        n += 1

for x in naturals():
    if x > 3:
        break
    print('got', x)

return ภายในตัวสร้าง

return ที่ไม่มีค่าภายในตัวสร้างจะจบการทำงานของตัวสร้าง (โดยทำให้เกิด StopIteration) ค่าที่คุณคืนมาจะกลายเป็นแอตทริบิวต์ value ของข้อยกเว้น ซึ่งลูปส่วนใหญ่จะไม่สนใจ

def up_to(stop):
    i = 0
    while True:
        if i >= stop:
            return
        yield i
        i += 1

print(list(up_to(4)))

ตัวสร้างใช้ได้ครั้งเดียว

เช่นเดียวกับตัววนซ้ำทั้งหมด ตัวสร้างจะถูกใช้จนหมดได้เพียงครั้งเดียว หลังจากสิ้นสุดแล้วจะไม่ส่งค่าใด ๆ อีก ให้เรียกใช้ฟังก์ชันอีกครั้งเพื่อรับตัวสร้างใหม่

def gen():
    yield 1
    yield 2

g = gen()
print(list(g))
print(list(g))
print(list(gen()))

การกรองด้วยตัวสร้าง

ตัวสร้างช่วยสร้าง pipeline ของข้อมูลที่กระชับและชัดเจน ในตัวอย่างนี้ เราจะส่งคืนเฉพาะจำนวนคู่ทีละจำนวน

def evens(numbers):
    for n in numbers:
        if n % 2 == 0:
            yield n

print(list(evens(range(10))))

การเชื่อมตัวสร้าง

ตัวสร้างหนึ่งสามารถใช้ค่าจากตัวสร้างอีกตัวได้ ทำให้สร้าง pipeline หลายขั้นที่แต่ละขั้นประเมินผลเมื่อร้องขอ

def numbers(n):
    for i in range(n):
        yield i

def doubled(src):
    for x in src:
        yield x * 2

print(list(doubled(numbers(5))))

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับฟังก์ชันตัวสร้าง

ทบทวน

คุณได้เรียนรู้ฟังก์ชันตัวสร้างแล้ว:

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

ถัดไปคือนิพจน์ตัวสร้างที่กระชับยิ่งขึ้น

คำถามที่พบบ่อย

บทเรียน “ฟังก์ชันเจเนอเรเตอร์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ฟังก์ชันเจเนอเรเตอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชันเจเนอเรเตอร์”

สร้างค่าแบบประเมินเมื่อจำเป็นด้วย yield คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ฟังก์ชันเจเนอเรเตอร์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โพรโทคอลตัววนซ้ำ
  2. ฟังก์ชันเจเนอเรเตอร์
  3. นิพจน์เจเนอเรเตอร์
  4. yield from และการมอบหมายงาน
← กลับไปที่ Python Academy