web-dev-qa-db-ja.com

1行の「if」/「for」文はPythonスタイル?

ここではたびたび、誰かのコードと「ワンライナー」のように見えるコードを確認します。これは、従来の「if」ステートメントまたは「for」ループが標準的な方法で実行される1行のステートメントです。

私はグーグルで調べましたが、どのようなものを実行できるのか本当にわかりませんか?誰かに助言し、できればいくつかの例を与えることができますか?

たとえば、これを1行で実行できますか。

example = "example"
if "exam" in example:
    print "yes!"

または:

for a in someList:
    list.append(splitColon.split(a))
40
Federer

まあ、

if "exam" in "example": print "yes!"

これは改善ですか? いいえ。セミコロンで区切ることで、if句の本文にさらにステートメントを追加することもできます。 againstをお勧めします。

53
Stephan202

ほとんどの場合、1行でブロック句を実行するのは悪い考えです。

これも一般性として、コードの形式の品質を低下させます。高品質のコードフォームは、Pythonの主要な言語機能です。

場合によってはpythonは1行でより確実にPython的なことを行う方法を提供します。リストDでニックDが言及したことなど:

_newlist = [splitColon.split(a) for a in someList]
_

ただし、特に再利用可能なリストが必要な場合を除き、代わりにジェネレーターの使用を検討できます。

_listgen = (splitColon.split(a) for a in someList)
_

この2つの最大の違いは、ジェネレーターについて繰り返し説明することはできませんが、使用する方が効率的であることです。

pythonの最新バージョンには組み込みの三項演算子もあり、次のようなことができます

_string_to_print = "yes!" if "exam" in "example" else ""
print string_to_print
_

または

_iterator = max_value if iterator > max_value else iterator
_

一部の人々は、これらの類似のif (condition):ブロックよりも読みやすく使いやすいと感じるかもしれません。

結局のところ、コードスタイルと、作業中のチームの標準についてです。それが最も重要ですが、一般に、pythonのコードの形式は非常に重要なので、1行のブロックに対してアドバイスします。

39
Bryan McLemore

より一般的には、次のすべてが構文的に有効です。

if condition:
    do_something()


if condition: do_something()

if condition:
    do_something()
    do_something_else()

if condition: do_something(); do_something_else()

...等。

18
Cory Petosky

改行を削除するだけではない言語機能の例ですが、これはより冗長なバージョンよりも明確であるとはまだ確信していません

x> 15の場合はa = 1、そうでない場合は2

11
mbehan
for a in someList:
    list.append(splitColon.split(a))

上記を次のように書き換えることができます。

newlist = [splitColon.split(a) for a in someList]
7

Pythonでは、インデントされた句が1行しかない場合、同じ行に配置できます。

if "exam" in example: print "yes!"

def squared(x): return x * x

class MyException(Exception): pass
6
Ned Batchelder

Pythonの古いバージョンでは、for ...:if ...:または同様のブロック紹介文。

これらのいずれかと同じ行に複数の単純なステートメントがあることがわかります。ただし、機能しないさまざまな組み合わせがあります。たとえば、次のことができます。

for i in range(3): print "Here's i:"; print i

...しかし、一方で、次のことはできません。

for i in range(3): if i % 2: print "That's odd!"

私たちはできる:

x=10
while x > 0: print x; x-=1

...しかし、私たちはできません:

x=10; while x > 0: print x; x-=1

... 等々。

いずれにしても、これらはすべて非常に非Pythonicと見なされます。このようなコードを記述する場合、経験豊富なPythonistasはおそらくあなたのスキルの薄暗い見方をするでしょう。

場合によっては、1行に複数のステートメントを組み合わせても問題ありません。例えば:

x=0; y=1

... あるいは:

if some_condition(): break

...単純なbreakcontinue、さらにはreturnステートメントまたは割り当ての場合。

特に、一連のElifを使用する必要がある場合、次のようなものを使用できます。

if     keystroke == 'q':   break
Elif   keystroke == 'c':   action='continue'
Elif   keystroke == 'd':   action='delete'
# ...
else:                      action='ask again'

...それから、あなたは同僚をあまりイライラさせないかもしれません。 (ただし、Elifのチェーンは、そのような叫びがディスパッチテーブルにリファクタリングされるように... ...

dispatch = {
    'q': foo.break,
    'c': foo.continue,
    'd': foo.delete
    }


# ...
while True:
    key = SomeGetKey()
    dispatch.get(key, foo.try_again)()
4
Jim Dennis

example変数を省略することで、これらすべてを1行で実行できます。

if "exam" in "example": print "yes!"
3
Dominic Rodger

pythonには、彼が and-or trick と呼んでいるものについて少し話しています。これは、複雑なロジックを1行に詰め込む効果的な方法のようです。

基本的に、真実をテストし、それに基づいて値を返す方法を提供することにより、cの三項演算子をシミュレートします。例えば:

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
0
Dan Monego

これは、アクションを持つ「if else」の例です。

>>> def fun(num):
    print 'This is %d' % num
>>> fun(10) if 10 > 0 else fun(2)
this is 10
OR
>>> fun(10) if 10 < 0 else 1
1