Ý kiến dường như được pha trộn về điều này - là có một "đúng cách" Pythonic để làm điều này?Có phải kiểu Python sai để trả về các trình lặp trống không phải là Không?
Trả lời
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
_ "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._ –
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
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
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ả.
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
nếu x là một trình lặp, "nếu x" sẽ trả về False nếu x trống –
- 1. Liệt kê với kiểu trả về không phải là chuỗi?
- 2. Kiểu SUDS của Python không phải là XML
- 3. Mã không phải là mã kế thừa này có trả về mảng char cục bộ sai?
- 4. Cách giải quyết "trình vòng lặp phải trả lại chuỗi chứ không phải byte"
- 5. SFINAE hoạt động theo kiểu trả về chứ không phải là thông số mẫu
- 6. Python: tại sao có thể phục hồi trả về Sai, khi nào nó phải trả về True?
- 7. Trình duyệt có phải là oncontextmenu không?
- 8. Chuỗi có phải là kiểu nguyên thủy không?
- 9. Tôi phải trả lại gì nếu kiểu trả về của phương thức là Void? (Không làm mất hiệu lực!)
- 10. Làm thế nào tôi có thể nhận được một trình tạo Python để trả về None chứ không phải StopIteration?
- 11. python: cách kiểm tra xem một dòng có phải là một dòng trống không
- 12. Đây có phải là lỗi python PyQt 4 hoặc mã hoạt động sai không?
- 13. Python không phải là ngôn ngữ chuẩn?
- 14. Trình lặp kiểu kiểu Python trong C
- 15. Phải có các tham số mẫu phải không?
- 16. Mã hóa không phải là một kiểu liệt kê?
- 17. Trả về dữ liệu không phải JSON, không phải trong Dịch vụ REST WCF
- 18. GCC mặc định giá trị trả về chính không phải là zero
- 19. Tắt chức năng mà không phải chờ trả lời (Python)
- 20. Tại sao dict.keys của Python() trả về một danh sách chứ không phải một bộ?
- 21. Các chương trình không phải python trong virtualenv
- 22. C# Có thể có kiểu trả về chung không?
- 23. Rails, tại sao tham gia trả về mảng với các giá trị không phải là uniq?
- 24. Có cần thiết một tin nhắn đại biểu phải luôn luôn có hiệu lực như một kiểu trả về không?
- 25. Đây có phải là cách đúng để chọn các phương pháp mẫu không? Nếu có, tại sao không phải là nó trong Python 3?
- 26. LinqKit PredicateBuilder trả về tất cả hoặc không phải hàng
- 27. SQLAlchemy trả về bộ tuple không phải từ điển
- 28. Có phải là chuỗi thực tập Python không?
- 29. Đây có phải là lỗi 1NF không?
- 30. Không thể sửa đổi giá trị trả về bởi vì nó không phải là một biến
"cách Right" cho những gì bối cảnh? –
Ví dụ sẽ trả về kết quả từ truy vấn REST. – espeed