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

นิพจน์เจเนอเรเตอร์

เขียนกระบวนการประมวลผลแบบประเมินเมื่อจำเป็นให้กระชับ

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

จากการสร้างรายการแบบย่อสู่นิพจน์ตัวสร้าง

นิพจน์ตัวสร้างมีลักษณะเหมือนการสร้างรายการแบบย่อ แต่ใช้วงเล็บแทนวงเล็บเหลี่ยม นิพจน์นี้จะสร้างค่าเมื่อมีการร้องขอ แทนที่จะสร้างรายการทั้งหมดในครั้งเดียว

list_comp = [x * x for x in range(5)]
gen_expr = (x * x for x in range(5))
print(list_comp)
print(gen_expr)
print(list(gen_expr))

ความแตกต่างด้านหน่วยความจำ

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

import sys
lst = [x for x in range(10000)]
gen = (x for x in range(10000))
print('list bytes:', sys.getsizeof(lst))
print('gen bytes:', sys.getsizeof(gen))

การวนซ้ำนิพจน์ตัวสร้าง

คุณใช้ค่านิพจน์ตัวสร้างได้เหมือนตัววนซ้ำทั่วไป โดยใช้ลูป for, next() หรือส่งนิพจน์นี้ให้ฟังก์ชัน

gen = (c.upper() for c in 'hello')
for ch in gen:
    print(ch)

การกรองด้วย if

เพิ่มเงื่อนไข if เพื่อเก็บเฉพาะรายการที่ตรงกันได้เช่นเดียวกับการสร้างรายการแบบย่อ

evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))

การส่งให้ฟังก์ชันโดยตรง

เมื่อนิพจน์ตัวสร้างเป็นอาร์กิวเมนต์เพียงตัวเดียวของฟังก์ชัน คุณสามารถละวงเล็บที่เกินมาได้ วิธีนี้กระชับและไม่ต้องสร้างรายการชั่วคราว

total = sum(x * x for x in range(5))
print(total)
biggest = max(len(w) for w in ['a', 'abc', 'ab'])
print(biggest)

ย้ำเรื่องการใช้ครั้งเดียว

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

gen = (x for x in range(3))
print(list(gen))
print(list(gen))

การเชื่อมนิพจน์

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

nums = (n for n in range(10))
evens = (n for n in nums if n % 2 == 0)
doubled = (n * 2 for n in evens)
print(list(doubled))

any() และ all()

นิพจน์ตัวสร้างเหมาะอย่างยิ่งกับ any() และ all() เพราะสามารถหยุดการประเมินได้ทันทีเมื่อทราบคำตอบแล้ว

words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))

ลูปซ้อนกัน

เช่นเดียวกับการสร้างรายการแบบย่อ นิพจน์ตัวสร้างรองรับเงื่อนไข for หลายรายการ โดยอ่านจากซ้ายไปขวา

pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))

ตัวอย่าง pipeline แบบประเมินผลเมื่อร้องขอ

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

lines = ['  alpha ', '', '  beta', 'gamma  ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))

ควรเลือกแบบใด

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

data = range(6)
as_list = [x + 1 for x in data]
print(as_list[0], as_list[-1])
total = sum(x + 1 for x in data)
print(total)

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

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

ทบทวน

คุณได้เรียนรู้นิพจน์ตัวสร้างแล้ว:

  • ใช้วงเล็บเป็นทางเลือกแบบประเมินผลเมื่อร้องขอแทนการสร้างรายการแบบย่อ
  • นิพจน์เหล่านี้ช่วยประหยัดหน่วยความจำ และรองรับตัวกรอง if กับลูปซ้อนกัน
  • ใช้ร่วมกับ sum, any, all และการเชื่อมต่อได้ดี
  • นิพจน์เหล่านี้ใช้ได้ครั้งเดียว

ถัดไปคือการประกอบตัวสร้างด้วย yield from

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

บทเรียน “นิพจน์เจเนอเรเตอร์” ฟรีหรือไม่

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

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

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

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

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

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

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

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

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

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

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