
親子で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を探す
今、見られている記事はコレ!
-
プログラミングを学べる!?進化している子どものおもちゃについて専門家に聞いた!
プログラミングを学べるレゴブロックがあることはご存知だろうか。レゴに限らず最近のおもちゃには、プログラミングの要素がどんどん取り入れられているようだ。「教えて!goo」にも、「プログラミングを学べる子供...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
(fortran) run-time erro M620...
-
Excel VABについて 下記記述が...
-
intel fortranのエラーで困って...
-
Makefile と <math.h>
-
コンパイルエラー
-
ISLispのsetq関数について教え...
-
Texに詳しい方よろしくお願いい...
-
C言語の#includeについて
-
エクセルで特定の列が0表示の場...
-
教えて下さい
-
Excel・Word リサーチ機能を無...
-
VBAでfunctionを利用しようとし...
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
-
Excel マクロ VBA プロシー...
-
Excel_マクロ_現在開いているシ...
-
Excel VBAからAccessマクロを実...
-
お助けください!VBAのファイル...
-
UserForm1.Showでエラーになり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
Excel VABについて 下記記述が...
-
フォートランのエラーについて...
-
typedef による2重定義
-
AccessVBAでVLookupを使いたい
-
C# IEnumerable が IEnumerable...
-
intel fortranのエラーで困って...
-
Excel VBA: UserForm.Show で実...
-
Delphiでif文がうまく書けないです
-
他クラスからForm1内コントロル...
-
フォートラン(fortran)のエラー...
-
コンパイルで未定義のシンボル
-
VBでエラー'ActiveX component ...
-
fortran 配列宣言のオーバーフ...
-
DLL内からの外部変数の参照
-
構造体のポインタ参照
-
(fortran) run-time erro M620...
-
ユニティ(unity)です。プログ...
-
HEW3とBorlandC++でクラス定義...
-
条件演算子論理ORについて
おすすめ情報