印刷用のifステートメントをインラインで記述する方法は?


377

ブール変数がに設定されてTrueいる場合にのみ、いくつかのものを出力する必要があります。だから、見て後に、この、私は簡単な例を挙げてみました:

>>> a = 100
>>> b = True
>>> print a if b
  File "<stdin>", line 1
    print a if b
             ^
SyntaxError: invalid syntax  

書いても同じprint a if b==True

ここで何が欠けていますか?



2
良い質問、複雑な答え...正解は「その他の部分は必須」です。

回答:


738

Pythonには末尾のステートメントはありませif

ifPythonには2種類あります。

  1. if ステートメント:

    if condition: statement
    if condition:
        block
    
  2. if (Python 2.5で導入)

    expression_if_true if condition else expression_if_false

print ab = aはどちらもステートメントです。a部分だけが表現です。だからあなたが書くなら

print a if b else 0

その意味は

print (a if b else 0)

同様にあなたが書くとき

x = a if b else 0

その意味は

x = (a if b else 0)

else句がない場合、それは何を印刷/割り当てますか?印刷/割り当てはまだあります。

そして、そこに置きたくない場合は、通常のifステートメントを常に1行で記述できますが、読みにくく、2行のバリアントを回避する理由はありません。


if condition: statement複数行のステートメントの場合は機能しないと思います。
Val

はい。ただし、使用する必要はありません。以下の例で示すように、ブールロジックを使用するだけです。
エドゥアルド

1
@JanHudec Pythonに末尾のがない場合if、なぜこれが機能するのですprint [i for i in range(10) if i%2]か?私は彼らが理解の外でそれを許可したいのですが...
mbomb007

3
@ mbomb007、これも末尾のif ステートメントではありません。これは、単にリスト(またはジェネレータ)内包の一部です。ifの前の部分はステートメントではなく、2つの式のfor間にあることに注意してください。
Jan Hudec、2015

2
@AlexandervonWernherr、はい、それは合理的に聞こえます。
Jan Hudec、

93

インラインif-else EXPRESSIONには常にelse句を含める必要があります。例:

a = 1 if b else 0

'a'変数の値を変更せずに残したい場合-古い 'a'値をアサートします(それ以外の場合でも構文要求で必要です):

a = 1 if b else a

このコードは bがFalseになると変更されません。


1
ああ。しかし、elseブランチで何も起こしたくない場合はどうなりますか?私は次のようなものが必要ですprint a if b
リッキー・ロビンソン

2
else aその後、より良いでしょうelse 0
アネロイド2012

13
if b: print aその場合はシンプルなものが必要です
jamylak 2012

4
答えを修正する。「ステートメント」という言葉が完全に悪いものにならなかったとしても、それはほとんど問題ないからです。問題の要点は、それが陳述ではないということです。
Jan Hudec 2012

1
+ 1-1:else式が必須であることを指摘するのに適していますが、問題のケースに答えを提供しないことは問題ありません:「nothing」を印刷します(""またはの行にあるものNone、他の回答の詳細を参照)。
sancho.s ReinstateMonicaCellio 2014

18

「else」ステートメントは必須です。あなたはこのようなことをすることができます:

>>> b = True
>>> a = 1 if b else None
>>> a
1
>>> b = False
>>> a = 1 if b else None
>>> a
>>> 

編集:

または、必要に応じて、次のことを試してください。

>>> if b: print(a)

15

したくない場合from __future__ import print_functionは、次の操作を実行できます。

a = 100
b = True
print a if b else "",  # Note the comma!
print "see no new line"

どのプリント:

100 see no new line

あなたが嫌い​​ではない、from __future__ import print_functionまたはPython 3以降を使用している場合:

from __future__ import print_function
a = False
b = 100
print(b if a else "", end = "")

elseを追加することは、コードを構文的に正しくするために必要な唯一の変更です。条件式にはelseが必要です(「elseブロックのインライン」)。

