以下のように書いて、一つの値を変数に入力できることは何度も試したと思います。
data = int(input())
print(data)
このプログラムに対して、echo 文を使って値を入力するには以下のようにしていました。
% echo 100 | python3 sample.py
100
%
「じゃんけん判定」などで行ったように、シェルスクリプトを使って自動的にデータを与えたい場面は多くあります。一つの値だけならこれで良いとして、さてリストに複数の値を与えたいときはどうすれば良いでしょう。
ところで int( ) 関数は? |
---|
これまで説明してきませんでしたが、input( ) 関数は文字列を返しており、それでは加算など計算処理には使えません。int( ) は文字列が10進表記の数値と考えて、数値データに変換する関数です。次週の文字列の説明でまた少し説明します。 |
上に示した方法をストレートに延長する形で複数の値を入力すると、以下のようなプログラムとなるでしょう。
data = []
data.append(int(input()))
data.append(int(input()))
data.append(int(input()))
print(data)
実行すると、以下のように 3回(3行)の入力でプログラムに数値を渡せます。 (6週目の「パイプ・シェルスクリプト」でやりましたね。)
% python3 listinput1.py
1
2
3
[1, 2, 3]
%
ところでこの「3行の入力」をシェルスクリプトで作ろうとすると、あまりきれいな形になりません。
% ( echo 1 ; echo 2 ; echo 3) | python3 listinput1.py <<< 括弧とセミコロンと echo 三つで実現
[1, 2, 3]
%
% echo 1 "\n" 2 "\n" 3 | python3 listinput1.py <<< 改行文字を入れて 3 行の出力を実現
[1, 2, 3]
%
% printf "1\n2\n3\n" | python3 listinput1.py <<< printf コマンドで3行の出力を実現
[1, 2, 3]
%
やはり echo 1 2 3 | … と書きたいものです。
しかし以下のようなプログラムにすると、並べて1行で入力した数列をそのままリストの形で得ることができます。
data = list(map(int, input().split()))
print(data)
何が何だか分からないでしょうが、実行するとこうなります。「 1 2 3 」と値を空白で区切って1行で入力すると、変数 data は入力に対応する要素を持ったリストを返しています。
% python3 listinput2.py
1 2 3
[1, 2, 3]
%
(何が何だか分からないのは嫌だ、という人は、この下の「参考」を見ると良いです。)
こうすることで、一つの echo だけで簡単に複数の数値を(空白で区切って)渡せます。
yasuda@Slack 10 % echo 1 2 3 4 5 | python3 listinput2.py
[1, 2, 3, 4, 5]
yasuda@Slack 10 %
シェルスクリプトでリストの中身を与えるような場合に記述がシンプルになって良いですね。うまく使っていきましょう。
なお、数列ではなく文字列を与えたい場合は以下のようにmap( ) 関数なしで良いです。
data = list(input().split())
print(data)
この授業の段階では先の記述の意味がわからなくても良いのですが、以下に内部的な振る舞いが想像つくような材料を置いておきます。興味のある人は試してみると良いでしょう。
>>> input() <<< とりあえず input( ) を試す
1 2 3 <<< 1 2 3 と入力した
'1 2 3' <<< input() では入力した内容が文字列として得られる
>>> input().split() <<< 得られた文字列に split() を適用してみる
1 2 3 <<< 1 2 3 と入力
['1', '2', '3'] <<< split( ) するとリストになった(ただし要素は文字)
>>> map(int, input().split()) <<< 得られたリストに map() を適用してみる
1 2 3 <<< 1 2 3 と入力
<map object at 0x104acddc0> <<< map オブジェクトが生成されている
>>> list(map(int, input().split())) <<< 得られた map オブジェクトに list( ) 関数を適用
1 2 3 <<< 1 2 3 と入力
[1, 2, 3] <<< 数値のリストになった(目的達成)
>>>
上の分解処理の内容に納得できた人向けに、こんな方法もあることを紹介しておきます。
>>> x, y = input().split() <<< 文字列を二つ入力し、二つの変数に格納する
test string
>>> x
'test'
>>> y
'string'
>>>
>>> n1, n2, n3 = map(int, input().split()) <<< 入力を数値化して、二つの変数に格納する
1 2 3
>>> n1
1
>>> n2
2
>>> n3
3
>>>
ここで登場した、変数や値を「 , (カンマ)」で括る記述は「タプル」と呼ばれるデータ型を構成します。教科書 p.138 「6.1 タプル」に登場します。そこでの説明はほんの少しですが、Python のプログラムでは良く登場します。秋学期の「基礎プログラミングB」で扱います。