Apart from the remarks already given about returning instead of printing, and an argument for the number of doors, this code looks good.
Instead of looping over the list, you can also use slicing:
def check_doors_round_slicecheck_doors_round_splice(n, num_doors=100):
"""Check which door is open after n rounds"""
doors = [False] * num_doors
for step in range(min(n, num_doors)):
doors[stepmy_slice ::= slice(step, +None, 1]step =+ [1)
doors[my_slice] = not[not door for door in doors[step :: step + 1]
]doors[my_slice]]
return doors
Timing
This is a lot faster:
%timeit check_doors_round(100)
1.01 ms ± 40.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit check_doors_round_splice(100)
66 µs ± 4.65 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)