Otsuhachi’s diary

プログラミングのことや覚書などその他いろいろ

当ブログの内容を使用したり参考にした場合に生じた問題の責任は負いかねます。

Python組み込み関数3 -all・any編-

Pythonおさらい第3段
制約として公式ドキュメントのみ参照*1として、読む癖をつける訓練も兼ねる。

今回はall関数any関数の2種類について。
ブログのレイアウト弄りをしていたとはいえ、日数が空いたうえでのこの薄さ……まずい。

allはイテラブルの中身がすべてTrueかどうか。
anyはイテラブルの中身のいずれかがTrueかどうか。
残念ながらこれ以上の情報はこの記事から得られないので、どう水増しするか気になる人以外は解散!お疲れ様でした!

読み込むドキュメントはこちら[(all), (any)]。

構成

今回の2つの関数は共通項が多いので同時に紹介していく。

all(iterable)

any(iterable)

ドキュメントによると、それぞれ以下のようなコードと等価です。

# all
def all(iterable):
  for element in iterable:
    if not element:
      return False
  return True

# any
def any(iterable):
  for element in iterable:
    if element:
      return True
  return False

使ってみる

  1. 自作クラスPersonを定義して、名簿memberを作成
  2. memberに対しall, anyをそれぞれ使用してその出力を見る

実行するコードは以下の通り。

class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def __bool__(self):
        print(f'Check {self.name}: {self.age}')
        return self.age >= 20


member = [
    Person('Otsuhachi', 28),
    Person('Taro', 18),
    Person('Jiro', 20),
    Person('Hanako', 14),
]

print('All')
print(all(member), '\n')
print('Filterd')
print(all(filter(lambda x: x.age >= 20, member)))
print('-' * 30)
print('Any')
print(any(member), '\n')
print('Filterd')
print(any(filter(lambda x: x.age < 20, member)))
All
Check Otsuhachi: 28
Check Taro: 18
False

Filterd
Check Otsuhachi: 28
Check Jiro: 20
True
------------------------------
Any
Check Otsuhachi: 28
True

Filterd
Check Taro: 18
Check Hanako: 14
False

今回、Personクラスでは成人をTrue、未成年をFalseと定義している。

allを使用した結果、TaroFalseを返した時点でFalseが返されているのがわかる。
つぎにfilter(lambda x: x.age >= 20, member)を使用して、allに渡すメンバーから未成年を除外すると、成人であるOtsuhachiJiroがチェックされ、Trueが返った。

anyを使用した結果、OtsuhachiTrueを返した時点でTrueが返されているのがわかる。
つぎにfilter(lambda x: x.age < 20, member)を使用してanyに渡すメンバーから成人を除外した結果、未成年であるTaroHanakoがチェックされ、Falseが返った。

締め

ネタとしては極めて薄い関数ながら、コードの短縮という意味ではなかなかにありがたい関数だと思われる。

*1:わかりやすく解説している他サイトを見ない