2012年6月5日火曜日

初めてのPython 19章

19章はもう少し関数について


関数を再帰的に呼び出す
isinstanceで型を調べるようだ。
>>> def sumtree(L):
...     tot = 0
...     for x in L:
...         if not isinstance(x, list):
...             tot += x
...         else:
...             tot += sumtree(x)
...     return tot
... 
>>> L = [1, [2, [3,4], 5], 6, [7, 8]]
>>> sumtree(L)
36

関数はオブジェクトなので引数に渡すこともできる。
関数と引数をリストにしてfor文で実行してみる。
>>> def sayhello(func, arg): 
...     func(arg)
...     
>>> sayhello(func, 'morning') #funcという関数を渡す
morning
>>> schedule = [(func, 'hello'), (func, 'morning')]
>>> for (f, arg) in schedule:
...     f(arg)
...     
hello
morning
>>> 


続いてlambdaについて勉強する
lambdaはdefとは違い式である→defが書けないところにも書けたりする。
シンプルな記述が可能になるとこのこと。
まずは基本。
>>> f = (lambda x = 3, y = 4: x**2 + y**2)
>>> f()
25

リストにlambdaを定義してこんなこともできるのら。
>>> l = [lambda x: x**2,
...      lambda x: x**4,
...      lambda x: x**8]
>>> 
>>> for f in l:
...     print f(2)
...     
4
16
256
>>> 

>>> d = {"plus": (lambda x, y: x + y),
...      "mult": (lambda x, y: x * y),
...      "pow": (lambda x, y: x**y)}
>>> d["plus"](2,3)
5

シーケンス(リストなど)を扱う関数にmapやfilter, reduceというものがある。
これらの関数は自作でいちいちその関数を定義するよりも速く動く。
まず、マップについて。使い方はこうなる。
>>> nums = [0, 1, 2, 3]
>>> func = lambda x: x + 10
>>> map(func, nums)
[10, 11, 12, 13]
関数が2つの引数を取るなら、リストを2つ渡してもよい。
>>> map(pow, nums, [0, 1, 2, 3])
[1, 1, 4, 27]

続いてfilter。
filterはその名の通り、条件をつけてシーケンスにフィルターを掛けることができる。
>>> func = lambda x: x > 0
>>> filter(func, range(-3, 3))
[1, 2]

reduceはリストを1つにまとめるからそういう名前になったのだろうか。
使い方はこうだ。
>>> func = lambda x,y: x + y
>>> reduce(func, [0, 1, 2, 3])
6

と言う感じで次の章へ~


0 件のコメント:

コメントを投稿