Edited at

[python]大事なのに最近の入門書にはなぜかあまり書いてないinput関数の活用


はじめに

仕事では統計解析を主にやっていて、jupyternotebook対話型のインタープリタとしてpythonを利用しているので、input関数をあまり使うことがないのですが

input関数ってとても大事だなと思ったので、備忘録も含めて記事を書きたいと思います。

※print関数はよく出てくるけど、input関数をあまりフォーカスしないのはなんでなんでしょうか。謎です


input関数とは

input関数とは、キーボードに入力されたデータを受け取るための関数です。

print関数が標準出力として利用されるのに対して、input関数は標準入力として利用されます。


使い方

実は2系では、

・raw_input関数

・input関数

の2種類が存在しました。

3系からはinput関数のみになっています。今回は3系のみの内容になります。

2系のraw_input関数は、3系のinput関数と同様の機能を持っており、

どちらも入力されたデータを文字列として返します。

※2系のinput関数は、データを式として計算を行います。

>>> test = input("ここに入力ができます:")

ここに入力ができます:100
>>> print(test)
100
>>> type(test)
<class 'str'>

文字列なので、数値以外も入力できます。

>>> test = input("ここに入力ができます:")

ここに入力ができます:こんにちは
>>> print(test)
こんにちは
>>> type(test)
<class 'str'>

数値として出力したい場合はint()を書きます

>>> test = input("ここに入力ができます:")

ここに入力ができます:100
>>> test = int(test)
>>> print(test)
100
>>> type(test)
<class 'int'>


入力がバラバラだった際の出力について

2つ以上の入力をする際、split()を利用し文字列を分割してリストすることが多いです。

以下のような変数を用意します。複数のスペースと改行とタブが混ざっています。

>>> test = 'a b   c\nd\te'

>>> print(test)
a b c
d e

引数を省略した場合は空白文字(スペース/タブ/改行)で分割を行います。

返り値はリストになります。

>>> print(test.split())

['a', 'b', 'c', 'd', 'e']
>>> print(type(test.split()))
<class 'list'>

引数を変えることで何で区切るか指定できます。

以下では空白文字をデフォルトで指定しているので分割されません。

>>> test = 'a:b:c:d:e'

>>> print(test.split())
['a:b:c:d:e']

分割文字を指定して分割

>>> print(test.split(":"))

['a', 'b', 'c', 'd', 'e']

第二引数で分割回数も指定できたり、そのほかrstripで文末から分割を行ったりできますが、詳細は割愛します。こちら 参照にしました。


strip()の活用

同時に活用するものとしてstrip()が存在します。

strip()を活用することで空白文字(スペース/改行/タブ) を取り除くことができます。

特に冒頭のみを削除するにはlstrip()、末尾のみを削除するにはrstrip()を活用します。

こちらこちら参考にするといいかもしれません。


上記2つの項目を踏まえて

以下のような特に意味のない「2時間タイマー」コードを書くことができます。

*実際12時間時計としてしか利用できない

ima_jikan = input("hh:mmで今時間を入力してください:")

ima_jikan = ima_jikan[-5:].rstrip().split(":")
okitai_hour = int(ima_jikan[0])+2
timer = str(okitai_hour)+":"+ima_jikan[1]
print(timer)
#hh:mmで今時間を入力してください:09:00
#11:00


一文字ずつのリストの作成

初めて考えたときの方法(昔のメモ今見ると震える)。

リストでもなんでもない。ただ分解されただけや。。。

>>> test = input("文字列を入力してください:")

文字列を入力してください:hogehoge
>>> for moji in test:
... print(moji,sep="")
...
h
o
g
e
h
o
g
e

内包表記でできます

処理速度:691 ns ± 44.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

>>> [moji for moji in test]

['h', 'o', 'g', 'e', 'h', 'o', 'g', 'e']

いやもっと簡単にlist()でできた。

処理速度:380 ns ± 7.14 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

※内包表記の半分以下!

>>> list(test)

['h', 'o', 'g', 'e', 'h', 'o', 'g', 'e']

*でアンパックできる。pythonチュートリアルでも書いてあった気が。。。

処理速度:239 ns ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

一番早い!

>>> [*test]

['h', 'o', 'g', 'e', 'h', 'o', 'g', 'e']

ちなみに時間の見方はこちら

jupyternotebookの場合は、処理の頭に%%timeitをつけると測定できます。100万回処理して平均と標準偏差を出力してくれます。


分割したものの結合

入力したものを、どのように出力するかという話もありますが、文字列ならばjoin()で結合できます。

>>> test2 = ['a', 'b', 'c']

>>>
>>> print(','.join(test2))
a,b,c
>>> print('\n'.join(test2))
a
b
c
>>> print(''.join(test2))
abc
>>> print(':::'.join(test2))
a:::b:::c

その他、出力の見え方としてはこちらを参考にしました。


参照

リストの様々な作成方法に関してはこちらがまとまっています。


終わり

入力に関しては、かなり奥深いので、もう少し応用的なものはまた投稿します。