ความต่อเนื่องของบรรทัดสำหรับการทำความเข้าใจรายการหรือนิพจน์ตัวสร้างใน python


102

คุณควรจะแยกความเข้าใจในรายการที่ยาวมากได้อย่างไร?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

ฉันยังเคยเห็นที่ไหนสักแห่งที่คนที่ไม่ชอบใช้ '\' เพื่อแบ่งสาย แต่ไม่เคยเข้าใจว่าทำไม เหตุผลเบื้องหลังนี้คืออะไร?


คำตอบ:


143
[x
 for
 x
 in
 (1,2,3)
]

ใช้งานได้ดีดังนั้นคุณสามารถทำได้มากเท่าที่คุณต้องการ ฉันชอบเป็นการส่วนตัว

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

สาเหตุที่\ไม่ได้รับการชื่นชมมากนักคือมันปรากฏที่ท้ายบรรทัดโดยที่มันไม่โดดเด่นหรือต้องการช่องว่างเพิ่มเติมซึ่งจะต้องได้รับการแก้ไขเมื่อความยาวของเส้นเปลี่ยนไป:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

ในกรณีเช่นนี้ให้ใช้ parens:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)

47
โดยเฉพาะการแบ่งบรรทัดจะถูกละเว้นภายในใด ๆวงเล็บ - (), และ[] {}

23

ฉันไม่เห็นด้วยกับ:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

คุณไม่จำเป็นต้องใช้\ในกรณีนี้ โดยทั่วไปฉันคิดว่าผู้คนหลีกเลี่ยง\เพราะมันน่าเกลียดเล็กน้อย แต่ก็อาจทำให้เกิดปัญหาได้หากไม่ใช่สิ่งสุดท้ายในบรรทัด (ตรวจสอบให้แน่ใจว่าไม่มีช่องว่างตามหลัง) ฉันคิดว่ามันจะดีกว่ามากที่จะใช้มันเพื่อไม่ให้เส้นของคุณยาวลง

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


20

คุณยังสามารถใช้ประโยชน์จากการเยื้องหลายรายการในกรณีที่คุณกำลังจัดการกับรายการโครงสร้างข้อมูลหลาย ๆ

new_list = [
    {
        'attribute 1': a_very_long_item.attribute1,
        'attribute 2': a_very_long_item.attribute2,
        'list_attribute': [
            {
                'dict_key_1': attribute_item.attribute2,
                'dict_key_2': attribute_item.attribute2
            }
            for attribute_item
            in a_very_long_item.list_of_items
         ]
    }
    for a_very_long_item
    in a_very_long_list
    if a_very_long_item not in [some_other_long_item
        for some_other_long_item 
        in some_other_long_list
    ]
]

สังเกตว่ามันกรองไปยังรายการอื่นโดยใช้คำสั่ง if อย่างไร การทิ้งคำสั่ง if ไปยังบรรทัดของมันเองก็มีประโยชน์เช่นกัน


1
ฉันชอบคำตอบนี้เป็นพิเศษเพราะมันแสดงให้เห็นถึงแง่มุมทั่วไปของการแบ่งบรรทัดรวมถึงความเข้าใจในรายการที่ซ้อนกันสำหรับforลูป
gustafbstrom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.