PythonのIF文

スポンサーリンク
スポンサーリンク

基本

if aaa == bbb:
    print(1)
elif aaa == ccc:
    print(2)
else:
    print(3)
else ifではなく、elifです。ifやelif、else文の終わりにはコロン(:)を入れます。
内部の処理はインデントを設けます。このインデントがズレるとエラーになります。インデントは幾つでもいいのですが、一般的にスペース4つとされていますので、それに合わせましょう。

一行にまとめる方法

変数 = 値1 if 条件式 else 値2

上記のように記載すると条件式が正の場合は値1に、否の場合は値2になります。
ちょっとしたことですが、行数を減らせて、且つ見やすくなります。

for action in ["BUY", "SELL"]:

    profit = "SELL" if action == "BUY" else "BUY"

    print(profit)

# SELL
# BUY

複数条件

if aaa <= bbb and aaa == ccc:
    print(1)

# カッコをつける
if (aaa <= bbb and aaa == ccc):
    print(1)

# 複数行
if (
    aaa <= bbb and
    aaa == ccc
):
    print(1)
複数行にする際は、カッコが必須です。入れ子にして複数のカッコで条件を作ることも可能です。

演算子

演算子結果
x < yxyより小さければ、True
x <= yxyより小さいか等しければ、True
x > yxyより大きければ、True
x >= yxyより大きいか等しければ、True
x == yxyの値が等しければ、True
x != yxyの値が等しくなければ、True
x is yxy同じオブジェクトであれば、True
x is not yxy同じオブジェクトでなければ、True
x in yxyに含まれていれば、True
x not in yxyに含まれていなければ、True
<=や>=はイコールが(=)が後にくる。
ノットイコールは<>ではなく!=となる。
is not と not in の順序を混同するので注意する。

Noneか

Noneの判断は以下になります。

  • ==またはis
  • !=またはis not
aaa = None

if aaa == None:
    print(True)
else:
    print(False)
# True

if aaa is None:
    print(True)
else:
    print(False)
# True

if aaa != None:
    print(True)
else:
    print(False)
# False

if aaa is not None:
    print(True)
else:
    print(False)
# False

nanか

csvの読み込みなどで発生するnanの判断方法は以下の2種類のライブラリで対応が可能です。
どちらも.isnan()になります。

