allとany
pythonのallとanyについて。
○all(iterable)
iterableがすべてTrueのときのみTrueを返す。
iterableが空(empty)のときはTrueを返す。
○any(iterable)
iterableが1つでもTrueを含むとTrueを返す。
iterableが空のときはFalseを返す。
基本例
all([True, True, True]) #True all([True, False, True]) #False all([False, False, False]) #False all([1, 1, 1, 1, 1]) #True True=1 all([]) #True any([True, True, True]) #True any([True, False, True]) #True any([False, False, False]) #False any([0, 0, 1, 0, 0]) #True any([]) #False
○判断や関数とともにall、anyを使える。
map, filterは引数に関数を入れられるが、all, anyはできない。
sortedはkeyを引数にできるが、all, anyはできない。
all, anyの引数はseqのみの1つだけなので、個々に判断をするときは
リスト内包表記やジェネレータ内包表記などで織り込む。
all(some_validation for item in iterable)など
list1 = [0, 1, 2, 3, 4, 5] all(item > 0, list1) #TypeError: all() takes exactly one argument any(item > 0, key=int) #TypeError: any() takes no keyword arguments all(item > 0 for item in list1) #False すべての要素が正の数値ならTrue any(item < 0 for item in list1) #True 0以下の数値を1つでも含むとTrue #大文字小文字が交互に並んでいるか t = "IoT" all(t[i].islower() != t[i+1].islower() for i in range(len(t) - 1)) #True 文字数が1のときはrange(0)で、要素が空なのでallはTrueを返す
# coding: utf-8 hiragana = "ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん" strj = "いいかんじ" print(all([ch in hiragana for ch in strj])) #True ひらがなのみならTrue print(all(["一" <= ch <= "龥" for ch in strj])) #False 漢字のみならTrue #anyをつかっても書ける print(not any([ch not in hiragana for ch in strj])) #True print(not any([ch < "一" or ch > "龥" for ch in strj])) #False
○判断部分に関数やrambda式を入れることもできる。
all(validation_function(val) for val in iterable)など
○内部での動作
def all(iterable): for element in iterable: if not element: return False return True def any(iterable): for element in iterable: if element: return True return False
all(), any()の例
def gen1(start=2, stop=1000000): pr = max(1, start - 1) while pr < stop: pr += 1 if any(pr%x == 0 for x in range(2, int(pr**0.5) + 1)): continue yield pr g = gen1() for i in range(10): print(next(g), end=" ") print() # 2 3 5 7 11 13 17 19 23 29
def gen2(start=2, stop=1000000): pr = max(1, start - 1) while True: while pr < stop: pr += 1 if all(pr%x != 0 for x in range(2, int(pr**0.5) + 1)): break yield pr g = gen2() for i in range(10): print(next(g), end=" ") print() # 2 3 5 7 11 13 17 19 23 29