親子でpythonの学習中です。
下記のようなじゃんけんプログラムを作成しています。
結果が「あいこ」の場合にはエラーが出ませんが、それ以外のときにエラーとなります。
30行目でエラーとの事ですが、「あいこ」の時にはエラーにならないので、この30行目じゃなくて条件分岐に問題が有るのではないかと考えております。
色々と試してみましたが手詰まりとなりました。
お知恵を頂けたら幸いです。
<エラーメッセージから抜粋>
print('あなたは' + str(hand) + 'を出したので' + result + 'です')
NameError: name 'result' is not defined
<現在のプログラムソース>
# coding: UTF-8
print('じゃんけんを始めます')
print('0=goo1=chok=paa')
#自分の手
hand = input('0:goo 1:chok 2:paa を入力?')
print('あなたの選んだ手は' + str(hand) + 'です.')
#cpのて
import random
comH = random.randint(0,2)
print('cpのては' + str(comH) + 'です')
if hand == comH:
result = 'あいこ'
elif hand == '0':
if comH == '1':
result = '勝ち'
elif comH == '2':
result = '負け'
elif hand == '1':
if comH == '2':
result = '勝ち'
elif comH == '0':
result = '負け'
elif hand == '2':
if comH == '0':
result = '勝ち'
elif comH == '1':
result = '負け'
print('コンピューターは' + str(comH) + 'を出しました')
print('あなたは' + str(hand) + 'を出したので' + result + 'です')
No.2ベストアンサー
- 回答日時:
多分、
comHが数値(int)で定義されているため
comH == '0'などの部分が「数値と文字の比較」となり評価されず、そのままif文を抜けています。
そのためresultが未定義扱い(一度も値が代入されていない)となり、そのエラーが出ています。
9行目の
comH = random.randint(0,2)
を
comH = str(random.randint(0,2))
にしてみてください。
早々のご回答、ありがとうございます。
「数値と文字の比較」ですね!
ご指摘頂いたように修正したら正常に動作しました。
最初に変数のデータ型を使用していないので、どの形で使われているのかを注意深く意識するように努めてみます。
この度は有難うございました!
No.5
- 回答日時:
pythonはJavascriptとかと違って、文字列と数値が「等しい」と判定されることは決して無い。
ご回答、ありがとうございます!
文字列と数値を比較できない・・・そうですよね!
そもそも、そこがエラーの原因だとすら気が付きませんでした・・・。
変数の宣言(データの形式を指定?)を必要としないからこそ、いいかげんに認識していたのだと思います。
(当方、VBAは少々暑かったことが有るのですが、その時には逐一変数のデータ型を宣言していたので)
今後、同様のエラーが出た時には、変数の形式についても注意してみます。
No.4
- 回答日時:
直接の問題は No.2 の回答のとおりですが、その背景として
if 条件により変数定義が有ったり無かったり不安定
があると思います。
以下のように書くことをお勧めします
案1) 冒頭で無難な値で変数定義をして後で上書きする
result = '判定不可'
if 条件A: result = '条件Aの値'
if 条件B: result = '条件Bの値'
案2) 想定外に備えて else を省略せずに変数定義
if 条件A:
_ result = '条件Aの値'
elif 条件B:
_ result = '条件Bの値'
else:
_ result = '判定不可'
案3) 変数定義を一か所だけにする
result = '条件Aの値' if 条件A else '条件Bの値' if 条件B else '判定不可'
今回は変数の定義が曖昧なのがいけなかったんですね。
resultを”判定不能”としておくのは思いつきませんでした。
変数に何らかのデータ(今回だと”判定不能”)を仮に入れておき、後から書き換えをするという考え、了解しました。
同じ結果を得るプログラムでも、多くの書き方が有るのは大変参考になります。
まだまだ初学者ですべてを理解できませんが、様々な選択肢として少しでも理解を深められたらと思います。
No.3
- 回答日時:
様々のご指導、ありがとうございます!
頂いたサンプル、まだまだ当方の理解の範疇を超えております。
より高度かつ上質なプログラムを見て、今後の学習に活用できたらと考えております。
①
「メッセージは本体から分けておく」について。
まだまだ知らない(未知の)書き方です。
特にカッコとかの使い方・・・。
今後、学習を深めつつ、理解できるように努めてみます。
「構造体、関数(?)の使い方」について。
defというのは、何らかの数値等を与え、その結果を出力する関数のように認識しております。
長々とプログラムを記載するのではなく、シンプルな「流れ」を踏まえて、要所で関数を用いると良いのだろうと思います。
可読性が高く、将来的な修正にも対応できるように最初から準備できると素晴らしいですね。
「じゃんけんのアルゴリズム」(my_hand - comH + 3) % 3)について。
この計算方法(アルゴリズム?)については、ネット上の情報でも把握しております。
同じ結果を出力するプログラムでも、様々な方法が有るのだと学びました。
スマートに、改変がしやすい、誰が見てもわかりやすい記載をするのが最上なんでしょうね。
No.1
- 回答日時:
Pythonでは、 「変数=〜」を実行したら「変数」という「名前(name)」が「定義(define)」されます。
そうでなければ「定義されません(not defined)」
NameError: name 'result' is not defined
というエラーになるということは、 resultが定義されない(result=〜が実行されない)まま、resultを使おうとした、ということになります。
あいこで無い場合に result=〜を実行しない場合があるということになります。
教えてGooにはスペースすがまとめて消去されてしまう、というPythonには致命的な問題があります。
おそらくインデントを間違えていてあなたが思う判定アルゴリズムとは違うものになっているのではないか、と予想はできます。
が、肝心のインデントが消えてしまっている以上、判断はできません。
早々のご回答ありがとうございます。
確かに!インデントが消えていますね・・・。
「教えてGoo」の仕様ならばやむを得ないですね。
今後、ここで質問する時には気をつけます。
ご指摘、有難うございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- その他(プログラミング・Web制作) 【Python初学者】以下コードについて教えていただきたいです 4 2023/04/19 13:01
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP php エラー 2 2022/10/23 16:43
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
#ifndefとかヘッダファイルにつ...
-
ラズパイ上の、pythonのエラー...
-
(fortran) run-time erro M620...
-
Excel VBA: UserForm.Show で実...
-
VB2005でOCXを動的に呼び出すに...
-
プロシージャ名のところでエラ...
-
VBでエラー'ActiveX component ...
-
フォートランのエラーについて...
-
C# IEnumerable が IEnumerable...
-
他クラスからForm1内コントロル...
-
intel fortranのエラーで困って...
-
配列数式の解除
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
UserForm1.Showでエラーになり...
-
教えて下さい
-
一つのTeratermのマクロで複数...
-
メッセージボックスのOKボタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
Excel VABについて 下記記述が...
-
intel fortranのエラーで困って...
-
43:syntax error at end of input
-
C# IEnumerable が IEnumerable...
-
AccessVBAでVLookupを使いたい
-
Makefile と <math.h>
-
ラズパイ上の、pythonのエラー...
-
他クラスからForm1内コントロル...
-
python numpy.linalg.inv()での...
-
typedef による2重定義
-
構造体のポインタ参照
-
C言語のプログラムが実行できま...
-
フォートランでの記述に関して
-
HEW3とBorlandC++でクラス定義...
-
コンパイルで未定義のシンボル
-
verilogでデマルチプレクサの作...
-
Excel VBA: UserForm.Show で実...
-
VBでエラー'ActiveX component ...
おすすめ情報