親子で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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
対応する関数ヘッダーがありません
-
Windows10の、VS2019のC++に...
-
VBでエラー'ActiveX component ...
-
他クラスからForm1内コントロル...
-
gcc2.95で作成したソースプログ...
-
#ifndefとかヘッダファイルにつ...
-
C# IEnumerable が IEnumerable...
-
Excel VABについて 下記記述が...
-
intel fortranのエラーで困って...
-
プロシージャ名のところでエラ...
-
VBS WrteLineで1行ずつ出力する...
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
-
一つのTeratermのマクロで複数...
-
教えて下さい
-
UserForm1.Showでエラーになり...
-
Excel マクロでShearePoint先の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
intel fortranのエラーで困って...
-
他クラスからForm1内コントロル...
-
typedef による2重定義
-
C# IEnumerable が IEnumerable...
-
フォートラン(fortran)のエラー...
-
43:syntax error at end of input
-
ラズパイ上の、pythonのエラー...
-
Excel VABについて 下記記述が...
-
VBでエラー'ActiveX component ...
-
Makefile と <math.h>
-
AccessVBAでVLookupを使いたい
-
Delphiでif文がうまく書けないです
-
フォートランでの記述に関して
-
Excel VBA: UserForm.Show で実...
-
対応する関数ヘッダーがありません
-
C言語のプログラムが実行できま...
-
#ifndefとかヘッダファイルにつ...
-
Texに詳しい方よろしくお願いい...
おすすめ情報