こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

このプログラムが動くようにするには

python 超初心者です。
やる気を出すプログラムを作ったのですが動きません。
動くように最小の修正を教えてください。
よろしくお願いいたします。

input_yn = input("Are you doing what you have to do?:")
if input_yn == y:
print ("Keep doing! Go on!")
else:
print ("do what you have to do!!!")

投稿日時 - 2018-10-22 01:39:18

QNo.9550065

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

> でもこのままだと、y/n を入力するとき、"y" ”n"と、自分でクオーテーションをつけなくてはならないことに気が付きました。

いや、クオーテーション要らないでしょ。
大体、このコードはPython3系ののモノであって、Python2系のモノじゃない。
何故分かるかって?
Python2だとprintは「文」ですが、Python3だとprintは「関数」なんで、どっちにせよ、提示コードはPython2系じゃ「動かない」のです。

print ("Keep doing! Go on!") # Python3系ではprintは関数
print "Keep doing! Go on!" # Python2系ではprintは文

つまり互換性がないので、貴方が提示したコードはいずれにせよPython2系だと「間違ってる」コードとして弾かれてしまいます。

注: とは言っても、Python2.7系のインタプリタだとprint("hoge")の形式が通ってしまうので話がややこしい。
正確な話は次のトコに書いてあるが

組み込み関数:
https://docs.python.jp/2/library/functions.html#print

>注釈
>
>この関数は print という名前が print ステートメン トとして解釈されるため、通常は使用できません。ステートメントを無効化して、 print() 関数を使うためには、以下の future ステートメントをモジュールの最初に書いて下さい。:
>
>from __future__ import print_function

との事。

と言うわけで、Python3前提で話を始めますが、input(Python2系ではraw_input)は入力をそのまま返す事はありません。「必ず」文字列に変換して返します。

>>> input()
y
'y'
>>> input()
n
'n'
>>> input()
1+1
'1+1'
>>>

特に最後の「1+1」を見て欲しいんですが、「計算」はせずに「文字列」に変換して返している。
何故かと言うと、一番大きいのはセキュリティのためです。input関数が「計算処理出来るものを」そのまま受け取って、インタプリタに渡してしまうと、「悪意のあるコード」を受け取って実行させる事を可としてしまうから、です。だから文字列のような「実行不可能」な形式に「必ず」変換してインタプリタに取り込むようにしてるんです。

>>> x = 1 + 2 # x に 1 + 2と言う計算式を与えてみる
>>> input()
x
'x' # input()で取り込んだxは「文字列」でリテラルのxとは別物なんで「実行」されない
>>> def hello(): # 次に関数を定義してみる
print("hello, world!")


>>> input()
hello()
'hello()' # inputを使って実行指令を渡しても「文字列」に変換されるので実行出来ない
>>>
すなわち、

input_yn = input("Are you doing what you have to do?:") # これはどんな入力を受け取っても全部文字列にしてしまう

ので、比較は

input_yn == "y" # 文字列 == 文字列で比較しないと意味がない

じゃないとダメだ、って事です。
言い換えると、「入力にクオーテーションが付いていなくても」受け取って返したブツには「自動的に」クオーテーションが付いているので、全然心配する必要はありません。
(試してみればすぐ分かる筈なんですけどね)

投稿日時 - 2018-10-22 15:05:33

ANo.3

pythonの3系ならinput()ですが
pythonの2系だとinput()では”式”として認識してしまうので、
yだけいれると、yという変数を探しにいくので、"y"と入れる必要が生じてしまいます。

pythonの2系を使っているなら、raw_input() を使うことになります。

投稿日時 - 2018-10-22 13:01:45

ANo.2

>でもこのままだと、y/n を入力するとき、"y" ”n"と、自分でクオーテーションをつけなくてはならないことに気が付きました。

本当にダブルクオーテーションが必要かどうか確認しましたか?

投稿日時 - 2018-10-22 04:20:30

お礼

確認しました! n や y だとエラーで、"n"や”y"だとちゃんとメッセージが帰って来ます。Python 2.7 をインストールしてIDLEで書きました。環境が関係あるでしょうか?

投稿日時 - 2018-10-22 04:45:01

ANo.1

input_yn = input("Are you doing what you have to do?:")
if input_yn == "y": # inputが返す「入力」は文字列
  print ("Keep doing! Go on!")
else:
  print ("do what you have to do!!!")

投稿日時 - 2018-10-22 03:21:39

お礼

直りました!ありがとうございます。でもこのままだと、y/n を入力するとき、"y" ”n"と、自分でクオーテーションをつけなくてはならないことに気が付きました。恐縮ですが、クオーテーションの入力がいらなくなる方法も教えていただけないでしょうか。

投稿日時 - 2018-10-22 03:47:54

あなたにオススメの質問