見出し画像

【Python】SimplePrograms line 8 コマンドライン引数と例外

8行プログラムです。

# This program adds up integers that have been passed as arguments in the command line 
import sys
try:
    total = sum(int(arg) for arg in sys.argv[1:])
    print ('sum =', total)
except ValueError:
    print ('Please supply integer arguments')

こちらが実行結果。

$ python l7.py
sum = 0
$ python l7.py 1 2 3
sum = 6
$ python l7.py a
Please supply integer arguments
$

8行と言っても、折り返して2行になったコメント行を含むので、実際のステップ数は6行。
1行目と2行目のコメントはスキップして、3行目から。


import sys

「sys」をインポートします。
コマンドラインの引数は、この「sys」からアクセスします。


try:
    【A】
except ValueError:
    【B】

4行目と7行目はセットですね。
「try」は、そのブロック内で例外が発生すると拾ってくれます。
拾うのは「except」。
【A】で例外が発生すると、
【B】に飛びます。
何を置いても、飛びます。

今回の場合、【A】には2行あります。

    total = sum(int(arg) for arg in sys.argv[1:])
    print ('sum =', total)

1行目の「total」の行で例外が発生すると、
2行目の「print」は実行されずに
「except」に飛びます。
これだけだと「goto」文に毛が生えたような感じでしかないだけど、例外はもっと便利な用途もあります。
例外は、別に書こうかな。


5行目。

    total = sum(int(arg) for arg in sys.argv[1:])

これはまた、いっぱい詰め込んじゃいましたね。
というか、この

(int(arg) for arg in sys.argv[1:])

という書き方は Python 特有なのですが、どうやら避けては通れないようです。なんと言っても C で書かれているらしいので、処理速度が速くなる由。
ただ、これも長くなるので後日。
ここでやっていることは
 引数を1つずつ文字列から数値に変換して
 全部足す
ということ。


あとはもうprint文しか残ってないな。
ああ!
コマンドライン引数!

sys.argv[1:]

コマンドライン引数はこの部分ですね。
これだけを表示してみると、こんな感じ。

$ cat arg.py
import sys
print(sys.argv[1:])
$ python arg.py a b c de
['a', 'b', 'c', 'de']
$

ちなみに [1:] は「リストの [1] 以降」という意味です。
これを取ってしまうと、こうなる。

$ !cat
cat arg.py
import sys
print(sys.argv)
$ !py
python arg.py a b c de
['arg.py', 'a', 'b', 'c', 'de']
$

そう。
sys.argv[0] = コマンド
sys.argv[1] = 第1引数
sys.argv[2] = 第2引数

となります。
「argv」にはコマンドそのものも含みます。
これは C と同じです。

いいなと思ったら応援しよう!