ここではたびたび、誰かのコードと「ワンライナー」のように見えるコードを確認します。これは、従来の「if」ステートメントまたは「for」ループが標準的な方法で実行される1行のステートメントです。
私はグーグルで調べましたが、どのようなものを実行できるのか本当にわかりませんか?誰かに助言し、できればいくつかの例を与えることができますか?
たとえば、これを1行で実行できますか。
example = "example"
if "exam" in example:
print "yes!"
または:
for a in someList:
list.append(splitColon.split(a))
まあ、
if "exam" in "example": print "yes!"
これは改善ですか? いいえ。セミコロンで区切ることで、if
句の本文にさらにステートメントを追加することもできます。 againstをお勧めします。
ほとんどの場合、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行のブロックに対してアドバイスします。
より一般的には、次のすべてが構文的に有効です。
if condition:
do_something()
if condition: do_something()
if condition:
do_something()
do_something_else()
if condition: do_something(); do_something_else()
...等。
改行を削除するだけではない言語機能の例ですが、これはより冗長なバージョンよりも明確であるとはまだ確信していません
x> 15の場合はa = 1、そうでない場合は2
for a in someList:
list.append(splitColon.split(a))
上記を次のように書き換えることができます。
newlist = [splitColon.split(a) for a in someList]
Pythonでは、インデントされた句が1行しかない場合、同じ行に配置できます。
if "exam" in example: print "yes!"
def squared(x): return x * x
class MyException(Exception): pass
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
...単純なbreak
continue
、さらには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)()
example
変数を省略することで、これらすべてを1行で実行できます。
if "exam" in "example": print "yes!"
pythonには、彼が and-or trick と呼んでいるものについて少し話しています。これは、複雑なロジックを1行に詰め込む効果的な方法のようです。
基本的に、真実をテストし、それに基づいて値を返す方法を提供することにより、cの三項演算子をシミュレートします。例えば:
>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
これは、アクションを持つ「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