In Python the logical and is "and". "&" is a bitwise arithmetic and, just like it is in C. But this is Python so dump the unnecessary parenthesis. And while you are at it dump the 1 letter variable names. Use meaningful variable names.
if age < 20:
p = -10
elif age >= 20 and age < 30:
p = 0
This works, but it is still wrong. You aren't thinking about how the if and the elif work together. You are writing code like this:
if age < 20:
p = -10 # I would rename p if I knew what it represented
if 20 <= age < 30: # This is more readable than age >= 20 and age < 30, but it is still wrong.
p = 0
if 30 <= age <= 50:
p = 20
if age > 50:
p = 25
Each of your conditional tests stands on it's own age < 20, 20 < age < 30 and so on. When you add an elif you are not taking advantage of what you already know.
if age < 20:
p = -10
elif # How SHOULD we test for 20 <= age < 30?
If age is < 20 the program sets p to -10 and the jumps out of the if/elif. If the program reaches the elif you know that age is not < 20, so you don't need to test for that condition again.
if age < 20:
p = -10
elif age < 30: # We know age >= 20 if we get here.
p = 0
The same goes for the next elif. If age < 30 you would not be reaching the next elif, so you don't have to test for < 30 again.
if age < 20:
p = -10
elif age < 30:
p = 0
elif age <= 50:
p = 20
else: # We know age > 50 if we get here. No need to test
p = 25