tuneoの日記: Pythonでワンライナーでimportの後にforでループ
以下の3つのワンライナーを書いて実行すると、3番目だけがうまくない。
$ python3 -c "for n in range(1,11): print(n)" # OK
$ python3 -c "import sys; sys.exit(0)" # OK
$ python3 -c "import sys; for l in sys.stdin: print(l, end='')" # NG
File "<string>", line 1
import sys; for l in sys.stdin: print(l, end='')
^
SyntaxError: invalid syntax
importでモジュールをインポートした直後にforでループするとあかんことになるらしい。ぐぐってみたところPythonでimport ; の後にはforやwhile、if、たぶんtry-except-else-finally, with - asなどの複合文を書くことは文法的に許されないらしい。
ただし"import ~; for ~"については若干トリッキーな回避策がある。Pythonにおいても「式は文」であり、しかも式文は"import ~;"の後に書ける単純文なので、上記の例はリスト内包表記を使って以下のように書くことができるんだとさ。
$ python3 -c 'import sys; [ print(l, end="") for l in sys.stdin ]'
リスト内包表記にすることで「入力行の行数と等しい個数のNoneを要素にしたリスト」が生成されてしまうのはご愛嬌というものだろう。
Pythonでワンライナーでimportの後にforでループ More ログイン