※ Pythonの慣習に沿って変数は小文字に変更してます。
標準入力から受け取る場合
python
1current, voltage, speed = [int(input().split("!")[0]) for _ in range(3)]
python program.py < data.txt
標準入力と引数ファイル名に対応
python
1# 但し、データファイルに余分な行が含まれていると ValueError
2import fileinput
3
4current, voltage, speed = [
5 int(line.split("!")[0]) for line in fileinput.input()
6]
python program.py < data.txt
python program.py data.txt
標準入力から受け取れるようにしておくと、
テストデータの為に、別ファイルを準備が必要なんて手間を省けます。
テキストからデータを読み込むのは、
「競技プログラミング」では定形の処理なので、
探せばサンプルコードは多く見つかりますが、
Python2.x/3.x の違いについて注意点
# Python2.7 で、input()を使って標準入力から読み込む場合
# データ中のコメント区切りを '#' にすれば
# Pythonのコメントと解釈されるので、このコードでも目的の数値を得られますが
# 任意のコードを実行できてしまう為、安全ではないので注意。
current, voltage, speed = [input() for _ in range(3)]]
# 2.x) current, voltage, speed = map(input, range(3))
# 3.x) current, voltage, speed = [eval(input()) for _ in range(3)]]
このようなコードはサンドボックス環境で実行することが前提で、
セキュリティリスクが考慮されてないことがあります。
実際にコードを参考にする場合は注意です。
以下のような形にしておくと、デバッグやテスト時に便利です。
def func(current=0, voltage=0, speed=0):
print(current + speed)
def main():
import fileinput
params = ["current", "voltage", "speed"]
# リストで読み込み
# args = [int(v.split("!")[0])
# for _,v in zip(params, fileinput.input())]
# 辞書で読み込み
kw = dict((k,int(v.split("!")[0]))
for k,v in zip(params, fileinput.input()))
# func(*args)
func(**kw)
if __name__ == "__main__":
main()
実行方法4通りに対応
# 第一引数に渡す
$ python program.py data.txt
35
# 標準入力を通じてファイルから読み込み
$ python program.py < data.txt
35
# 標準入力から読み込み(スクリプト実行後に自分で入力)
$ python program.py
10
25
15
^Z <-- EOF を打ち込む (win: Ctrl-Z, linux: Ctrl-D 等)
35
# 対話入力を使ってテスト
$ python -i program.py
>>> func(10, 25, 15)
35
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。