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