**and** is a Logical AND that returns True if both the operands are true whereas ‘&’ is a bitwise operator in Python that acts on bits and performs bit by bit operation.

When an integer value is 0, it is considered as False when using logically.

[/sourcecode]

**Example:**

`# Python program to demonstrate ` `# the difference between and, & ` `# operator ` ` ` `year ` `=` `1992` ` ` `print` `(year` `%` `4` `=` `=` `0` `and` `(year` `%` `100` `=` `=` `0` `or` `year` `%` `400` `=` `=` `0` `))` `#print_stat1 ` `print` `(year` `%` `4` `=` `=` `0` `& (year` `%` `100` `=` `=` `0` `or` `year` `%` `400` `=` `=` `0` `))` `#print_stat2 ` |

*chevron_right*

*filter_none*

**Output: **

False True

This is because ‘and’ tests whether both expressions are logically True while ‘&’performs bitwise AND operation on the result of both statements.

In print statement 1, compiler checks if the first statement is True. If the first statement is False, it does not check the second statement and returns False immediately. This is known as “lazy evaluation”. If the first statement is True then the second condition is checked and according to rules of AND operation, True is the result only if both the statements are True.

In print statement 2, the compiler is doing bitwise & operation of the results of statements. Here, the statement if getting evaluated as follows:

(year%100==0 or year%400==0)

year%100 = 92, which is a true value. Because only one True value is enough to return a True value, the statement will not be checked further, hence the result of this will be 92.

next, (year%4==0 & 92) will be evaluated.

year%4==0 = 0

(0 & 92) ==> 0000000 & 1011100 ==> 1011100 ==>92, which is a True value because it is non zero value.

Hence the result will be True.

To elaborate on this, we can take another example.

**Example:**

`# Python program to demonstrate ` `# the difference between and, & ` `# operator ` ` ` `a, b ` `=` `9` `, ` `10` `print` `(a & b)` `#line 1 ` `print` `(a ` `and` `b)` `#line 2 ` |

*chevron_right*

*filter_none*

**Output:**

8 10

The first line is performing bitwise AND on a and b and the second line is evaluating the statement inside print and printing answer.

In line 1, a = 1001, b = 1010, Performing & on a and b, gives us 1000 which is the binary value of decimal value 8.

In line 2, the expression ‘a and b’ first evaluates a; if a is False (or Zero), its value is returned immediately because of “lazy evaluation” explained above, else, b is evaluated. If b is also non-zero then the resulting value is returned. The value of b is returned because it is the last value where checking ends for the truthfulness of the statement.

Hence the use of boolean and ‘and’ is recommended in a loop.

Attention geek! Strengthen your foundations with the **Python Programming Foundation** Course and learn the basics.

To begin with, your interview preparations Enhance your Data Structures concepts with the **Python DS** Course.