まず結論

関数の中で作った変数は、基本的に関数の外では使えません。

def make_message():
    message = "こんにちは"

make_message()
print(message)

このコードは NameError になります。
message は関数の中で作られた名前だからです。

変数には「使える場所」があります。

イメージで考える

関数の中は、小さな部屋だと考えます。

部屋の中で作った message は、その部屋の中では使えます。

でも、部屋の外から直接その名前を呼ぶことはできません。

外で使いたい値は、return でドアの外へ渡します。

関数の中だけで使える

関数の中で作った変数は、その関数の中で使えます。

def say_hello():
    message = "こんにちは"
    print(message)

say_hello()

この場合、message は関数の中で使っているので問題ありません。

外で使いたいならreturn

関数の外で値を使いたいなら、return で返します。

def make_message():
    message = "こんにちは"
    return message

result = make_message()
print(result)

return された値を、外側の result に入れています。

同じ名前でも別の変数

関数の中と外で同じ名前を使っても、別の変数として扱われることがあります。

message = "外"

def show():
    message = "中"
    print(message)

show()
print(message)

中では "中"、外では "外" が表示されます。

読み方のコツ

関数の中は、小さな部屋のようなものです。
その部屋で作った変数は、外から直接見えないと考えると分かりやすいです。

外で使いたい結果は、return で渡しましょう。

手を動かすミニ練習

関数の中と外で、同じ名前の変数を表示してみましょう。

message = "外"

def show():
    message = "中"
    print(message)

show()
print(message)

関数の中で作った message と、外の message は別のものとして扱われます。