質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

8802閲覧

python3 関数内で定義した変数を関数外で使いたい。

sasuke_killer

総合スコア42

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/08/29 07:05

編集2018/08/31 12:42

ユーザーの名前とパスワードを設定するプログラムを作っています。

関数内で定義した変数を関数外で使いたいのですが、エラーが出てしまいます。

このコードで言うと、user_nameとpasswordにあたるもののことです。

どうすれば、これらの変数を関数外でも使えるようになりますか?

これらの変数を関数外で扱う前に関数を実行しているので使えるかと思っていたのですが、違うようです。これは何故か、も回答していただけると嬉しいです。

python3

1def input_user_name(): 2 while True: 3 user_name = input("名前を入力してください: ") 4 if user_name: 5 print("あなたの名前は\"{}\"であってますか?".format(user_name)) 6 user_name_ok = input("はいorいいえ: ") 7 if user_name_ok == "はい": 8 print("保存します") 9 return user_name 10 elif user_name_ok == "いいえ": 11 print("正しい名前を入力してください") 12 print("") 13 continue 14 else: 15 print("はいorいいえを入力してください") 16 continue 17 else: 18 print("") 19 continue 20 21def input_password(): 22 print("") 23 print("passwordを設定します") 24 while True: 25 print("") 26 print("passwordは六字以上の整数でなければいけません") 27 print("") 28 password = input("your password: ") 29 password = str(password) 30 if password and len(password) >= 6: 31 try: 32 password = int(password) 33 except ValueError: 34 print("") 35 print("整数を入力してください") 36 continue 37 print("もう一度確認のために入力してください") 38 print("") 39 password_a = input("your password: ") 40 try: 41 password_a = int(password_a) 42 except ValueError: 43 print("") 44 print("整数を入力してください") 45 continue 46 if password == password_a: 47 print("保存します") 48 return password 49 elif password != password_a: 50 print("1回目に入力したpasswordと2回目に入力したpasswrdが違います") 51 print("1回目から入力しなおしてください") 52 continue 53 else: 54 pass 55 elif password and len(password) < 6: 56 print("六字以上の整数を入力してください") 57 continue 58 else: 59 print("passwordを入力してください") 60 pass 61 62def InConclusion(): 63 user_information = { "name":user_name , "password":password } 64 print("") 65 print(user_information) 66 67def user_start(): 68 user_name = input_user_name() 69 password = input_password() 70 InConclusion() 71 72print(user_start())

試したこと

関数内の処理の有効範囲を知るために関数について調べましたが、わかりませんでした。

追記

修正しましたが、NameErrorが発生してしまいます。
どこが問題なのかをご教授いただけると嬉しいです。

エラーコード↓

python3

1Traceback (most recent call last): 2 File "<stdin>", line 1, in <module> 3 File "<stdin>", line 4, in user_start 4 File "<stdin>", line 2, in InConclusion 5NameError: name 'user_name' is not defined

追記

皆様、回答ありがとうございました。
変数のグローバル化はなんとなく分かりました。必要な時には使えるよう、もっと多くのコードを書いてみようと思います。
スコープについてもなんとなく分かりました。サイトを漁ってきます。

少し聞きたいのですが、このレベルの質問はしない方が良いのでしょうか?
注目の質問に載っているものを見て思いました。

とりあえず、ベストアンサーを決めさせていただきます。
ありがとうございました!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mdj

2018/08/29 08:02

returnは書かれていますので、print(input_user_name())の部分で returnの値(input_user_name()の戻り値)を受取る変数を書いてデバッグしてみてください。
tachikoma

2018/08/29 09:30

関数の戻り値の受け取り方が分からない感じですかね。
guest

回答3

0

以前にも「ローカル変数とグローバル変数の違い、スコープなどについて調べてください」と書いた記憶がありますが・・・

  • 関数の中で束縛した変数は外から見えません
  • 基本的には、関数は引数と返り値で外部とやり取りします

投稿2018/08/29 12:16

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasuke_killer

2018/08/29 12:31

なるほど。その時に出された問題は説明できた気になっていて載せてくださったリンクは見ていなかったのですが、よくよく考えると理解できてませんでした(汗) 見ておこうと思います。 ありがとうございました!
hayataka2049

2018/08/30 06:50

スコープがわからないと、どんなプログラミング言語やるにしても困るので、さくっと理解しておくことをおすすめします
guest

0

ベストアンサー

引数と言うものを使いましょう。

Python

1def InConclusion(user_name_, password_): 2 user_information = { "name":user_name 3_, "password":password_ } 4 print("") 5 print(user_information) 6 7def user_start(): 8 user_name = input_user_name() 9 password = input_password() 10 InConclusion(user_name, password)

InConclusionの引数の変数名は、仮引数であることを意識させるためにお尻にアンダーバーを付けています。

投稿2018/08/29 11:45

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasuke_killer

2018/08/29 12:06

ありがとうございます。できましたので、この後はコードをじっくり見ようと思います。 もう一つ質問があるのですが、仮引数の最後にアンダーバーを付けるのは一般的な方法なのですか?
tachikoma

2018/08/29 12:56

そんなに一般的な方法じゃないですし、別に同じ名前でもいいですよ。
sasuke_killer

2018/08/29 13:13

了解です。回答ありがとうございました!
guest

0

関数内で定義した変数はその関数内でしか有効ではないです
関数外でも有効にするなら、それをグローバル変数にしましょう

投稿2018/08/29 08:47

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tachikoma

2018/08/29 09:33

質問文へのストレートな回答としては間違ってはいないですが、もう少しコードを見てから答えてあげてもいいような。コメントまでに。
sasuke_killer

2018/08/29 12:06

ありがとうございます。 近々、勉強してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問