Thông thường, khi đọc mã Python, bạn sẽ bắt gặp các hàm tiện ích sẽ trả về None
. Mặc dù trong một số trường hợp, việc trả về None
có vẻ tự nhiên, nhưng nên tránh việc này vì có thể dễ xảy ra lỗi
Hãy xem tại sao việc trả về Không dễ xảy ra lỗi
Giả sử bạn muốn viết một hàm thư viện đơn giản để chia hai số
Hàm trả về None
khi mẫu số bằng 0. Điều này hợp lý vì kết quả không được xác định nên việc gửi None
nghe có vẻ tự nhiên. Tuy nhiên người dùng hàm có thể sử dụng sai như hình bên dưới
Khi tử số là 0, hàm sẽ trả về 0, điều này được mong đợi nhưng hãy xem điều gì xảy ra trong câu lệnh if
Nó đang tìm kiếm một giá trị tương đương với False
và sẽ thực thi không chính xác, cho người dùng biết rằng đầu vào của bạn không hợp lệ, điều này không đúng. Việc đánh giá phản hồi trong điều kiện if
như thế này rất dễ xảy ra lỗi
Thay vào đó nên trả lại những gì?
Cách chính xác là ném một ngoại lệ vào chức năng thư viện như hình bên dưới
Bằng cách này, người gọi hàm chịu trách nhiệm xử lý các trường hợp sử dụng không hợp lệ bằng cách bắt ngoại lệ thay thế và thực hiện hành động thích hợp. Không có phỏng đoán hoặc bất kỳ giả định nào được đưa ra bởi người gọi và kết quả rõ ràng hơn
Các hàm thường in ra giá trị None
khi chúng ta chuyển kết quả của việc gọi một hàm không trả về bất kỳ thứ gì cho hàm print[]
. Tất cả các hàm không trả về giá trị một cách rõ ràng, trả về None
trong Python
Lưu ý rằng chúng ta đã gọi hàm print[]
hai lần
Khi chúng ta gọi hàm None
1, hàm print[]
được gọi với hàm None
3, sau đó chúng ta in kết quả của việc gọi hàm None
1
Bởi vì hàm None
5 không trả về bất cứ thứ gì, nên cuối cùng nó hoàn toàn trả về None
, do đó, None
được in ra
Nếu chúng ta trả về một giá trị từ hàm, giá trị đó sẽ được in ra
Chúng tôi đã sử dụng câu lệnh print[]
1 để trả về một giá trị từ hàm
Bây giờ khi hàm None
1 được gọi, chúng ta sẽ in các chuỗi None
3 và print[]
4, thay vì None
Lưu ý rằng tất cả các hàm không trả về giá trị một cách rõ ràng, sẽ hoàn toàn trả về None
Nếu bạn không muốn trả lại bất cứ thứ gì từ hàm, hãy xóa lệnh gọi print[]
khi gọi hàm None
1
Chẳng ích gì khi in kết quả của việc gọi một hàm không trả về bất kỳ thứ gì vì chúng ta sẽ luôn in ra None
Các nguồn phổ biến nhất của giá trị None
là
- Có một chức năng không trả về bất cứ thứ gì [trả về
None
ngầm] - Đặt rõ ràng một biến thành
None
- Gán một biến cho kết quả gọi hàm tích hợp không trả về bất kỳ thứ gì
- Có một chức năng chỉ trả về một giá trị nếu một điều kiện nhất định được đáp ứng
Lưu ý rằng có nhiều chức năng tích hợp sẵn [e. g. None
3] thay đổi đối tượng ban đầu tại chỗ và trả về None
Một nguồn phổ biến khác của các giá trị None
là có một hàm chỉ trả về một giá trị nếu một điều kiện được đáp ứng
Câu lệnh None
6 trong hàm None
7 chỉ được chạy nếu đối số được truyền vào có độ dài lớn hơn None
8
Trong tất cả các trường hợp khác, hàm không trả về bất kỳ thứ gì và kết thúc hoàn toàn trả về None
Để giải quyết vấn đề này, chúng ta có thể trả về một giá trị mặc định nếu điều kiện không được đáp ứng, e. g. một chuỗi rỗng, một danh sách trống, print[]
0 hoặc bất kỳ giá trị nào khác phù hợp với trường hợp sử dụng của bạn
Để ngăn một hàm trả về None
trong Python, hãy đảm bảo trả về một giá trị từ hàm. Tất cả các hàm không trả về giá trị rõ ràng đều trả về giá trị None
trong Python
Chúng tôi đã không trả về một giá trị rõ ràng từ hàm, vì vậy nó hoàn toàn trả về None
Sử dụng câu lệnh if
1 để trả về một giá trị từ hàm
Lưu ý rằng tất cả các hàm không trả về giá trị một cách rõ ràng, sẽ hoàn toàn trả về None
Các nguồn phổ biến nhất của giá trị None
là
- Có một chức năng không trả về bất cứ thứ gì [trả về
None
ngầm] - Đặt rõ ràng một biến thành
None
- Gán một biến cho kết quả gọi hàm tích hợp không trả về bất kỳ thứ gì
- Có một chức năng chỉ trả về một giá trị nếu một điều kiện nhất định được đáp ứng
Lưu ý rằng có nhiều chức năng tích hợp sẵn [e. g. if
6] làm thay đổi đối tượng ban đầu tại chỗ và trả về None
Nếu hàm thay đổi đối tượng ban đầu, đừng gán kết quả của việc gọi nó cho một biến
Một nguồn phổ biến khác của các giá trị None
là có một hàm chỉ trả về một giá trị nếu một điều kiện được đáp ứng
Câu lệnh None
1 trong hàm None
2 chỉ được chạy nếu đối số được truyền vào có độ dài lớn hơn None
3
Trong tất cả các trường hợp khác, hàm không trả về bất kỳ thứ gì và kết thúc hoàn toàn trả về None
Để giải quyết vấn đề này, chúng ta có thể trả về một giá trị mặc định nếu điều kiện không được đáp ứng, e. g. một chuỗi rỗng, một danh sách trống, None
5 hoặc bất kỳ giá trị nào khác phù hợp với trường hợp sử dụng của bạn