Qubits and Superposition
Just like Qiskit's Hadamard gate, Cirq's cirq.H puts a qubit into an equal superposition, a genuine mix of 0 and 1 until measured.
Simulating without measuring
import cirq
qubit = cirq.LineQubit(0)
circuit = cirq.Circuit()
circuit.append(cirq.H(qubit))
simulator = cirq.Simulator()
result = simulator.simulate(circuit)
print(result.dirac_notation()) # something like 0.71|0> + 0.71|1>
print(abs(result.final_state_vector) ** 2) # [0.5, 0.5]
cirq.Simulator()is Cirq's local simulator,.simulate(circuit)runs a circuit without any measurement, returning the exact final quantum state (only possible on a simulator, exactly like Qiskit'sStatevector).result.dirac_notation()prints the state using physicists' bra-ket notation,|0>and|1>are the two basis states, and the numbers in front are amplitudes.result.final_state_vectoris the raw list of complex amplitudes, squaring their absolute values (abs(...) ** 2) converts each amplitude into a probability, mirroring Qiskit'sstate.probabilities().
Measurement still collapses the state
circuit_measured = cirq.Circuit()
circuit_measured.append(cirq.H(qubit))
circuit_measured.append(cirq.measure(qubit, key='result'))
result = simulator.simulate(circuit_measured)
print(result.measurements['result']) # a single definite outcome, 0 or 1
result.measurements is a dictionary keyed by the measurement keys you assigned with cirq.measure(..., key=...), once a qubit is measured, its superposition is gone, exactly as in Qiskit, the physics doesn't change, only the SDK's syntax does.
TIP
Cirq's .simulate() (no measurement, exact state) versus .run() (with measurement, shot-based) map directly onto Qiskit's Statevector versus AerSimulator, same two-step teaching approach, different method names.