LoginSignup
11
12

More than 5 years have passed since last update.

Pythonで関数型プログラミング Project Euler 1

Last updated at Posted at 2015-04-29

Problem 1

「3と5の倍数」

10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.

同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

リスト内包表記

リスト内包表記を使うと関数型に近い記述をすることができます。

リスト内包表記
multiplesOf3or5 = [n for n in range(1, 1000) if n % 3 == 0 or n % 5 == 0]
answer = sum(multiplesOf3or5)
print(answer)

関数型

filter関数でより関数型っぽく書くと、

関数型
def isMultipleOf3or5(n):
    return n % 3 == 0 or n % 5 == 0

multiplesOf3or5 = filter(isMultipleOf3or5, range(1, 1000))
answer = sum(multiplesOf3or5)
print(answer)

Pythonでは関数名がそのまま関数オブジェクトとなるので、filter関数の第1引数には関数名を書くだけでOKです。
C#のデリゲートなんかと比べるとはるかに簡単で直感的ですね。

ラムダ式

関数をラムダ式に置き換えることもできます。
Pythonではラムダ式は
lambda [引数1], [引数2] : [式]
という書き方をします。
(引数は2つしか書いていませんが、もちろん3つ以上でもOKです。)

ラムダ式
multiplesOf3or5 = filter(lambda n: n % 3 == 0 or n % 5 == 0, range(1, 1000))
answer = sum(multiplesOf3or5)
print(answer)

ラムダ式を使うとリスト内包表記に近い形になりますね。
この場合は、ラムダ式よりはリスト内表表記の方が直感的に分かりやすい気がします。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12