Open4
書き込み歓迎! [標準入力/Python]input()とsys.stdin.readline()の違い調査メモ

inputの基本
# main.py
if __name__ == "__main__":
hoge = input("-->")
print(hoge)
上記をterminal上で実行してやる
$ python main.py
-->fuga # 入力を促すプロンプトが出るので"fuga"と入力してみた
fuga
※参考
公式/input

sys.stdin.readlineの基本
# main.py
if __name__ == "__main__":
hoge = sys.stdin.readline().rstrip()
print(hoge)
fuga = sys.stdin.readline(2)
print(fuga)
piyo = sys.stdin.readline(2)
print(piyo)
上記を実行。
$ python main.py
[kumamoto python_useful]$ python main.py
hoge
hoge
fuga
fu
ga
この結果、
- 引数なしだとユーザー入力のエスケープ文字(改行)も読み取ってしまうこと(rstripを外せばわかる)
- 数値を引数に入れると変数に受け取れる文字数が決まる。残りの受け取り役がいればそいつに渡してくれる
ということ
※参考
sys.stdin/公式

inputとsys.stdin.readlineの違い
input | sys.stdin.readline |
---|---|
inputはユーザーからの標準入力を受け取るがエスケープ文字は受け取らない | readlineはエスケープ文字を含めてユーザーからの標準入力を受け取る |
引数の値をプロンプトとして持つ | readlineはsizeという引数を持つがそれが読み込むバイト数を決定する |
※参考
Difference between input() and sys.stdin.readline()
※未読
Python 3: Why teach sys.stdin.readline() over input()?/GitHub

調査中情報
※参考:angelさん情報
-
標準入力
「標準入力」は、入力データでも入力処理でもなくて「入力を司るオブジェクト ( の中で標準で用意済みのもの )」であり、sys .stdin そのもの。 -
readline
~.readline() は、単純にそのオブジェクトのメソッド ( 行読み込み処理 ) を呼んでいるだけ、ファイルを読み込む以下のコードと構図は同じです。
with open('hoge.txt','r') as file:
line=file.readline()
print(line,end=''
- input()
inputは、標準入力 sys .stdin を使って、対話的な入力処理を行うことを目的にした関数です。
なのでプロンプト出力できたり、readlineライブラリによる機能強化ができるようになっています。
なので、似たことができるにしても input() と sys .stdin .readline() は性格が大分違う処理です。
https://docs.python.org/ja/3/library/sys.html#sys.stdin
input()、多分とっつきやすいので多用されるのですが、リッチな分遅いので、競プロのような場面では本来不向きです