Python cho người Việt

Python cho người Việt

..and..or..

written by Phạm Thị Minh Hoài, on Jan 2, 2010 11:25:00 PM.

Trong bài viết trước về Phần tử không tôi có nói về việc cần phải cẩn thận khi dùng phép toán có tương tác giữa phần tử không và None. Trong bài này tôi trình bày một ví dụ nhỏ minh họa rõ hơn một vấn đề mà nhiều bạn mới học có thể gặp phải. Đó là phép toán rút gọn ..and..or.. khi có sự tham gia của None.

Cấu trúc if.. else và phép gán giá trị theo điều kiện trong python:

if condition:
        x = somevalue
else:
        x = othervalue

Có thể được viết trên một dòng:

x = condition and somevalue or othervalue

Ví dụ:

>>> x = 1+1*2 == 3 and "OK" or "DUREX"
>>> x
'OK'

Thực tế có nhiều bạn thích cách viết này. Vì nó gọn hơn và mang tính python hơn. Tuy nhiên hãy cẩn thận khi sử dụng cấu trúc này. Chẳng hạn trong cấu trúc:

x = condition and func1() or func2()

Hàm func1()func2() có thể có giá trị None, khi đó kết quả kỳ vọng có thể không như bạn mong muốn. Xét ví dụ:

def func1():
        return None

def func2():
        return "some value"

x = 1 + 1 == 2 and func1() or func2()
print x

Kết quả:

some value

Biểu thức logic là True song vì func1() == None nên x = True and None or func2() = “some value”

Vì vậy hãy cẩn thận khi dùng cấu trúc ..and..or.. trừ khi bạn biết rõ các giá trị tham gia biểu thức này luôn luôn khác None.

Từ phiên bản 2.5 trở đi Python hỗ trợ cấu trúc:

x = TrueValue if Condition else FalseValue

Ví dụ:

x = "OK" if 1+1 == 2 else "DUREX"

Hoaiptm.

Comments

  • Cấu trúc “x = condition and somevalue or othervalue” xem ra hơi rối. Thay vào đó dùng “x = TrueValue if Condition else FalseValue” thấy dễ hiểu hơn nhiều.

    Comment by Thuong — Jan 5, 2010 1:58:23 PM | # - re

  • [quote]Vì vậy hãy cẩn thận khi dùng cấu trúc ..and..or.. trừ khi bạn biết rõ các giá trị tham gia biểu thức này luôn luôn khác None.[/quote] Câu này ko đồng ý nha, vd:

    def func1():a

    … return 0

    def func2():

    … return ‘some value’

    x = 1 + 1 ==2 and func1() or func2()
    x

    ‘some value’
    --------------snip snip---------------
    hoặc là

    def func1():

    … return False

    def func2():

    … return ‘some value’

    x = 1 + 1 == 2 and func1() or func2()
    x

    ‘some value’
    --------------snip snip---------------
    /g4mm4

    Comment by g4mm4 — Jan 5, 2010 10:50:40 PM | # - re

  • “Vì vậy hãy cẩn thận khi dùng cấu trúc ..and..or.. trừ khi bạn biết rõ các giá trị tham gia biểu thức này luôn luôn khác None.”
    –> Cái này ko đồng ý lắm, vì nếu
    def func1():
    ____return 0
    hoặc
    def func1():
    ____return False
    thì biểu thức
    x = 1 + 1 == 2 and func1() or func2()
    vẫn là
    ‘same value’

    Comment by g4mm4 — Jan 6, 2010 5:00:14 PM | # - re

  • Đồng ý với bạn về cái này. Không chỉ None mà tất cả các giá trị của func1 bằng 0, {}, [], false, set([]), None đều gây ra vấn đề.

    Cú pháp TrueValue if Condition else FalseValue chỉ có từ python 2.5 trở đi. Trong khi nhiều bạn vẫn phải viết python trên các hệ thống cũ chạy python 2.4 hoặc 2.3.

    Tôi cũng là fan của Python One-Liner nên đôi khi viết and..or cho nó tiện. (^-^).

    Comment by Phạm Thị Minh Hoài — Jan 16, 2010 12:38:14 PM | # - re

Leave a Reply