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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โพรโทคอลตัววนซ้ำ
- ฟังก์ชันเจเนอเรเตอร์
- นิพจน์เจเนอเรเตอร์
- yield from และการมอบหมายงาน