Help us understand the problem. What is going on with this article?

Pythonでのワンライナー

More than 3 years have passed since last update.

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

おわり。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away