Tiếp tục dòng để hiểu danh sách hoặc biểu thức trình tạo trong python


102

Làm thế nào bạn có thể chia nhỏ một danh sách rất dài để hiểu?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Tôi cũng đã thấy ở đâu đó những người không thích sử dụng '\' để ngắt dòng, nhưng không hiểu tại sao. lý do đằng sau này là gì?


3
bản sao có thể xảy ra của Cách thụt lề danh sách Python?
Cristian Ciupitu

Câu trả lời:


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

hoạt động tốt, vì vậy bạn có thể làm được nhiều việc tùy thích. Cá nhân tôi thích

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

Lý do tại sao \không được đánh giá cao là nó xuất hiện ở cuối dòng, nơi nó không nổi bật hoặc cần thêm phần đệm, điều này phải được sửa khi độ dài dòng thay đổi:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

Trong những trường hợp như vậy, hãy sử dụng parens:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)

47
Cụ thể, ngắt dòng được bỏ qua trong bất kỳ dấu ngoặc vuông - (), []{}.

23

Tôi không phản đối:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

Bạn không cần \trong trường hợp này. Nói chung, tôi nghĩ mọi người tránh \vì nó hơi xấu, nhưng cũng có thể gây ra vấn đề nếu nó không phải là thứ cuối cùng trên dòng (đảm bảo không có khoảng trắng nào theo sau nó). Tuy nhiên, tôi nghĩ tốt hơn là nên sử dụng nó để giảm độ dài dòng của bạn.

\không cần thiết trong trường hợp trên hoặc đối với các biểu thức được đặt trong ngoặc đơn, tôi thực sự thấy khá hiếm khi tôi thậm chí cần sử dụng nó.


20

Bạn cũng có thể sử dụng nhiều thụt lề trong trường hợp bạn đang xử lý danh sách một số cấu trúc dữ liệu.

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
    ]
]

Lưu ý cách nó cũng lọc vào một danh sách khác bằng cách sử dụng câu lệnh if. Bỏ câu lệnh if xuống dòng riêng của nó cũng rất hữu ích.


1
Tôi đặc biệt thích câu trả lời này, vì nó cho thấy một số khía cạnh thông thường của việc ngắt dòng bao gồm khả năng hiểu danh sách lồng nhau cho forcác vòng lặp.
gustafbstrom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.