Единственное, что изменяется в квадрате, это внутренности, так что просто проверьте, находитесь ли вы на первой или последней строке.
Не самый эффективный, но python облегчает.
size = 4
for i in range(size): # each loop prints a row
print(*
['*'] + # first star in the row
['*' if i in [0, size-1] else ' '] * (size-2) + # inside stars of the row
['*'] # last star in the row
)
* * * *
* *
* *
* * * *