and v.s. &

When texting people or posting a status on social media, we often write the word **and** as **&** (ampersand) for convenience. But does Python handle `and`

and `&`

the same way?

```
str1 = "Apple"
a = ("p" in str1) & ("l" in str1)
b = "p" in str1 and "l" in str1
print(a == b)
print(a is b)
OUTPUT
True
True
```

It’s obvious that Python treats `and`

and `&`

the same way as a logical operator. How about using them between sets?

```
set1 = {0,1,2,3,4,5}
set2 = {4,5,6,7,8,9}
d = set1.intersection(set2)
e = set1 & set2
f = set1 and set2
g = set2 and set1
print(d == e)
print(e == f)
print(f == g)
OUTPUT
True
False
False
```

Dang! It seems that `set1 & set2`

, which is equivalent to `set1.intersection(set2)`

, is not the same thing as `set1 and set2`

. Even `set1 and set2`

and `set2 and set1`

are different things. Why?

If we look closer, we may find:

```
print(f == set2)
print(g == set1)
print(f is set2)
print(g is set1)
OUTPUT
True
True
True
True
```

### Roundup:

If you write x

`and`

y in Python where x and y are not arithmetic or relational expressions, Python picks up y and dumps x.If you write x

`&`

y in Python where x and y are not arithmetic or relational expressions, Python mostly won’t recognize it unless x and y are two sets.While

`("p" in str1) & ("l" in str1)`

and`"p" in str1 and "l" in str1`

are the same expression, be careful with the parentheses since`"p" in str1 & "l" in str1`

will result in a TypeError.`c = "p" in str1 & "l" in str1`

`OUTPUT TypeError: unsupported operand type(s) for &: 'str' and 'str'`

Between two integers,

`&`

servers as a bitwise operator. If interested, see this page.