คำตอบที่รวดเร็ว:
การทำlist()รอบ ๆ นิพจน์เครื่องกำเนิดไฟฟ้านั้น (เกือบ) เทียบเท่ากับการมี []วงเล็บล้อมรอบ ใช่คุณสามารถทำได้
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
แต่คุณก็ทำได้เช่นกัน
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
ใช่นั่นจะเปลี่ยนนิพจน์ตัวสร้างเป็นความเข้าใจรายการ มันเป็นสิ่งเดียวกันและรายการโทร () อยู่บนนั้น ดังนั้นวิธีสร้างนิพจน์ของเครื่องกำเนิดไฟฟ้าลงในรายการคือการใส่วงเล็บไว้รอบ ๆ
คำอธิบายโดยละเอียด:
นิพจน์กำเนิดเป็น "เปล่า" forการแสดงออก ชอบมาก:
x*x for x in range(10)
ตอนนี้คุณไม่สามารถยึดติดกับมันได้ด้วยตัวเองคุณจะได้รับข้อผิดพลาดทางไวยากรณ์ แต่ใส่วงเล็บไว้รอบ ๆ ก็ได้
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
บางครั้งเรียกว่าความเข้าใจของเครื่องกำเนิดไฟฟ้าแม้ว่าฉันคิดว่าชื่ออย่างเป็นทางการยังคงเป็นนิพจน์ของเครื่องกำเนิดไฟฟ้า แต่ก็ไม่มีความแตกต่างกันเลยมีเพียงวงเล็บเพื่อทำให้ไวยากรณ์ถูกต้อง คุณไม่จำเป็นต้องใช้หากคุณส่งผ่านเป็นพารามิเตอร์เดียวไปยังฟังก์ชันตัวอย่างเช่น:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
โดยพื้นฐานแล้วความเข้าใจอื่น ๆ ทั้งหมดที่มีอยู่ใน Python 3 และ Python 2.7 นั้นเป็นเพียงแค่น้ำตาลวากยสัมพันธ์รอบ ๆ นิพจน์ของเครื่องกำเนิดไฟฟ้า ตั้งค่าความเข้าใจ:
>>> {x*x for x in range(10)}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> set(x*x for x in range(10))
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
ความเข้าใจ Dict:
>>> dict((x, x*x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> {x: x*x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
และแสดงรายการความเข้าใจภายใต้ Python 3:
>>> list(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
ภายใต้ Python 2 ความเข้าใจในรายการไม่ได้เป็นเพียงแค่น้ำตาลวากยสัมพันธ์เท่านั้น แต่ข้อแตกต่างเพียงอย่างเดียวคือ x จะอยู่ภายใต้ Python 2 รั่วไหลเข้าสู่เนมสเปซ
>>> x
9
ในขณะที่อยู่ภายใต้ Python 3 คุณจะได้รับ
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
ซึ่งหมายความว่าวิธีที่ดีที่สุดในการพิมพ์เนื้อหาที่ดีของนิพจน์ตัวสร้างของคุณใน Python คือการสร้างความเข้าใจในรายการออกมา! อย่างไรก็ตามสิ่งนี้จะไม่ทำงานอย่างชัดเจนหากคุณมีวัตถุเครื่องกำเนิดไฟฟ้าอยู่แล้ว การทำเช่นนั้นจะสร้างรายการเครื่องกำเนิดไฟฟ้าหนึ่งเครื่อง:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
ในกรณีนี้คุณจะต้องโทรlist():
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
แม้ว่าจะได้ผล แต่ก็ค่อนข้างโง่:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]