基本
if aaa == bbb: print(1) elif aaa == ccc: print(2) else: print(3)
内部の処理はインデントを設けます。このインデントがズレるとエラーになります。インデントは幾つでもいいのですが、一般的にスペース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 < y | xがyより小さければ、True |
x <= y | xがyより小さいか等しければ、True |
x > y | xがyより大きければ、True |
x >= y | xがyより大きいか等しければ、True |
x == y | xとyの値が等しければ、True |
x != y | xとyの値が等しくなければ、True |
x is y | xとyが同じオブジェクトであれば、True |
x is not y | xとyが同じオブジェクトでなければ、True |
x in y | xがyに含まれていれば、True |
x not in y | xがyに含まれていなければ、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")
含まれているか(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")
辞書型の値の有無は、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")
形式(フォーマット)チェック(正規表現)
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