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

คีย์เวิร์ด yield

เขียนฟังก์ชันตัวสร้างด้วย yield สำหรับตัววนซ้ำแบบกำหนดเอง

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

บทนำ

ฟังก์ชันตัวสร้างใช้ `yield` เพื่อสร้างลำดับค่าแบบประเมินเมื่อจำเป็น โดยหยุดการทำงานชั่วคราวระหว่าง `yield` แต่ละครั้ง

yield คืออะไร

ฟังก์ชันที่มี `yield` เป็นฟังก์ชันตัวสร้าง การเรียก `next()` แต่ละครั้งจะทำงานต่อจาก `yield` ล่าสุด
def count_up(n):
    for i in range(n):
        yield i
for x in count_up(3):
    print(x)

ฟังก์ชันตัวสร้างเทียบกับฟังก์ชันปกติ

การเรียกฟังก์ชันตัวสร้างจะคืนค่าเป็นอ็อบเจกต์ตัวสร้าง และยังไม่เรียกใช้โค้ดใด ๆ โค้ดจะทำงานเมื่อคุณวนผ่านตัวสร้าง
def gen():
    print('start')
    yield 1
    print('middle')
    yield 2
g = gen()  # no print yet
print(next(g))  # 'start', then 1

ตัวสร้างแบบไม่สิ้นสุด

`def naturals(n=0): while True: yield n; n+=1` คือลำดับแบบไม่สิ้นสุด ให้ใช้ร่วมกับ `islice` หรือ `break`
def naturals(n=0):
    while True:
        yield n
        n += 1
import itertools
print(list(itertools.islice(naturals(), 5)))

yield from

`yield from sub_gen()` มอบหมายการทำงานให้ตัวสร้างย่อยและส่งต่อค่าทั้งหมด ซึ่งเทียบเท่ากับ `for x in sub: yield x`
def chain(*iters):
    for it in iters:
        yield from it
print(list(chain([1,2], [3,4], [5])))

การส่งค่าด้วย send()

`gen.send(value)` ทำงานต่อจากจุดหยุดของตัวสร้าง และส่งค่าที่จะกลายเป็นผลลัพธ์ของนิพจน์ `yield`
def accumulator():
    total = 0
    while True:
        n = yield total
        if n is None: break
        total += n
g = accumulator()
next(g)  # prime
print(g.send(10))
print(g.send(5))

สถานะของตัวสร้าง

ตัวสร้างจะหยุดที่ `yield` แต่ละครั้งและเก็บตัวแปรภายในไว้ระหว่างการเรียกแต่ละครั้ง จึงทำหน้าที่เป็นโครูทีนได้โดยธรรมชาติ
def stateful():
    seen = set()
    while True:
        item = yield
        seen.add(item)
        yield len(seen)
g = stateful()
next(g); g.send('a'); print(next(g)); g.send('b'); print(next(g))

การปิดตัวสร้าง

`gen.close()` จะโยน `GeneratorExit` ภายในตัวสร้าง ให้ใช้ `try/finally` ภายในตัวสร้างเพื่อจัดการล้างทรัพยากร
def resource_gen():
    try:
        while True:
            yield
    finally:
        print('cleaned up')
g = resource_gen()
next(g)
g.close()

StopIteration และการคืนค่า

`return value` ในตัวสร้างจะกำหนดค่าให้แอตทริบิวต์ value ของข้อยกเว้น `StopIteration` ซึ่ง `yield from` ใช้เพื่อดึงค่านั้น
def gen_with_return():
    yield 1
    yield 2
    return 'done'
g = gen_with_return()
try:
    while True: print(next(g))
except StopIteration as e:
    print('returned:', e.value)

ตัวสร้างฟีโบนัชชี

ตัวสร้างเหมาะอย่างยิ่งกับลำดับทางคณิตศาสตร์แบบไม่สิ้นสุด: `yield a; a, b = b, a+b`
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
import itertools
print(list(itertools.islice(fibonacci(), 10)))

ตัวสร้างเทียบกับคลาสที่มี __iter__

ตัวสร้างเขียนได้ง่ายกว่าการเขียนคลาสที่มี `__iter__` และ `__next__` ให้ใช้ตัวสร้างเมื่อต้องการลำดับที่ไม่ซับซ้อน
# Generator is simpler than:
# class Counter:
#     def __iter__(self): return self
#     def __next__(self): ...
print('generators simplify iterators')

ตรวจสอบความเข้าใจ

`yield from sub()` ทำอะไรในฟังก์ชันตัวสร้าง

ทบทวน

yield หยุดฟังก์ชันตัวสร้างชั่วคราว ฟังก์ชันตัวสร้างจะส่งคืนออบเจ็กต์ตัวสร้าง yield from มอบหมายการทำงานให้ตัวสร้างย่อย send() ส่งค่าเข้าไป ส่วน close() จะเรียกใช้การเก็บกวาดทรัพยากร

เรียนต่อไป

ยอดเยี่ยมมาก! โปรดเรียนบทถัดไปต่อเพื่อพัฒนาทักษะของคุณให้ลึกซึ้งยิ่งขึ้น

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

บทเรียน “คีย์เวิร์ด yield” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “คีย์เวิร์ด yield”

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

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

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

บทเรียน “คีย์เวิร์ด yield” ใช้เวลานานแค่ไหน

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

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

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

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

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