Pythonでは、ワンライナーはやりづらいのですが、できなくはないです。
Pythonでワンライナーがやりづらい理由は、式にできることが少ないこと、複合文を1行で書けないことに集約されると思います。
ここでは、いろんな処理を式に落としこむための方法を紹介します。
#基本の方法
##and, or, 三項演算子
if a: f()
は、a and f()
と書けます。if not a: f()
は、a or f()
と書けます。
(論理演算子の短絡についてよく知らない方は、手前味噌ですが、 http://qiita.com/gyu-don/items/a0aed0f94b8b35c43290 をご覧ください。)
また、三項演算子は若干気持ち悪い構文ですが用意されています。 true_value if condition else false_value
##タプル化、リスト化
タプルやリストを作れば、複数の式をひとつの式にまとめることができます。最後に[0]や[-1]などで参照すれば、特定の箇所の値を取り出すこともできます。
#リスト内包表記を使ったループ
ループはリスト内包表記で行います。
##ジェネレータ
特にPython3では、至るところでジェネレータオブジェクトが出てきますが。副作用を期待しているときはとくに、リストとジェネレータの違いは重要です。
リスト内包表記は、その場で最後の要素まで、リストが作られます。一方で、ジェネレータは、next()で呼び出されるまで各要素は評価されません。各要素を評価するには、自分でnextを呼び出すか、list(gen)のようにするか、リスト内包表記のfor ... inで使うかです。
#lambdaを使ったあれこれ
##lambda
lambdaで匿名関数が作れますが、Pythonでは、匿名関数は単一の式でしか作れません。
##letの代わりに
lambdaを使うと、文を作らずに、変数を束縛することができます。セミコロンを使いづらい場面にどうぞ。
(lambda a,b: a+b)(f(),g())
は、a=f();b=g();a+b
を式で実現しています。
##リストを持たせておく
Pythonでは代入は文になってしまいますが、list.appendなら式になります。引数にリストを持たせておくと便利かもしれません。
例: sumやreduceを使わずに、0〜100の足し算結果を返す式
(lambda t: [t.append(t.pop()+x)or t[0] for x in range(101)][-1])([0])
##再帰
Yコンビネータなんて複雑なものを作らなくても、関数に自分自身を受け取る引数があればいいのです。
例: 1〜10の階乗
(lambda f: f(10,f))(lambda n,f: n*f(n-1,f) if n>0 else 1)
#それではみなさん、よいPythonライフを
おわり。