Input関数
今回はプログラムが実行している途中でも値を入力できるInput関数を色々と試していきます。
Jupyter Notebookを使っていると値の入力は、例えばこんな感じに変数に直接入れてしまえば事足りてしまいます。
i = 1
値を変えたいなと思えばこの変数の値を変えればいいわけです。
しかしpyファイルのように実行形式ファイルにしてターミナルやコマンドプロンプト上で実行する場合、いちいちpyファイルを開いて値を変えて保存して、再度実行するなんてことは手間で仕方ありません。
そんな時便利なのが今回紹介する「Input関数」。
プログラムが実行されている途中でも、ユーザーからの値の入力ができる関数です。
どんなものかというとこんな感じです。
「変数名 = input()」とすると、このコマンドが実行された時に入力欄が現れ、ユーザーの値の入力を待ちます。
そして値の入力後、エンターキーが押されると、変数に値が受け渡され、処理されます。
ということで今回はなかなか使い勝手が良さそうなinput関数を色々と試していきましょう。
Input関数の基本
Input関数の基本は先ほどお見せした通り、「変数名 = input()」です。
これでユーザーの入力を待ち、エンターキーが押されると値が変数に格納され、続くプログラムが実行されます。
test = input()
print(f'{test}が入力されました。')
実行結果
ラベルを追加
入力欄にどんな値の入力を求めているかラベルを追加するには、「変数名 = input(’ラベル’)」と、inputの括弧の中にラベルを入力します。
test = input('文字を入力してください。')
print(f'{test}が入力されました。')
実行結果
取得される値はStr型
注意すべき点は、取得される値は「Str型」、つまり文字列として取得されることです。
そのため数字を入力したとしても、文字列としての数字になります。
test = input('数字を入力してください。')
print(f'{test} * 2 = {test*2}')
実行結果
数字を入力してください。5
5 * 2 = 55
この例の場合、入力欄に「5」を入力したのですが、数値としての5ではなく、文字列としての5となっているため、結果として55と表示されてしまいました。
もし取得した値を数字として扱いたい場合は、int()やfloat()を使って、数値に変換してやる必要があります。
test = int(input('数字を入力してください。'))
print(f'{test} * 2 = {test*2}')
実行結果
数字を入力してください。5
5 * 2 = 10
数値だけしか入力できなくする例
先ほどの例では、入力欄に数値以外のものが入力されても処理しようとしてしまいます。
しかし続く「f'{test} * 2 = {test*2}’」が数値でしかできない処理であるため、文字列を入れるとエラーとなってしまいます。
test = int(input('数字を入力してください。'))
print(f'{test} * 2 = {test*2}')
実行結果
数字を入力してください。てすと
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/var/folders/sp/hg7p80kx22s7vct7yb0zl5cm0000gn/T/ipykernel_37540/3374830514.py in <module>
----> 1 test = int(input('数字を入力してください。'))
2
3 print(f'{test} * 2 = {test*2}')
ValueError: invalid literal for int() with base 10: 'てすと'
このエラーを回避するためには、数値以外の入力を受け付けない、言い換えると数値が入力された時だけ続く処理をするようにしなければいけません。
一例として「While文」と「try-except文」を使って数値のみ入力を受け付けるようにしたのがこちらです。
while True:
test = input('数字を入力してください。')
try:
int(test)
break
except:
print('入力された値は数字ではありません。')
test = int(test)
print(f'{test} * 2 = {test*2}')
実行結果
数字を入力してください。てすと
入力された値は数字ではありません。
数字を入力してください。5
5 * 2 = 10
このプログラムでは、Input関数を使って取得した値を、「try」でint型に変換しようとします。
変換できた場合は「break」でWhile文のループを抜けます。
変換できずにエラーが出た場合は「except」内の処理(print(‘入力された値は数字ではありません。’))が行われ、再度While文のループの先頭に戻ります。
つまり数値が入力されるまで、何度も繰り返されるわけです。
めでたく数値が入力されループを抜けると、取得した値を「test = int(test)」でint型に変換して、「print(f'{test} * 2 = {test*2}’)」を処理しています。
文字だけしか入力できなくする例:ひらがな編
次に文字だけしか入力を受け付けないという例を試してみましょう。
今回は特に「ひらがな」だけの入力しか受け付けないようにしています。
その場合は、正規表現を使います。
正規表現とは文字列そのものではなく、文字のパターンを検索するための表現方法です。
分かり易い例としては、メールアドレスがあります。
メールアドレスは「xxxxx@yy.zz」のように「個人のアドレス@ドメイン」という形になっています。
しかも個人のアドレスやドメインはアルファベット(大小区別なし)、数字、ハイフン、アンダースコアから成り立っていて、ひらがなやカタカナは使えません。
このようなパターンを記号で表現するために使われるのが正規表現で、メールアドレスの場合、「^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$」で表されるようです。
個人的には使えなくはないけど、好きではないので、とりあえず解説は他のサイトに託して、気が向いたら解説記事を書こうと思います。
今回はひらがなの文字列ということで「^[あ-ん]+$」になります。
少しだけ解説すると「^」が先頭を表す記号で、「[あ-ん]」がひらがなの「あ〜ん」までのどれか、「+」はひとつ前の記号(つまり[あ-ん])を一回以上繰り返すこと、「$」は末尾を表す記号です。
ということで「文字の先頭から末尾までがひらがな1文字以上」で構成されている文字列となります。
これを使ってプログラムを書いてみるとこうなります。
import re
re_hiragana = re.compile(r'^[あ-ん]+$')
while True:
test = input('ひらがなを入力してください。')
if re_hiragana.fullmatch(test):
break
else:
print('入力された値はひらがなではありません。')
print(f'{test}が入力されました。')
「import re」は正規表現(英語だとRegular Expressionなのでre)のライブラリのインポートです。
「re_hiragana = re.compile(r’^[あ-ん]+$’)」で正規表現を読み込み、「re_hiragana」に格納します。
この場合、「re_hiragana.fullmatch(‘チェックしたい文字列’)」で文字列がひらがなだけからなるか確認することができます。
そしてひらがなだけから構成されていれば「True」、そうでなければ「False」が返されます。
実行して色々入力してみたのがこちらです。
ひらがなを入力してください。123
入力された値はひらがなではありません。
ひらがなを入力してください。ABC
入力された値はひらがなではありません。
ひらがなを入力してください。テスト
入力された値はひらがなではありません。
ひらがなを入力してください。てスと
入力された値はひらがなではありません。
ひらがなを入力してください。てすと
てすとが入力されました。
数字(123)、アルファベット(ABC)、カタカナ(テスト)はもちろん入力を受け付けていません。
そしてひらがなとカタカナを混ぜたもの(てスと)も入力を受け付けてくれませんでした。
最後のひらがなだけ(てすと)で先ほどの正規表現とマッチして、While文のループから抜け出しています。
今回はひらがなでしたが、このように正規表現を使って、アルファベットだけ、カタカナだけの入力欄も作れますし、例えばひらがなとカタカナだけとか、アルファベットと数字だけなんて組み合わせだけ受け付ける入力欄も作ることができます。
ターミナルでも試してみる
ここまではJupyter NotebookでInput関数を試してみましたが、もちろん実行形式であるpyファイルでもInput関数は使うことができます。
ということで試してみましょう。
def main():
word = input('Please type a word.')
print(f'{word} was typed.')
if __name__ == '__main__':
main()
実行結果
pyファイルをダブルクリックで実行してみると、「文字を入力してください。」で一時プログラムが止まり、「テスト」と入力しエンターキーを押すと、「テストが入力されました。」と表示され、ちゃんとプログラムが動いていることが分かります。
ということで実行ごとに値を変えたい場合やプログラムの途中で値を入力させたい場合などに役立つことでしょう。
ではでは今回はこんな感じで。
コメント