(ตอบ 23 พ.ย. 53 เวลา 19:48)
ฉันไม่ใช่ Pythoner ตัวใหญ่ แต่ฉันพบไวยากรณ์ครั้งเดียวลืมที่มาฉันจึงคิดว่าฉันบันทึกไว้:
หากคุณใช้sys.stdout.write
แทนprint
( ความแตกต่างเป็นsys.stdout.write
รับอาร์กิวเมนต์เป็นฟังก์ชันในวงเล็บ - แต่print
ไม่ได้ใช้ ) สำหรับหนึ่งซับคุณสามารถหลีกเลี่ยงการเรียงลำดับคำสั่งและfor
ลบเซมิโคลอนออก และล้อมรอบคำสั่งในวงเล็บเหลี่ยมเช่น:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
ไม่ทราบว่าจะเรียกไวยากรณ์นี้อย่างไรใน Python :)
หวังว่าจะช่วยได้
ไชโย!
(แก้ไขอ. 9 เม.ย. 20:57:30 น. 2013)ฉันคิดว่าในที่สุดฉันก็พบว่าวงเล็บสี่เหลี่ยมจัตุรัสเหล่านี้ในแบบเส้นเดียวคืออะไร พวกเขาคือ "รายการความเข้าใจ" (ชัด); ก่อนอื่นให้สังเกตสิ่งนี้ใน Python 2.7:
$ STR=abc
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); print a"
<generator object <genexpr> at 0xb771461c>
ดังนั้นคำสั่งในวงเล็บเหลี่ยม / วงเล็บถูกมองว่าเป็น "วัตถุเครื่องกำเนิด"; ถ้าเรา "วนซ้ำ" ผ่านมันโดยการเรียกnext()
- แล้วคำสั่งในวงเล็บจะถูกดำเนินการ (หมายเหตุ "abc" ในผลลัพธ์):
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); a.next() ; print a"
abc
<generator object <genexpr> at 0xb777b734>
ถ้าตอนนี้เราใช้วงเล็บเหลี่ยม - โปรดทราบว่าเราไม่จำเป็นต้องเรียกnext()
เพื่อให้คำสั่งดำเนินการมันจะดำเนินการทันทีที่ได้รับมอบหมาย แต่การตรวจสอบภายหลังพบว่าa
เป็นNone
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
สิ่งนี้ไม่ได้ให้ข้อมูลมากมายที่จะมองหาสำหรับตัวยึดแบบเหลี่ยม - แต่ฉันสะดุดหน้านี้ซึ่งฉันคิดว่าอธิบาย:
Python Tips and Tricks - First Edition - Python Tutorials | Dream.In.Code :
หากคุณจำได้ว่ารูปแบบมาตรฐานของตัวสร้างบรรทัดเดียวคือประเภท 'หนึ่ง' สำหรับ 'วนรอบในวงเล็บ สิ่งนี้จะสร้าง 'iterable' one-shot 'ซึ่งเป็นวัตถุที่คุณสามารถวนซ้ำในทิศทางเดียวและคุณไม่สามารถใช้ซ้ำได้เมื่อถึงจุดสิ้นสุด
'รายการความเข้าใจ' มีลักษณะเกือบจะเหมือนกับตัวสร้างบรรทัดเดียวปกติยกเว้นว่าเครื่องหมายวงเล็บ - () - ปกติจะถูกแทนที่ด้วยวงเล็บเหลี่ยม - [] ข้อได้เปรียบที่สำคัญของการทำความเข้าใจกับเอลิสต์คือการสร้าง 'รายการ' แทนที่จะเป็นวัตถุที่น่าเบื่อ 'One-shot' เพื่อให้คุณสามารถย้อนกลับไปมาเพิ่มองค์ประกอบต่างๆเรียงลำดับ ฯลฯ
และแน่นอนมันคือรายการ - มันเป็นเพียงองค์ประกอบแรกของมันจะกลายเป็นไม่มีทันทีที่มีการดำเนินการ:
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin].__class__"
abc
<type 'list'>
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin][0]"
abc
None
ความเข้าใจในรายการมีการบันทึกไว้เป็นอย่างอื่นใน5 โครงสร้างข้อมูล: 5.1.4 รายการความเข้าใจ - เอกสาร Python v2.7.4เป็น "รายการความเข้าใจให้วิธีการสร้างรายการที่กระชับ"; สันนิษฐานว่าเป็นที่ที่ "การปฏิบัติ" ของรายการที่ จำกัด เข้ามาเล่นในหนึ่ง liners
หวังว่าฉันจะไม่ทำเครื่องหมายที่นี่มากเกินไป ...
EDIT2: และนี่คือบรรทัดคำสั่งหนึ่งซับที่มีสองไม่ซ้อนกันสำหรับลูป; ทั้งสองที่อยู่ในวงเล็บเหลี่ยม "list comprehension":
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; b=[sys.stdout.write(str(x)) for x in range(2)] ; print a ; print b"
abc
01[None]
[None, None]
โปรดสังเกตว่าb
ตอนนี้"รายการ" ที่สองมีองค์ประกอบสองรายการเนื่องจากการวนซ้ำจะวิ่งสองครั้งอย่างชัดเจน แต่ผลจากการsys.stdout.write()
ในทั้งสองกรณีคือ None
(เห็นได้ชัด)