Phần Tử Không Trong Python

2. None và các toán tử logic

None là một tập hợp đặc biệt, chỉ có chính nó, mà cũng không phải là chính nó. Không phải là chính nó vì None bao hàm ý nghĩa là thiếu giá trị (denoting lack of value):

>>> type(None) <type 'NoneType'>

None tương tác với tất cả các phần tử không:

>>> assert(([] and None) == []) >>> assert(({} and None) == {}) >>> assert((0.0 and None) == 0.0) >>> assert(("" and None) == "") >>> assert((set([]) and None) == set([])) >>> assert((() and None) == ()) >>> assert((0j and None) == 0J) >>> assert((False and None) == False)

Nếu ta gọi S là tập hợp các phần tử không, bao gồm chính None, thì với phép toán and, None chính là phần tử không bên phải của S. Ai bảo None không phải là giá trị.

Tuy nhiên:

>>> assert((None and []) == None) >>> assert((None and {}) == None) >>> assert((None and set([])) == None) >>> assert((None and "") == None) >>> assert((None and 0) == None)

Tương tự:

>>> assert((None or set([])) == set([])) >>> assert((None or []) == []) >>> assert((None or {}) == {}) >>> assert((None or "") == "") >>> assert((None or 0) == 0) >>> assert((None or 0j) == 0j) >>> assert((None or ()) == ())

Nghĩa là None là phần tử không bên phải đối với tập S nói trên trong phép toán or.

Và:

>>> assert(({} or None) is None) >>> assert(([] or None) is None) >>> assert((0 or None) is None) >>> assert((set([]) or None) is None) >>> assert(("" or None) is None) >>> assert((0j or None) is None) >>> assert((() or None) is None) >>> assert((0.0 or None) is None)

Như vậy khi None tương tác với các phần tử không, thứ tự các toán hạng là điều bạn cần chú ý.

Phép toán or giữa None và object bất kỳ không phải là phần tử không là ánh xạ đồng nhất bất kể thứ tự phép toán:

>>> set(['a']) or None set(['a']) >>> None or set(['a']) set(['a']) >>> None or "abc" 'abc' >>> "abc" or None 'abc' >>> None or {1:1} {1: 1} >>> {1:1} or None {1: 1}

Phép toán and thì luôn cho kết quả None với bất kỳ phần tử nào không phải là phần tử không, không kể thứ tự toán hạng:

>>> assert((None and 1) is None) >>> assert((1 and None) is None) >>> assert(([1] and None) is None) >>> assert((None and [1]) is None) >>> assert(("abc" and None) is None) >>> assert((None and "abc") is None)

Một biểu thức logic chứa None có thể trả về None, nghĩa là không có giá trị. Điều này làm cho None trong python trở lên phức tạp và không giống với null trong C# hay nothing trong VB.NET. Trong VB.NET một biểu thức logic luôn luôn trả về giá trị logic.

None là tận cùng (bottom), là nhỏ hơn tất cả.

>>> None < 0.0 == 0 < {} < [1] < "" < () True

None không có bất kỳ một method nào, thậm chí chính nó là một method khi được dùng với filter hoặc map (xem phần dưới).

Cuối cùng NoneNone - đừng băn khoăn (^-^):

>>> None is None True >>> None == None True

Việc hiểu rõ bản chất của None cùng các tương tác của nó với các phần tử không qua các phép toán logic là RẤT quan trọng khi bạn viết các lệnh if, filter...

Một hàm bất kỳ có thể trả về None nếu bạn viết return None, hoặc không return ở bất kỳ chỗ nào trong hàm. Một hàm như vậy khi tham gia vào biểu thức logic sẽ tạo ra những hiệu ứng mà bạn cần phải nắm rõ bản chất.

Từ khóa » Toán Tử Nào Không Có Trong Python