When you're working with the binary representation of numbers.
In your code you had three numbers 25, 10 and 5. If we write those number in binary we get:
- 25: 0b00011001
- 10: 0b00001010
- 5: 0b00000101
(The 0b at the start is just a way of saying "this is binary")
When you do a bitwise-or, it's a bit like adding up but you don't bother with carrying anything. So let's do 25 | 10, starting at the right-hand end going bit by bit (bitwise):
- 0 | 1 = 1
- 1 | 0 = 1
- 0 | 0 = 0
- 1 | 1 = 1
- 1 | 0 = 1
- 0 | 0 = 0 for all the rest
So the result is 0b00011011 which is 27.
So now you're asking "when would I ever need to do such a thing?" and the flippant answer is "you'll know when you need it".
You're looking for more though, I know. Basically computers often put multiple bits of data into bitstreams (long sequences of bits). Think networking and file storage. Constructing these bitstreams is done with bitwise operators like |, &, ^, << and >>. Together they form a different type of maths to what you're used to.
These operators work in a very similar way to how +, -, * and / work. They take two numbers and return a third. If we rewrite your code using operators you're more familiar with...
if coin == 25 | 10 | 5: # if coin == 31
...
if coin == 25 + 10 + 5: # if coin == 40
...
...you can see it's obviously wrong because you're doing one comparison with the result of the operation (addition or bitwise-or), not three comparisons.
It's a lemming, damn you.