2013-02-01 26 views

Trả lời

7

Tôi nghĩ trống iterator là tốt hơn bởi vì iterating trên không có gì là nhanh hơn thì trước tiên kiểm tra nếu giá trị trả về không phải là None và sau đó lặp trên hay không.

for x in function(): 
    do_something() 

value = function() 
if value is not None: 
    for x in value: 
     do_something() 

Chỉ cần nhìn vào điều này.

Cũng bình thường bạn không khởi tạo thuộc tính ITER với Không, nhưng với đối tượng iter trống.

self.list_of_users = [] 

không

self.list_of_users = None 
+0

_ "iterating trên không có gì là nhanh hơn" _ '[trích dẫn-cần thiết]'. Có, đó là _terser, _ nhưng nếu không có kết quả 'timeit', tôi hoài nghi đó là _faster._ –

+0

Bạn có thể viết rằng: 'cho mặt hàng trong some_func() hoặc []: pass' hoặc ' [do_something (item) cho mục trong some_func() hoặc []] '. – espeed

+0

Cũng xem xét trường hợp khi bạn cần phải làm điều gì đó khác khi hàm trả về không có kết quả, trước tiên bạn sẽ phải kiểm tra kích thước của trình lặp. – espeed

5

Một thực tế nói chung mà tôi đã được dạy để làm theo là để trả lại kiểu dữ liệu tương tự cho tất cả các giá trị hợp lệ trong lĩnh vực đầu vào, nếu bạn có thể. Nó giúp người khác sử dụng mã của bạn dễ dàng hơn và tài liệu của bạn sẽ sạch hơn. Đối với các giá trị nằm ngoài miền nhập hợp lệ, hãy tăng Ngoại lệ.

Một iterator rỗng, chứ không phải là Không, có vẻ là một thực hành tốt hơn trong trường hợp này. Tôi biết các ngôn ngữ lập trình khác như trả về null trong những trường hợp này, nhưng tôi không thấy một lợi ích để làm điều đó trong kịch bản mà bạn mô tả.

+0

Một trong những lý do tôi có trong "không trả lại một vòng lặp trống" là vì nếu bạn cần làm điều gì đó cho trường hợp trống, bạn sẽ phải kiểm tra kích thước của trình lặp thông qua 'if len (kết quả): 'và điều này có thể tốn kém nếu iterator là lớn, trong khi' nếu kết quả là None: 'là rẻ và do đó linh hoạt hơn. – espeed

+1

nếu x là một trình lặp, "nếu x" sẽ trả về False nếu x trống –

Các vấn đề liên quan