Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
昨日は通称セイウチ演算子「:=」を使った代入式に使い方の基本について解説記事を書きました。こちらの記事です。
そして今回はその代入式をジェネレータ式とともに使う方法の解説です。
今回の記事の前提となる知識としてジェネレータというものの知識とジェネレータ式についての知識が必要となります。それらについては以下の記事で初歩的な解説をしてあるのでそちらをご覧ください。
# any(iterable)
if any((i := char) for char in "abcdefg"):
print(i) # => a
このコードはifの条件部分に組み込み関数のany関数を使っています。
結果は、
このように「a」が表示されます。
このany関数は引数としてイテラブルオブジェクトをとって、そのイテラブルオブジェクトの要素のうち、どれか1つでも「真」であればTrueを返します。そしてany関数の引数として設定しているのが、ジェネレーター式です。すなわちif文の条件部分については次のように作動します。
まず引数のジェネレーター式である、(i := char) for char in "abcdefg" によって、ジェネレータイテレータが作成される。このジェネレータイテレータはイテラブルオブジェクトの一種であり、any関数の引数になれる
↓
ジェネレータイテレータのメソッドの1つ、__next__が呼び出され、ジェネレイターイテレータについて処理がスタート
↓
最初のcharの値である文字「a」が、「i := char」の代入式によって、iに代入される
↓
代入式なので同時に変数iが評価される。iには文字「a]が入っていてデータとして存在しているためTrueが返ってくる
↓
any関数が、そのTrueを受取り、any関数自身もTrueを返す
↓
ifの条件がTrueとなったため、ifのスイートである、print(i)が実行される
↓
「i = a」なので、aが表示される
このような動作の流れとなっています。
上のコードを今度は組み込み関数のall関数を使って書き変えてみます。
# all(iterable)
if all((i := char) for char in "abcdefg"):
print(i) # => g
こうすると結果は、
となります。文字列「abcdefg」の最後のアルファベット「g」が表示されます。
これはall関数がany関数とは異なり、その引数であるiterableの「全ての要素が真」の場合にだけTrueを返すからです。
このコードでは文字列「abcdefg」について、その最初のアルファベット「a」から順番に「g」までiに代入されていきますが、その全ての場合についてiが毎回「真」と評価されます。その結果、最後のアルファベット「g」まで真となり、「全てが真」となります。
全てが真となったため、all関数そのものがTrueを返し、これによってif文の条件が成就しスイーツ部分が実行されます。そのとき「i = g」になっているので、「g」が出力されるわけです。
このように、ジェネレイター式の内部で代入式を使うとより簡潔にコードを書くことができます。ただし、Pythonのそうした文法に慣れていない人にはわかりにくい書き方にもなってしまうので、チームで開発するときは注意が必要かもしれません。
Pythonの学習には世界最大の動画学習サイトUdemyの動画講座がおすすめです。講座によっては大幅割引セールもときどきされているためチェックしてみてください。
世界最大の動画学習サイトUdemyで、プログラミングを最速でマスターしましょう。