2012年6月23日土曜日

Pythonの復習

最近Pythonさわってなかったので。

FizzBuzz


def fizzbuzz(n):
if n % 15 == 0:
return "FizzBuzz"
elif n % 3 == 0:
return "Fizz"
elif n % 5 == 0:
return "Buzz"
else:
return n
view raw fizzbuzz1.py hosted with ❤ by GitHub

なんのへんてつもないコード。

yield使って、generatorにしてみる。

def fizzbuzz_iter():
n = 1
while True:
yield fizzbuzz(n)
n += 1
view raw fizzbuzz2.py hosted with ❤ by GitHub

このケースならitertoolsを使ったほうがカッコイイ。

import itertools
def fizzbuzz_iter():
return map(fizzbuzz, itertools.count(1))
view raw fizzbuzz3.py hosted with ❤ by GitHub

countはnからstep(デフォルトは1)づつ増えていくgeneratorを作る関数です。
mapはいつの間にかイテレータに対応してくれてました。

素数


判定を書く

import functools
import operator
def isprime(n):
return all(map(functools.partial(operator.mod, n), range(2, n - 1)))
view raw prime1.py hosted with ❤ by GitHub

functoolsとoperatorで関数型っぽく書けて素敵ですね。
functools.partialは部分適用、operator.modは剰余です。

素数列を作る

def primes():
return filter(isprime, itertools.count(2))
view raw prime2.py hosted with ❤ by GitHub

なかなかいい感じ。

フィボナッチ数列


n番目のフィボナッチ数を返す関数

def fibonacci(n):
if n == 0:
return 1
elif n == 1:
return 1
else:
return fibonacci(n - 2) + fibonacci(n - 1)
view raw fibonacci1.py hosted with ❤ by GitHub

dict使って分岐する

def fibonacci(n):
return {0: lambda: 1, 1: lambda: 1}.get(n, lambda: fibonacci(n - 2) + fibonacci(n - 1))()
view raw fibonacci2.py hosted with ❤ by GitHub

switch的なものはdictで代用できるのでもーまんたいですね。
getの第二引数はキーが存在しない場合返ります。

イテレータ版

def fibonacci_iter():
return map(fibonacci, itertools.count(1))
view raw fibonacci3.py hosted with ❤ by GitHub

Pythonはなかなか関数型言語ちっくに書けて素敵ですね。
Rから始まる4文字のプログラミング言語より関数型っぽいです。

0 件のコメント:

コメントを投稿