パスワードを忘れた? アカウント作成
15760658 journal
日記

tuneoの日記: Pythonでワンライナーでimportの後にforでループ

日記 by tuneo

以下の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を要素にしたリスト」が生成されてしまうのはご愛嬌というものだろう。

この議論は、tuneo (2938)によって トモとそのトモ専用として作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

ハッカーとクラッカーの違い。大してないと思います -- あるアレゲ

読み込み中...