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

#はじめに
仕事では統計解析を主にやっていて、jupyternotebook対話型のインタープリタとしてpythonを利用しているので、input関数をあまり使うことがないのですが
input関数ってとても大事だなと思ったので、備忘録も含めて記事を書きたいと思います。
※print関数はよく出てくるけど、input関数をあまりフォーカスしないのはなんでなんでしょうか。謎です

#input関数とは
input関数とは、キーボードに入力されたデータを受け取るための関数です。
print関数が標準出力として利用されるのに対して、input関数は標準入力として利用されます。

#使い方

実は2系では、
・raw_input関数
・input関数
の２種類が存在しました。

3系からはinput関数のみになっています。今回は3系のみの内容になります。
2系のraw_input関数は、3系のinput関数と同様の機能を持っており、
どちらも入力されたデータを**文字列**として返します。
※2系のinput関数は、データを式として計算を行います。

```python
>>> test = input("ここに入力ができます:")
ここに入力ができます:100
>>> print(test)
100
>>> type(test)
<class 'str'>
```
文字列なので、数値以外も入力できます。

```python
>>> test = input("ここに入力ができます:")
ここに入力ができます:こんにちは
>>> print(test)
こんにちは
>>> type(test)
<class 'str'>
```
数値として出力したい場合はint()を書きます

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

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

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

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

```python
>>> test = 'a b   c\nd\te'
>>> print(test)
a b   c
d	e
```

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

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

引数を変えることで`何で区切るか`指定できます。
以下では空白文字をデフォルトで指定しているので分割されません。

```python
>>> test = 'a:b:c:d:e'
>>> print(test.split())
['a:b:c:d:e']
```
分割文字を指定して分割

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

第二引数で分割回数も指定できたり、そのほかrstripで文末から分割を行ったりできますが、詳細は割愛します。[こちら](https://note.nkmk.me/python-split-rsplit-splitlines-re/) 参照にしました。

#strip()の活用

同時に活用するものとしてstrip()が存在します。
strip()を活用することで空白文字(スペース/改行/タブ) を取り除くことができます。
特に冒頭のみを削除するにはlstrip()、末尾のみを削除するにはrstrip()を活用します。

[こちら](https://tonari-it.com/python-strip/)や[こちら](https://itsakura.com/python-strip)参考にするといいかもしれません。

#上記２つの項目を踏まえて

以下のような特に意味のない「２時間タイマー」コードを書くことができます。
*実際１２時間時計としてしか利用できない

```python
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
```

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

初めて考えたときの方法(昔のメモ今見ると震える)。
リストでもなんでもない。ただ分解されただけや。。。

```python
>>> 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)

```python
>>> [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)
※内包表記の半分以下！

```python
>>> 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)
一番早い！

```python
>>> [*test]
['h', 'o', 'g', 'e', 'h', 'o', 'g', 'e']
```

ちなみに時間の見方は[こちら](http://www.shurey.com/Soft/Share/DoRyouKou/time.html) 
jupyternotebookの場合は、処理の頭に`%%timeit`をつけると測定できます。１００万回処理して平均と標準偏差を出力してくれます。


#分割したものの結合

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

```python
>>> 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
```

その他、出力の見え方としては[こちら](https://qiita.com/kenta1984/items/9423959e292a1e173bbc)を参考にしました。

#参照
リストの様々な作成方法に関しては[こちら](http://www.isl.ne.jp/pcsp/python/python10.html)がまとまっています。

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