Question: I am confused as to when I should use Boolean vs bitwise operators

* `and` vs `&`
* `or` vs `|`

Could someone enlighten me as to when do i use each and when will using one over the other affect my results?

Answer: 
Here are a couple of guidelines:

* Boolean operators are usually used on *boolean* values but bitwise operators are usually used on *integer* values.
* Boolean operators are *short-circuiting* but bitwise operators are *not* short-circuiting.

The short-circuiting behaviour is useful in expressions like this:

```
if x is not None and x.foo == 42:
    # ...

```

This would not work correctly with the bitwise `&` operator because both sides would always be evaluated, giving `AttributeError: 'NoneType' object has no attribute 'foo'`. When you use the boolean `and`operator the second expression is not evaluated when the first is False. Similarly `or` does not evaluate the second argument if the first is True.
If you are trying to do element-wise boolean operations in `numpy`, the answer is somewhat different. You can use `&` and `|` for element-wise boolean operations, but `and` and `or` will return value error.

To be on the safe side, you can use the [numpy logic functions](http://docs.scipy.org/doc/numpy/reference/routines.logic.html).

```
np.array([True, False, True]) | np.array([True, False, False])
# array([ True, False,  True], dtype=bool)

np.array([True, False, True]) or np.array([True, False, False])
# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

np.logical_or(np.array([True, False, True]), np.array([True, False, False]))
# array([ True, False,  True], dtype=bool)

```