
親子で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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
解説サイトに従ったfortran並列...
-
End Sub が必要です。
-
VB.NETのStructureの使い方を教...
-
Excel VABについて 下記記述が...
-
値を返さないといけないのに、...
-
他クラスからForm1内コントロル...
-
ラズパイ上の、pythonのエラー...
-
フォートランのエラーについて...
-
AccessVBAでVLookupを使いたい
-
フォートラン(fortran)のエラー...
-
#ifndefとかヘッダファイルにつ...
-
対応する関数ヘッダーがありません
-
メッセージボックスのOKボタ...
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
-
教えて下さい
-
エクセルで特定の列が0表示の場...
-
UserForm1.Showでエラーになり...
-
一つのTeratermのマクロで複数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
Excel VABについて 下記記述が...
-
typedef による2重定義
-
他クラスからForm1内コントロル...
-
intel fortranのエラーで困って...
-
対応する関数ヘッダーがありません
-
C# IEnumerable が IEnumerable...
-
AccessVBAでVLookupを使いたい
-
Excel VBA: UserForm.Show で実...
-
ラズパイ上の、pythonのエラー...
-
VB.NETのStructureの使い方を教...
-
構造体のポインタ参照
-
Delphiでif文がうまく書けないです
-
VBでエラー'ActiveX component ...
-
#ifndefとかヘッダファイルにつ...
-
クラスに volatile は必要?
-
python numpy.linalg.inv()での...
-
verilogでデマルチプレクサの作...
-
Windows10の、VS2019のC++に...
おすすめ情報