จุดสำคัญคือความเข้าใจในรายการจะสร้างรายการใหม่ เครื่องกำเนิดสร้างวัตถุที่ทำซ้ำได้ซึ่งจะ "กรอง" วัสดุต้นฉบับในขณะที่คุณใช้บิต
ลองนึกภาพคุณมีไฟล์บันทึกขนาด 2TB ชื่อ "hugefile.txt" และคุณต้องการเนื้อหาและความยาวสำหรับทุกบรรทัดที่ขึ้นต้นด้วยคำว่า "ENTRY"
ดังนั้นคุณลองเริ่มต้นด้วยการเขียนรายการความเข้าใจ:
logfile = open("hugefile.txt","r")
entry_lines = [(line,len(line)) for line in logfile if line.startswith("ENTRY")]
ซึ่งจะทำให้ไฟล์ทั้งไฟล์ประมวลผลแต่ละบรรทัดและจัดเก็บบรรทัดที่ตรงกันในอาร์เรย์ของคุณ อาร์เรย์นี้อาจมีเนื้อหามากถึง 2TB นั่นเป็น RAM จำนวนมากและอาจไม่เป็นไปตามวัตถุประสงค์ของคุณ
ดังนั้นเราจึงสามารถใช้เครื่องกำเนิดไฟฟ้าเพื่อใช้ "ตัวกรอง" กับเนื้อหาของเรา ไม่มีข้อมูลถูกอ่านจนกว่าเราจะเริ่มทำซ้ำผลลัพธ์
logfile = open("hugefile.txt","r")
entry_lines = ((line,len(line)) for line in logfile if line.startswith("ENTRY"))
ยังไม่ได้อ่านบรรทัดเดียวจากไฟล์ของเรา ที่จริงแล้วเราต้องการกรองผลลัพธ์ของเราให้ดียิ่งขึ้น:
long_entries = ((line,length) for (line,length) in entry_lines if length > 80)
ยังไม่มีการอ่านอะไรเลย แต่ตอนนี้เราได้ระบุเครื่องกำเนิดไฟฟ้าสองตัวที่จะทำงานกับข้อมูลของเราตามที่เราต้องการ
ให้เขียนบรรทัดที่กรองแล้วของเราไปยังไฟล์อื่น:
outfile = open("filtered.txt","a")
for entry,length in long_entries:
outfile.write(entry)
ตอนนี้เราอ่านไฟล์อินพุต ในขณะที่for
วงของเรายังคงร้องขอสายเพิ่มเติมตัวlong_entries
สร้างต้องการบรรทัดจากตัวentry_lines
สร้างโดยส่งคืนเฉพาะกลุ่มที่มีความยาวมากกว่า 80 อักขระ และในทางกลับกันentry_lines
เครื่องกำเนิดไฟฟ้าจะขอบรรทัด (กรองตามที่ระบุ) จากตัวlogfile
วนซ้ำซึ่งจะอ่านไฟล์
ดังนั้นแทนที่จะเป็นข้อมูล "ผลักดัน" ไปยังฟังก์ชันเอาต์พุตของคุณในรูปแบบของรายการที่มีประชากรเต็มคุณกำลังให้ฟังก์ชันเอาต์พุตเป็นวิธี "ดึง" ข้อมูลเมื่อจำเป็นเท่านั้น นี่คือในกรณีของเรามีประสิทธิภาพมากขึ้น แต่ไม่ค่อยยืดหยุ่น เครื่องกำเนิดไฟฟ้าเป็นทางเดียวหนึ่งรอบ; ข้อมูลจากไฟล์บันทึกที่เราอ่านจะถูกยกเลิกทันทีดังนั้นเราจึงไม่สามารถย้อนกลับไปยังบรรทัดก่อนหน้าได้ ในทางกลับกันเราไม่ต้องกังวลเกี่ยวกับการเก็บข้อมูลเมื่อเราดำเนินการเสร็จแล้ว
[exp for x in iter]
เป็นน้ำตาลได้list((exp for x in iter))
หรือ หรือมีความแตกต่างในการดำเนินการ?