Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

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