How does the so-called shebang or (hash-bang) work
When the OS is asked to load a program with the exec() system call,
the OS needs to know something about the program it's loading. Ordinarily
it's a compiled executable (in the so-called ELF format) like what you
get when you invoke the compiler.
However, Unix has also traditionally provided a method to specify instead
a custom interpreter. If the first 2 bytes of an executable are #!, then
Unix will interpret whatever follows this as the name of a program that
it will invoke instead. The name of the program - really a command line -
ends with a newline. To this command it adds the name of the program.
So if you say #!/usr/bin/env python3 at the beginning of your script
script.py, you're really saying that if someone tries to exec() this
executable (it must have the +x bit, or executable bit, for that),
the OS should instead run /usr/bin/env python3 script.py.
Now you need to learn what /usr/bin/env does - it's a command that
allows you to manipulate the environment and then starts another program.
Here, we're not asking it to manipulate the environment at all (that would
be env VARIABLE=value ...) - but just to start the python3 program.
The reason people recommend #!/usr/bin/env python3 over
#!/usr/bin/python3 is that the former will use the execvp
system call that respects the user's PATH. See also: How do
environment variables work in Unix, and how does PATH work in
particular?