Phương pháp này tìm kiếm nhóm ký tự đầu tiên (ví dụ: [a-zA-Z0-9_]
), trả về nhóm phù hợp đầu tiên hoặc None
trong trường hợp thất bại.Hoạt động "Boolean" trong Python (ví dụ: và/hoặc toán tử)
def test(str):
m = re.search(r'(\w+)', str)
if m:
return m.group(1)
return None
Chức năng tương tự có thể được viết lại như sau:
def test2(str):
m = re.search(r'(\w+)', str)
return m and m.group(1)
này hoạt động giống nhau, và được ghi chép lại hành vi; như this page ghi rõ:
Biểu thức
x and y
đánh giá đầu tiênx
; nếux
là sai, giá trị của nó được trả về; nếu không,y
được đánh giá và giá trị kết quả được trả về.
Tuy nhiên, là một toán tử boolean (nó thậm chí còn nói như vậy trên hướng dẫn), tôi mong đợi and
để trả về boolean. Kết quả là, tôi là astonished khi tôi phát hiện ra (cách này) hoạt động như thế nào.
Các trường hợp sử dụng khác của vấn đề này là gì và/hoặc lý do cơ bản cho việc triển khai thay vì không trực quan này là gì?
Trên thực tế có một vài ngôn ngữ có điều này, nó chắc chắn có trước Python. Nó được sử dụng theo truyền thống như là một thay thế cho điều kiện bậc ba, trở lại trước khi chúng ta có các biểu thức 'if ... else', và nó vẫn có thể được sử dụng như toán tử kết hợp null của C#' ?? '. Cá nhân tôi sẽ cố gắng tránh tất cả nhưng việc sử dụng tầm thường nhỏ này, cả vì những vấn đề tiềm ẩn với các giá trị ‘giả” và bởi vì “rõ ràng là tốt hơn là ngầm”. 'return m và m.group (1)' là khá nhiều OK, nhưng nếu bạn đi xa hơn thế, 'm không phải là None và ...' có thể rõ ràng hơn. – bobince