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