LoginSignup
27
31

More than 5 years have passed since last update.

Pythonでのワンライナー

Posted at

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ライフを

おわり。

27
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
31