私がスレッドで他の人を使用しなかった、Noneまたは使用した理由0は、使用None/0するとプログラムが、print Noneまたはprint 0の場合に発生するためbですFalse

このトピックについて読みたい場合は、この機能がPythonに追加されたパッチのリリースノートへのリンクを含めました。

上記の「パターン」は、PEP 308に示されているパターンと非常に似ています。

この構文は奇妙で逆に見えるかもしれません。条件がCのcのように前ではなく式の途中にあるのはなぜですか?x:y?この決定は、新しい構文を標準ライブラリのモジュールに適用し、結果のコードがどのように読み取られるかを確認することによって確認されました。条件式が使用される多くの場合、1つの値は「一般的なケース」であり、1つの値は「例外的なケース」であり、条件が満たされないまれな場合にのみ使用されます。条件付き構文により、このパターンはもう少し明白になります。

内容=((doc + '\ n')if doc else '')

だから私は全体的にこれはそれを承認するための合理的な方法だと思いますが、あなたは以下の単純さで議論することはできません:

if logging: print data

ありがとう。ここでのことprint ""は、それでも何かを印刷することです:空白行。
リッキーロビンソン

ありがとう。のend引数はprintPython 3.x でのみ表示されますよね?
リッキーロビンソン2013年

1
ええ、私は2.7の男性なので、 from __future__ import print_function
Noelkd


8

以下を使用できます。

print (1==2 and "only if condition true" or "in case condition is false")

同様に、次のように続けることができます。

print 1==2 and "aa" or ((2==3) and "bb" or "cc")

実際の例:

>>> print "%d item%s found." % (count, (count>1 and 's' or ''))
1 item found.
>>> count = 2
>>> print "%d item%s found." % (count, (count>1 and 's' or ''))
2 items found.

7

これは、文字列フォーマットで行うことができます。%表記、.format()およびf-strings(3.6の新機能)で動作します

print '%s' % (a if b else "")

または

print '{}'.format(a if b else "")

または

print(f'{a if b else ""}')

これはフォーマットとは関係ありません。あなたはただすることができますprint a if b else ""。それはまさにノエルクドの答えがすることです。
メルポメン2017

@melpomeneが ""を出力すると、新しい行が表示されます。print "",これは、Python2では(コロン)を使用print("", end="")し、Python3では使用しないでください。
m3nda 2017年

5

あなたの場合、これはうまくいきます:

a = b or 0

編集:これはどのように機能しますか?

質問では

b = True

だから評価

b or 0

結果は

True

に割り当てられていaます。

の場合b == False?、に割り当てられるb or 02番目のオペランドに評価0されaます。


3
この表現の醜さや間違いのしやすさが、そもそも条件付き表現がある理由です。
Jan Hudec 2012

5

これを試して 。それはあなたを助けるかもしれません

a=100
b=True

if b:
   print a

4

単純化しすぎです。

if b:
   print a

1
もちろん、これが最も簡単なオプションです。私は、私のようなものをやってみたかった(2012年8月)時のことを考える:if DEBUG: print something
リッキー・ロビンソン

回答が重複していますか?SkariaArunによるコメントとコメントを参照してください。
sancho.s ReinstateMonicaCellio 2014

2

次の場合は常にelseインラインが必要です。

a = 1 if b else 0

しかし、それを行うための簡単な方法は次のようになりますa = int(b)


3
-1:より簡単です。そして完全に読めない。とにかく、質問者が望んでいたものではありません。
Jan Hudec 2012

ITYM a = int(bool(b))
glglgl 2013

1

さて、なぜあなたは単に書きませんか?

if b:
    print a
else:
    print 'b is false'

1

うーん、リスト内包表記でそれを行うことができます。これは、実際の範囲が存在する場合にのみ意味があります。

print([a for i in range(0,1) if b])

または、これら2つの変数のみを使用します。

print([a for a in range(a,a+1) if b])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.