2010-11-20 41 views
6

Nhìn vào đoạn mã này python tôi đã viết:Có cách nào tốt hơn để làm mã python này?

return map(lambda x: x[1], 
      filter(lambda x: x[0] == 0b0000, 
        my_func(i) 
       ) 
     ) 

Tôi tự hỏi nếu python có một cách tốt hơn để làm điều đó (Hy vọng nó tự giải thích là)?

Tôi đã học python vài tháng trước, đã viết một vài tập lệnh và chưa sử dụng nhiều từ đó. Nó đặt tôi vào một điểm kỳ lạ để học vì tôi biết đủ để làm những gì tôi muốn nhưng không có bản năng newbie để tìm cách "thích hợp". Tôi hy vọng câu hỏi này sẽ đưa tôi trở lại vào khóa học ...

+0

tôi giả 'my_func() 'trả về một danh sách liệt kê? –

Trả lời

9

Tôi nghĩ rằng bạn muốn có một danh sách hiểu:

[x[1] for x in my_func(i) if x[0] == 0] 

Việc hiểu danh sách là một thành ngữ Python rất phổ biến.

2

Bạn có thể sử dụng một cái gì đó như:

return [x[1] for x in my_func(i) if x[0] == 0b0000] 

Nhiều người sẽ gọi đó là "tốt hơn" như của nó ngắn hơn một chút và rõ ràng hơn.

(.. Tôi sẽ bị cám dỗ để xem xét biến nó thành một vòng lặp đơn giản và câu lệnh if lập trình chức năng là tốt đẹp, nhưng vòng đơn giản là đẹp quá)

+0

Vòng lặp 'for' tốt hơn hoặc rõ ràng hơn như thế nào? Danh sách hiểu được dễ đọc hơn nhiều khi bạn quen với nó. – aaronasterling

+1

Bạn có muốn chỉ định 'x [0]' không? hoặc đó có nghĩa là '=='? –

+1

@Russell Dias: Anh ta có nghĩa là '== 'vì lỗi cú pháp của nó là khác. –

1

Nếu bạn đang viết bằng Python 3.x, sau đó bạn có thể viết một biểu thức máy phát điện hiệu quả như thế này: return (x[1] for x in my_func(i) if not x[0])

+5

Tại sao bạn nói "Python 3.x"? Điều đó làm việc tốt trong Python 2. –

+0

Có sự khác biệt giữa 'map' trong Python 2.x và 3.x. Thời gian qua tôi đã kiểm tra, 'map' trong 2.x trả về một danh sách nhưng hoạt động như một máy phát điện trong 3.x. –

1

Trong python 3.x bạn có thể sử dụng giải nén để tránh sử dụng x[0]x[1]. Ngoài ra, bạn có thể xem xét việc trả lại một biểu hiện phát thay vì một danh sách-hiểu nếu bạn chỉ muốn để lặp qua kết quả một lần:

return (y for x,y,*z in my_func(i) if x == 0b0000) 
Các vấn đề liên quan