Python基礎構文if
if文はプログラミングの中で最も基礎の処理です。
日本語で言うと「もし○○だったら△△の処理を実行」
Pythonのif文は他の言語に比べ非常に読みやすいのが特徴です。
というのも、他の言語と違い、余計な記号で囲む必要がなく、カッコの付け忘れによるエラーなど起きる余地がありません。
他の言語をすでに習得している方ほど、Pythonのif文を見ればきっと「Pythonめっちゃ分かりやすいじゃん」ってなると思います。
サンプルコードも沢山載せていきますので、是非コピペして色々試してみてください。
Python if文の前提知識
Pythonのif文には他の言語とは少し違った、最初に抑えておくべき基本的なルールが存在します。
a = 1 b = 1 if a == b: print('aとbは等しい')
いかがでしょうか?
非常に読みやすくないですか?
特徴というのはprintの行の開始部分のインデントです。
if文の評価行の「次の行」は必ずタブインデントが使われている必要があります。
他の言語と違い、Pythonのインデントは構文上の意味を持っており、インデントがなければエラーとなり、プログラム自体が動きません。
これをオフサイドルールと言います。if同様、for文など、階層的処理の場合は必ずこのインデントが必要となります。
覚えておいてください。
ifの評価行の末尾は:(コロン)でくくります。
スクリプト中の空白は必ず半角である必要があります。
if ○○ else ●●
日本語で言うと「もし○○であれば△△、さもなければ●●」です。
if文の評価の結果が「偽」であった場合、行いたい処理はelseの下に書きます。
a = 1 b = 0 if a == b: print('aとbは等しい') else: #←elseの行末にもコロンが必要 print('aとbは等しくない')
ifの直下と同じくelseの直下はインデントが必要です。
if ○○ elif ◇◇
日本語で言うと「もし○○であれば△△だが、そうでなく◇◇であれば」
です。
他の言語だと else if と記述されることが多いですがPythonではelifです。
空白もいりません。
さらに最終的に行き着くelseまで入れると以下のようになります。
a = 1 b = 0 if a == b: print('1:aとbは等しい') elif a < b: #←elifの行末にもコロンが必要 print('2:aはbより小さい') else: print('3:aばBより大きい') print('4:aとbの比較が完了しました')
この場合aはbより大きのでelseの下のprint 3番が実行されます。
if文を抜ける場合はインデントを下げるだけでOK。
カッコや、end if など余計なモノはいりません。
一番下のprint4番は、if文を抜けた後ということになるので、aとbの比較演算の結果は関係なく、かならず実行される位置になります。
ここまでがPythonのif文の基本です。
if文の評価式
比較演算子
if文評価行でよく使われる比較演算子です。基本的にイコール関係以外は数学と同じですのでパッと見で分かると思います。
a == b bがaに等しい a != b bがaに等しくない a > b bよりaが大きい a >= b bよりaが大きいか等しい a < b bよりaが小さい a <= b bよりaが小さいか等しい
ちなみにただの=(イコール)は代入演算子と言って、変数に値を代入するときに使います。
更に==(等価)、!=(非等価)は文字列同士の比較に使うこともできます。
if 'すいか' == 'みかん': print(1) elif 'りんご' == 'リンゴ': print(2) elif 'リンゴ' != 'リンゴ': print(3) else: print(4)
この場合、評価式内は全てFalseですのでelse直下のprint(4)が実行されます。
比較式以外のif評価演算
if文では比較演算式以外も受け渡すことができます。
長々コードを書く必要がなくなる、ちょっとしたコード短縮する、知ってるだけで得するテクニックですので、覚えていて損はありません。
文字列(str)をそのまま渡す
if 'aaa': print('文字列(str)の引き渡し') >>>True if '': print('ここは実行されません') >>>False
空白ならFalseになります。== ” は蛇足ですね。
数字(int)をそのまま渡す
if 1: print('数字(int)の引き渡し') >>>True if 0: print('ここは実行されません') >>>False
1以上の整数はTrue、0はFalse
bool値をそのまま渡す
if True: print('boolean(bool)の引き渡し') >>>True if False: print('ここは実行されません') >>>False
リスト(list)をそのまま渡す
if ['リンゴ','みかん']: print('リスト(list)の引き渡し') >>>True if []: print('ここは実行されません') >>>False
辞書(dict)をそのまま渡す
if {'リンゴ':100,'みかん':50}: print('辞書(dict)の引き渡し') >>>True if {}: print('ここは実行されません') >>>False
タプル(tuple)をそのまま渡す
if (1,100,500): print('タプル(tuple)の引き渡し') >>>True if (): print('ここは実行されません') >>>False
基本的にオブジェクトを直で渡した場合空白ならFalseと覚えておいてください。
複数の条件式を評価する
論理演算子
上でelifによる条件分岐をお伝えしましたが、一行で複数の条件式を比較し、評価することもできます。
「論理演算子」なんて言うと、初心者の方は怯んでしまいがちですが、日本語に置き換えて考えればそれほど難しい事はありません。
and演算子(論理積)
日本語で言うと「Aが真、かつ、Bも真」の場合Trueとなります。
and演算子で分割された「全ての辺」がTrueの場合にTrueを返します。
a = 10 b = 1 if a > 1 and b < 2: print('論理積はTrue')
and の左辺を評価し、Trueであれば右辺を評価します。
両辺がTrueを返せばand演算はTrueとなります。
and演算子はいくつでも繋げることができ、もちろん、文字列やオブジェクトをそのまま渡すこともできます。
a = 10 b = 1 if a > 1 and b < 2 and 1000 and '': print('ここは実行されません') else: print('論理積はFalse')
上記の場合1000を渡したところまではTrueですが、最後に空白の文字列を渡しているのでFalseとなり、and演算(論理積)もFalseとなります。
or演算子(論理和)
日本語で言うと「Aが真、もしくは、Bが真」の場合Trueとなります。
and演算子で分割された、「いずれかの辺」がTrueの場合にTrueを返します。
a = 10 b = 1 if a == 1 or b != 2: print('論理和はTrue')
左辺:a と 1 はと等しい => 偽(False)
右辺:b と 2 は等しくない => 真(True)
この場合の論理和はTrueとなり、printが実行されます。
or演算子もいくつでも繋げることができ、もちろん、文字列やオブジェクトをそのまま渡すこともできます。
a = 10 b = 1 if a < 1 or b > 2 or 1000 or '': print('論理和はTrue')
この場合1000が整数でそのまま渡されているので、True。
他の比較式は全てFlaseですが、orはいずれかがTrueであればTrueを返します。
not演算子(否定)
日本語で言うと「Aが真なら偽、偽なら真」を返します。
反転、とも言います。早い話が、論理パズルとかで言うところの、
絶対にウソをつく神様、的なヤツです。
a = 10 b = 1 if not a == b: print('True')
この場合 a と b は等しくないですがnot演算子があるので、結果が否定(反転)されprintは実行されます。
notをandやorでつなげる場合
notは直後に書かれた評価式のみを反転させます。つまりandやor演算子よりも先に評価されます。
どういうことかというと、少しややこしい話になりますが、and や or によってnotを含む式をつなげる場合は都度notが必要です。
a = 10 b = 1 if not a == b and a < b: print('ここは実行されません')
(a == b) =>False
(a < b) =>False
ここまでが通常の比較演算です。
notが付いているので、and演算結果のFalseをひっくり返してTrueになるかと思いきや、結果が反転されるのはand左辺の(a == b)のみですので、最終的なand演算の結果はFalseとなり、printは実行されません。
notの方がandより先に演算されるということですね。
andやorの結果を反転させたい場合は評価式に都度notを付ける必要があります。
a = 10 b = 1 if not a == b and not a < b: print('論理積はTrue')
または一気に結果をひっくり返したい時は以下の様な書き方をします。
a = 10 b = 1 if not (a == b and a < b and '' and False): print('論理積の一括否定')
数学と同じルールで、論理演算も()で括った部分は先に計算されます。
上記の場合、各項の評価は全てFalseで、andによる論理積演算結果もFalseです。その結果をnotで反転させているので最終的な結果はTrueとなりprintは実行されます。
ビット演算子
論理演算子の仲間にビット演算子というものがあります。
コンピュータというのは最終的に0か1か、またはその組み合わせによって物事を判断しています。
その0と1の集合のことを「ビット」と呼びますが、True/Falseと呼ばれる、いわゆる真偽値というのは単体のビットそのものです。
Trueは1
Falseは0
ビット演算子はこれら二進数と呼ばれる数字を扱うための演算子ですが、もちろんif文内でも使うことができます。
&演算子(論理積)
a = 10 b = 1 if (a != b) & (a < b): print('ここは実行されません')
and演算子と同じく論理積を求める演算子です。
見たまま&ですので覚えやすいですね。
他のプログラミング言語を習得している状態の方はこっちの方がなじみ深くとっつきやすいかもしれません。
ただし、気を付けなければならないことがあります。
&両辺を()で括っているのはand演算子と違いビット演算子の&演算子は計算の優先順位が比較演算子よりも高いため、直観的な見た目の結果と実際の結果が違ってくることに注意が必要です。
a = 10 b = 1 if a != b & a < b: print('論理積はTrue')
先ほどのコードとほぼ同じ内容ですが、&演算子の両辺を()でくくっていません。
この場合、最終的なif文の評価結果はTrueになりprintは実行されます。
他のプログラミング言語を習得している状態の方はこっちの方がなじみ深くとっつきやすいかもしれませんが、andやorの論理演算子と比べ、ビット演算子は計算の優先順位が高くなります。
直観的に見るとFalseが返ってきそうなコードですし、他の言語ではそもそも&が論理演算子として使われることもあるのでかなり違和感があるかもしれません。
上記コードの場合は以下の様な評価順で最終結果がTrueとなります。
b & a =>0
0 < b =>True
a != True =>True
|演算子(論理和)
a = 10 b = 1 if (a != b) | (a < b): print('論理和はTrue')
or演算子と同じ論理和を求める | ビット演算子です。
~演算子(反転)
a = 10 b = 1 if ~(a < b): print('比較演算をビット反転してTrue')
ちらはnot演算子と同じく否定(反転)を表す~演算子
^演算子(排他的論理和)
排他的論理和(XOR)
新顔ですね。いずれかがTrueの場合のみTrueを返す、ちょっと変わったヤツです。
True ^ False >>> True False ^ True >>> True True ^ True >>> False False ^ False >>> False
「いつ使うねん!」と聞かれると答えに困ります。
こんなのもあるってことだけ覚えていればOKだと思います。
Python if まとめ
プログラミング言語の中でもっとも基本の処理ifをマスター出来ました。
コメント