With two transistors your clever electrical engineer can build an inverter. Logically, that's the "not" function. With a few more transistors, we can make an `exclusive or' circuit. Let's examine truth of these circuits. Think of 0 as "no current" or "low voltage", and 1 as "current flows" or "high voltage" (needn't be dangerously high).
Not. One input. One output.
Xor. Two inputs, One output. Let's name the inputs I1 and I2.
I1 I2 O=I1^I2
0 0 0
0 1 1
1 0 1
1 1 0
Hey! Check this out. If we add 0 + 0 we get 0. And adding 0+1 or 1+0 gives 1. Whoo-hoo. Adding 1+1 give 2. 2? Never mind. With an xor gate (eh...circuit) we can perform all these operations: 0+0, 0+1, 1+0.
Now to stretch your imagination. Let's think about base 10. Ten fingers. Ah, skip this dialog of Roman numerals and the abacus. Let's count with arms. Wait, that won't work. Let's count with lights. We'll use a bright light and an orange light. When the bright light is on it means "1". For the orange light, on means "one group of two ones".
I1 xor I2 controls the bright light;
I1 and I2 controls the orange light.
Now we can add all combinations of addends 0, 1 and represent the result! By extension we envision adding larger numbers. We can think of the orange light as the carry. Oh dear, trouble. Considering the carry, we need three input circuits. Maybe you, along with your clever electrical engineer can think of ways to combine two input circuits using George Boole's fantastic tables to make a three input circuit with the right properties for addition.
Warning: big jumps here. We'll stick a clock onto our circuit, and some memory, and some control circuits. The program indicates which circuits to activate during the clock cycle. The data changes, the computer can move it somewhere.
Python schedules circuit activation. Both humans and the digital circuit can understand the description. Wow! Python is a language for controlling machines. Ignore that machines have moving parts but computers no longer need moving parts.