42

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

私はグーグルで検索しましたが、実際に実行できるものを見つけることができませんか? 誰かが助言し、できればいくつかの例を挙げてもらえますか?

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

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

または:

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

10 に答える 10

55

良い、

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

これは改善ですか?いいえifステートメントをセミコロンで区切って -clauseの本体にさらにステートメントを追加することもできます。私はそれに対してお勧めします。

于 2009-11-13T12:50:41.077 に答える
42

ほとんどの場合、ブロック句を 1 行で実行するのは悪い考えであることがわかりました。

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

場合によっては、Python は 1 行でより Pythonic な処理を行う方法を提供します。Nick 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 行ブロックにしないことをお勧めします。

于 2009-11-13T13:31:32.207 に答える
19

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

if condition:
    do_something()


if condition: do_something()

if condition:
    do_something()
    do_something_else()

if condition: do_something(); do_something_else()

...等。

于 2009-11-13T12:50:58.423 に答える
12

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

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

于 2009-11-13T12:55:39.220 に答える
7
for a in someList:
    list.append(splitColon.split(a))

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

newlist = [splitColon.split(a) for a in someList]
于 2009-11-13T13:10:09.100 に答える
6

Python では、インデントされた句が 1 行だけの場合、同じ行に配置できます。

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

def squared(x): return x * x

class MyException(Exception): pass
于 2009-11-13T12:51:36.407 に答える
4

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

if "exam" in "example": print "yes!"
于 2009-11-13T12:51:12.257 に答える
4

for ...: if ...:古いバージョンの Python では、ブロック導入ステートメントの後に、または同様のブロックの導入ステートメントを 1 つしか使用できませんでした。

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

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)()
于 2009-11-14T12:20:51.260 に答える
0

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

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

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
于 2009-11-13T15:15:51.793 に答える
0

これは、アクションを使用した「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
于 2016-04-25T04:37:51.873 に答える