2012-07-11 32 views
16

Đây có thể là một câu hỏi ngớ ngẩn, nhưng nhìn vào the mapping of operators to functions Tôi nhận thấy rằng không có hàm nào để biểu thị toán tử not in. Lúc đầu, tôi nghĩ rằng điều này có lẽ là do thông dịch viên chỉ cần biên tập lại là not x in y, nhưng có một chức năng cho is not mà có vẻ như nó sẽ hoạt động chính xác giống như not in. Tôi có thiếu cái gì đó, hay liệu toán tử đó thực sự không tồn tại?toán tử python, không có toán tử nào cho "not in"

Dưới đây là một ví dụ thực sự ngu ngốc, nơi bạn có thể muốn điều này:

def compare_iter(a,b,func): 
    return [func(aa,bb) for aa,bb in zip(a,b)] 

my_compare=compare_iter(xx,yy,lambda x,y:x not in y) #lambda -- yuck 
my_compare=map(operator.not_,compare_iter(xx,yy,operator.contains) #extra map? grr... 
#it would be nice to do: my_compare=compare_iter(xx,yy,operator.not_contains) 

Dĩ nhiên tôi có thể viết chức năng riêng của tôi cho điều này, nhưng sau đó bạn phải trả giá trong hiệu quả trong khi các mô-đun điều hành có thể đẩy mã này ra của python và do đó thực thi nhanh hơn.

+0

Thật vậy, không thể 'a không phải là b' đơn giản được sắp xếp lại thành' không a là b'? – JAB

+0

Có tình huống mà kiểm tra 'không in' có khả năng có thể được thực hiện nhanh hơn kiểm tra 'in'? –

+1

@PaulManta nghi ngờ, vì 'không in' được định nghĩa là tìm kiếm toàn diện. –

Trả lời

14

Một chức năng khác không cần thiết ở đây. not in là nghịch đảo của in, vì vậy bạn phải ánh xạ sau:

obj in seq => contains(seq, obj) 

obj not in seq => not contains(seq, obj) 

Bạn đang quyền này là không phù hợp với is/is not, kể từ khi kiểm tra danh tính nên đối xứng. Đây có thể là một tạo tác thiết kế.

+1

Trong suy nghĩ về điều này, có vẻ như với tôi rằng một nhà điều hành * * cần thiết khác. 'x> y' không (nhất thiết) ngụ ý' không (x <= y) 'trong python. Tại sao nên thử nghiệm để ngăn chặn được bất kỳ khác nhau? – mgilson

3

Bạn có thể tìm thấy các chức năng và tháo dỡ sau để thể hữu ích trong việc tìm hiểu các nhà khai thác:

>>> def test(): 
     if 0 in(): pass 
     if 0 not in(): pass 
     if 0 is(): pass 
     if 0 is not(): pass 
     return None 

>>> dis.dis(test) 
    2   0 LOAD_CONST    1 (0) 
       3 LOAD_CONST    2 (()) 
       6 COMPARE_OP    6 (in) 
       9 POP_JUMP_IF_FALSE  15 
      12 JUMP_FORWARD    0 (to 15) 

    3  >> 15 LOAD_CONST    1 (0) 
      18 LOAD_CONST    3 (()) 
      21 COMPARE_OP    7 (not in) 
      24 POP_JUMP_IF_FALSE  30 
      27 JUMP_FORWARD    0 (to 30) 

    4  >> 30 LOAD_CONST    1 (0) 
      33 LOAD_CONST    4 (()) 
      36 COMPARE_OP    8 (is) 
      39 POP_JUMP_IF_FALSE  45 
      42 JUMP_FORWARD    0 (to 45) 

    5  >> 45 LOAD_CONST    1 (0) 
      48 LOAD_CONST    5 (()) 
      51 COMPARE_OP    9 (is not) 
      54 POP_JUMP_IF_FALSE  60 
      57 JUMP_FORWARD    0 (to 60) 

    6  >> 60 LOAD_CONST    0 (None) 
      63 RETURN_VALUE   
>>> 

Như bạn có thể thấy, có một sự khác biệt trong mỗi nhà khai thác; và mã số của chúng (theo thứ tự) là 6, 7, 8 và 9.

+2

Có, nhưng nếu bạn làm 'không 0 trong()', nó dịch nó thành '0 không in()' - Điều này làm cho tôi nghĩ nhiều hơn rằng phải có toán tử tương ứng trong mô-đun toán tử là 'không in' rõ ràng là một nhà điều hành riêng biệt (và thậm chí được ưa thích) cho phiên dịch viên ... – mgilson

+2

@mgilson: Chỉ cần nhận thấy rằng bản thân mình. Tôi đoán nó sẽ là một cách khác, nhưng vì tôi thấy mình đồng ý với quan điểm của bạn bây giờ. Thật thú vị, tôi dường như không thể tìm thấy bất kỳ cuộc thảo luận nào về việc bao gồm 'không phải là 'thành viên của' nhà điều hành' trong danh sách gửi thư chính thức của Python, mặc dù có một cuộc thảo luận về tính hữu ích của nó. – JAB

+1

@JAB, bạn có thể đăng liên kết tới một số cuộc thảo luận về tính hữu dụng không? (Câu hỏi này chủ yếu là học thuật đối với tôi, tôi rất muốn xem những gì người khác nghĩ về các ca sử dụng thực tế) Có cách nào để yêu cầu nó được thêm vào không? – mgilson

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