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

yield from และการมอบหมายงาน

ประกอบเจเนอเรเตอร์เข้าด้วยกัน

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

ปัญหาที่ yield from ช่วยแก้ไข

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

def manual():
    for x in [1, 2, 3]:
        yield x

print(list(manual()))

ทำความรู้จักกับ yield from

yield from iterable จะมอบหมายการทำงานให้สิ่งที่วนซ้ำได้นั้น และส่งคืนค่าของสิ่งนั้นทีละค่า วิธีนี้สั้นและชัดเจนกว่าลูปที่ส่งค่าต่อ

def delegate():
    yield from [1, 2, 3]

print(list(delegate()))

การรวมแหล่งข้อมูลหลายแหล่ง

คุณสามารถเชื่อมคำสั่ง yield from หลายคำสั่งเพื่อเชื่อมลำดับข้อมูลแบบประเมินผลเมื่อร้องขอ

def chained():
    yield from 'ab'
    yield from [1, 2]
    yield from range(2)

print(list(chained()))

การมอบหมายให้ตัวสร้างอื่น

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

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

def report(n):
    print('evens:')
    yield from evens(n)

print(list(report(6)))

การทำรายการซ้อนให้แบนราบ

การใช้งาน yield from แบบคลาสสิกคือการทำรายการซ้อนให้แบนราบแบบเรียกซ้ำ โดยใช้ตัวสร้างที่มอบหมายการทำงานให้ตัวเองเมื่อพบรายการย่อย

def flatten(items):
    for item in items:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

print(list(flatten([1, [2, [3, 4]], 5])))

yield from เทียบกับลูป

ทั้งสองเวอร์ชันด้านล่างให้ผลลัพธ์เหมือนกัน โดยทั่วไปเลือกใช้ yield from เพราะอ่านง่ายกว่า และยังส่งต่อความสามารถขั้นสูง เช่น การส่งค่าเข้าไปและผลลัพธ์ที่คืนกลับมา

def with_loop(src):
    for x in src:
        yield x

def with_yield_from(src):
    yield from src

print(list(with_loop(range(3))))
print(list(with_yield_from(range(3))))

การรับค่าที่ตัวสร้างย่อยคืนกลับมา

เมื่อตัวสร้างที่ได้รับมอบหมายใช้ return เพื่อคืนค่า yield from จะประเมินผลเป็นค่านั้น ทำให้ตัวสร้างย่อยสามารถรายงานผลลัพธ์ได้

def counter(n):
    count = 0
    for i in range(n):
        yield i
        count += 1
    return count

def driver():
    total = yield from counter(3)
    print('subgen yielded', total, 'items')

list(driver())

การสร้าง pipeline

การมอบหมายช่วยให้แบ่ง pipeline ออกเป็นขั้นที่มีชื่อและประกอบขั้นเหล่านั้นเข้าด้วยกันได้ง่าย

def source():
    yield from range(5)

def only_odd(src):
    for x in src:
        if x % 2 == 1:
            yield x

def pipeline():
    yield from only_odd(source())

print(list(pipeline()))

การมอบหมายให้สิ่งที่วนซ้ำได้ทุกชนิด

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

def mixed():
    yield from {1, 2, 3}
    yield from ('a', 'b')

result = list(mixed())
print(sorted(str(x) for x in result))

การรวมตัวสร้างตามลำดับ

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

def concat(*iterables):
    for it in iterables:
        yield from it

print(list(concat([1, 2], [3], [4, 5])))

ความชัดเจนในการอ่านโค้ด

สำหรับข้อมูลที่ซ้อนกันหลายชั้นหรือมีลักษณะเป็นต้นไม้ yield from ช่วยให้ตัวสร้างแบบเรียกซ้ำสั้นลงและสื่อเจตนาได้ชัดเจน

def walk(tree):
    yield tree['name']
    for child in tree.get('children', []):
        yield from walk(child)

tree = {'name': 'root', 'children': [
    {'name': 'a'},
    {'name': 'b', 'children': [{'name': 'c'}]}
]}
print(list(walk(tree)))

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

ทดสอบความเข้าใจของคุณเกี่ยวกับ yield from

ทบทวน

คุณได้เรียนรู้yield from และการมอบหมายแล้ว:

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

หลักสูตรถัดไป: การทำงานพร้อมกันด้วย threading และ multiprocessing

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

บทเรียน “yield from และการมอบหมายงาน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “yield from และการมอบหมายงาน”

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

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

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

บทเรียน “yield from และการมอบหมายงาน” ใช้เวลานานแค่ไหน

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

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

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

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

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