その他の0やNoneは以下を参照してください。
空の値(0, None, nan

numpyを使う場合

np.isnan()

import numpy as np
 
num = np.nan
 
if np.isnan(num):
    print (True)
# True

mathを使う場合

math.isnan()

import math
 
num = math.nan
 
if math.isnan(num):
    print (True)
# True

変数の型の判別

if type(変数) is 型名とします。

# 整数
aaa = 1

print(type(aaa))
# <class 'int'>

print(type(aaa) is int)
# True

# 浮動小数点
aaa = 1.0

print(type(aaa))
# <class 'float'>

print(type(aaa) is float)
# True

# 文字列
aaa = "1"

print(type(aaa))
# <class 'str'>

print(type(aaa) is str)
# True

# 真偽値型
aaa = True

print(type(aaa))
# <class 'bool'>

print(type(aaa) is bool)
# True

# クラス
class bbb():
    pass
    
aaa = bbb()

print(type(aaa))
# <class '__main__.bbb'>

print(type(aaa) is bbb)
# True

日付

typeを使って、datetime.datetimeと比較します。

import datetime
now = datetime.datetime.now()
print(now)
# 2021-01-22 15:20:14.472420

if type(now) == datetime.datetime:
    print(True)
else:
    print(False)
# True

now = now.strftime('%Y-%m-%d %H:%M:%S%z') # 文字列に変換
if type(now) == datetime.datetime:
    print(True)
else:
    print(False)
# False

 

同じオブジェクトか(is、is not

data = None
if data is None:
    print("YES")

if data is not None:
    print("YES")

if data == None: # エラーになることがある
    print("YES")
論理比較のNone を使うときは、isを使いましょう。==はエラーになることもあり、スピードもisの方が処理が速いです。

含まれているか(in、not in

変数

# 含まれているか?
if 'bbb' in 'aaa-bbb-ccc':
    print("YES")

# 含まれていないか?
if 'bbb' not in 'aaa-bbb-ccc':
    print("YES")

リスト型、タプル型、辞書型

# リスト型(list)
data = ["Tokyo", "Osaka", "Kyoto"]
if "Tokyo" in data:
    print("YES")

# タプル型
data = ("Tokyo", "Osaka", "Kyoto")
if "Tokyo" in data:
    print("YES")

# 辞書型 (連想配列、dict) 
# キーの有無
data = {"Tokyo":1, "Osaka":2, "Kyoto":3}
if "Tokyo" in data:
    print("YES")
# 値の有無
if 1 in data.values():
    print("YES")
上記、いずれもTrueですのでYESと表示されます。not inも同じです。
辞書型の値の有無は、data.values()とする。

これを応用して、実行確認の処理に使えます。

choose = input("実行しますか? 'y' or 'n':")
if choose in ['y', 'Y', 'ye', 'yes']:
    print('実行する')
elif choice in ['n', 'N', 'no']:
    print('実行しない')

前方一致、後方一致

data = "aaa-bbb-ccc"

# 前方一致
if data.startswith("aaa"):
    print("YES")

# 前方のいずれかの文字列に一致
if data.startswith(('aaa', 'bbb', 'ccc')):
    print("YES")
    
# 後方一致
if data.endswith('ccc'):
    print("YES")

# 後方いずれかの文字列に一致
if data.endswith(('aaa', 'bbb', 'ccc')):
    print("YES")
inや*、正規表現などを使わないです。

形式(フォーマット)チェック(正規表現)

reという標準ライブラリを使用します。標準ですのでインストールは不要です。

以下の正規表現は完璧ではないです。正規表現は使えるよってくらいに思ってください。

import re

# メールアドレスの形式か?
email = 'aaa@xxx.com'
if re.match('(.+)@(.+)\.(.+)', email):
    print("OK")

# 電話番号の形式か?
tel = "03-1234-5678"
if re.match('[0-9]{2}-[0-9]{4}-[0-9]{4}', tel):
    print("OK")

# 日付の形式か?
data = "2020/01/04"
if re.match('[0-9]{4}/[0-9]{1,2}/[0-9]{1,2}$', data):
    print("OK")

文字列の判別

全て大文字か

結果を見てもらえればわかると思いますが、小文字が含まれているとFalseを返します。数値や記号が含まれていてもTrueとなります。

text = "AAA"
print(text.isupper())
# True

text = "aaa"
print(text.isupper())
# False

text = "Aaa"
print(text.isupper())
# False

text = "A12"
print(text.isupper())
# True

text = "A+A\*"
print(text.isupper())
# True

全て小文字か

「全て大文字か」の逆になります。こちらも数値や記号が含まれていてもTrueとなります。

text = "AAA"
print(text.islower())
# False

text = "aaa"
print(text.islower())
# True

text = "Aaa"
print(text.islower())
# False

text = "a12"
print(text.islower())
# True

text = "a+a\*"
print(text.islower())
# True

全て英字か

数字と記号が含まれているとFalseを返します。

text = "AAA"
print(text.isalpha())
# True

text = "aaa"
print(text.isalpha())
# True

text = "Aaa"
print(text.isalpha())
# True

text = "a12"
print(text.isalpha())
# False

text = "a+a\*"
print(text.isalpha())
# False

全て英数字か

記号が含まれているとFalseを返します。数値が含まれていてもTrueとなります。

text = "AAA"
print(text.isalnum())
# True

text = "aaa"
print(text.isalnum())
# True

text = "Aaa"
print(text.isalnum())
# True

text = "a12"
print(text.isalnum())
# True

text = "a+a\*"
print(text.isalnum())
# False

全て数値か

符号(+-)、桁区切り(,)、小数点(.)は、Falseになります。

text = "a12"
print(text.isnumeric())
# False

text = "123"
print(text.isnumeric())
# True

text = "+123"
print(text.isnumeric())
# False

text = "-123"
print(text.isnumeric())
# False

text = "123,456"
print(text.isnumeric())
# False

text = "123,456"
print(text.isnumeric())
# False

全てASCII文字列か

ASCII文字って表現は難しいですよね。ざっくりですが、半角英数字、記号、スペースなどで、半角カタカナや2バイト文字のひらがなや漢字などは含みません。

text = "AAA"
print(text.isascii())
# True

text = "aaa"
print(text.isascii())
# True

text = "Aaa"
print(text.isascii())
# True

text = "a12"
print(text.isascii())
# True

text = "a+a\*"
print(text.isascii())
# True

text = "アアア"
print(text.isascii())
# False

text = "阿阿阿"
print(text.isascii())
# False

text = "あああ"
print(text.isascii())
# False

タイトルケースか

タイトルケースってなんだ。以下のように単語の先頭を全て大文字にすることです。普通の文章を変換するとおかしいですが、タイトルだとなるほどなと思います。
例)The New York Times, Bloomberg Customer Support

text = "This is a pen."
print(text.istitle())
# False

text = "This Is a Pen."
print(text.istitle())
# False

text = "This Is A Pen."
print(text.istitle())
# True

すべて満たすか?いずれか満たすか?

すべて満たすか?

以下では、配列内に指定した文字がすべて含まれているかをallで判断しています。

("2" in s)の箇所を後方一致などに変更しても利用できます。

if all(("2" in s) for s in ["aaa1", "bbb1", "ccc1"]):
    print(True)
else:
    print(False)

# True

if all(("2" in s) for s in ["aaa1", "bbb1", "ccc1"]):
    print(True)
else:
    print(False)

# False

いずれか満たすか?

以下では、配列内に指定した文字がいづれか含まれているかをanyで判断しています。

("2" in s)の箇所を後方一致などに変更しても利用できます。

if any(("a" in s) for s in ["aaa1", "bbb1", "ccc1"]):
    print(True)
else:
    print(False)

# True

if any(("x" in s) for s in ["aaa1", "bbb1", "ccc1"]):
    print(True)
else:
    print(False)

# False

以下のように("2" in s)の箇所を逆にすると、いずれかの文字が含まれているというチェックができます。

if any((s in "xyz") for s in ["k", "s", "x"]):
    print(True)
else:
    print(False)

# True

if any((s in "abc") for s in ["k", "s", "x"]):
    print(True)
else:
    print(False)

# False

いずれも満たさない

以下では、配列内に指定した文字がいづれも含まれていないかを判断しています。

not anyで上記のいずれも満たすの逆になります。

if not any((s in "xyz") for s in ["k", "s", "x"]):
    print(True)
else:
    print(False)

# False

if not any((s in "abc") for s in ["k", "s", "x"]):
    print(True)
else:
    print(False)

# True

 

タイトルとURLをコピーしました