Pythonのlambda式による再帰(Yコンビネーター)とカリー化

PythonによるYコンビネータの仕組みの(多分)わかりやすい説明より。

F = lambda f: lambda n: n if n < 2 else f(n - 1) * n
Y = lambda f: (lambda x: lambda m: f(x(x))(m))(lambda x: lambda m: f(x(x))(m))
print(Y(F)(5))

Pythonでカリー化を書いてみるより

def add_curried(x):
    def _add(y):
        return x+y
    return _add

print(add_curried(2)(3))

def add_curried2(x):
    return lambda y:x + y

print(add_curried2(2)(3))

add_curried3 = lambda x:lambda y:x + y

print(add_curried3(2)(3))
#if
pr = lambda s:s

namenum = lambda x: (x==1 and pr("one")) \
          or (x == 2 and pr("two")) \
          or (pr("other"))

print(namenum(1))
print(namenum(2))
print(namenum(3))

#for
#for e in lst:func(e)
lst=[1,2,3,4]
print(list(map(lambda x:x*x,lst)))

#順次作業
def f1():
    print("f1")

def f2():
    print("f2")

def f3():
    print("f3")

# let's create an execution utility function
do_it =lambda f: f()
list(map(do_it, [f1,f2,f3]))# map()-based action sequence
## 配列の各要素に計算式/変換式を適用する関数
def my_map(func, arr):
  newarr = []
  for x in arr:
    newarr.append(func(x))      # 各要素に計算式/変換式を適用する
  return newarr

a=range(10)

print(my_map(lambda x:x*2,a))

  
## 配列の各要素から、条件式/判定式を満たしたものだけを選んで返す関数
def my_filter(func, arr):
  newarr = []
  for x in arr:
    if func(x):             # 条件式/判定式を満たした要素だけを選ぶ
      newarr.append(x)
  return newarr

print(my_filter(lambda x:x%2 == 0,a))

## 配列の各要素に対し、何らかの計算や処理を行い、積み重ねた結果を返す
def my_reduce(func, arr, initial):
  t = initial         # 初期値
  for x in arr:
    t = func(t, x)    # 計算や処理を行う
  return t

print(my_reduce(lambda x,y:x+y,a,0))
#from functools import reduce

Pythonのデコレータについて

def deco(func):
    def wrapper(*args, **kwargs):
        print('--start--')
        func(*args, **kwargs)
        print('--end--')
    return wrapper

@deco
def test():
    print('Hello Decorator')

test()