Back to Basics - Tic Tac Toe
Input Validation

You aren’t completely validating input


X: a1
O: b2
X: a2
O: a3 (block)
X: a3 For the Win!?


Invalid Win/Draw Detection Logic:

X  O  X
O     O
X  O  X


Last move in centre: “Aw, it’s a draw!”???  

exit()

This is a bad function to use.   It exits the Python interpreter.   Unconditionally.  Period. 

When you want to change your code to play repeated games, run unit tests, etc., you won’t be able to.  Nothing will execute after exit().

Better would be to move the code into a function, and simply return to force an exit of the current local context, instead of an exit of the entire interpreter. 

f-strings

You are using {} and .format() in print_board, and using %s and %d in "..." % (...) expressions.  Usually, you should try to avoid mixing formatting methods.  Both are awkward to use, as the value and the place the value goes are far apart in the code.  Avoid using the % style.

Additionally, instead of:

print('%s won in %d turns! Congratulations!' % (user, turn))


using an f-string moves the variables inside the format string:

print(f'{user} won in {turn} turns! Congratulations!')


(I’d leave the print_board function alone, but in other print formatting, f-strings are a win.  )