1 def cycle(f1, f2, f3): 2 """Returns a function that is itself a higher-order function. 3 4 >>> def add1(x): 5 ... return x + 1 6 >>> def times2(x): 7 ... return x * 2 8 >>> def add3(x): 9 ... return x + 3 10 >>> my_cycle = cycle(add1, times2, add3) 11 >>> identity = my_cycle(0) 12 >>> identity(5) 13 5 14 >>> add_one_then_double = my_cycle(2) 15 >>> add_one_then_double(1) 16 4 17 >>> do_all_functions = my_cycle(3) 18 >>> do_all_functions(2) 19 9 20 >>> do_more_than_a_cycle = my_cycle(4) 21 >>> do_more_than_a_cycle(2) 22 10 23 >>> do_two_cycles = my_cycle(6) 24 >>> do_two_cycles(1) 25 19 26 """ 27 "*** YOUR CODE HERE ***" 28 def combine(n): 29 def F(x): 30 p=n//3 31 q=n%3 32 for i in range(p): 33 x=f3(f2(f1(x))) 34 if q==0: 35 return x 36 elif q==1: 37 return f1(x) 38 else: 39 return f2(f1(x)) 40 return F 41 return combine
评点:
最精妙的地方就在于for循环赋值x【 x=f3(f2(f1(x))) 】,直接将所有大于3的情况都变为3以内的情况,然后再来列举考虑。
lambda函数与currying小结
一、例子
1.
1 >>> def compose1(f, g): 2 return lambda x: f(g(x))
等同于
1 def compose1(f,g): 2 def F(x): 3 return f(g(x)) 4 return F
不同于
1 def compose1(f): 2 def F(g): 3 return f(g) 4 return F
第三段代码等同于
1 def compose1(f): 2 return lambda g: f(g)
2.
1 >>> def curried_pow(x): 2 def h(y): 3 return pow(x, y) 4 return h
等同于
1 def curried_pow(x): 2 return lambda y: pow(x,y)
3.
1 def curry2(f): 2 def g(x): 3 def h(y): 4 return f(x,y) 5 return h 6 return g
等同于
1 def curry2(f): 2 return lambda x: lambda y: f(x,y)
二、总结
lambda表达式其实就是def的省略版本,所以lambda表达式也就是一个函数。不同在于,def能够自己定义函数的名称,而lambda表达式不可以定义名称
冒号之前的变量就是def方式的变量,而冒号后面的操作就是def定义的函数中的操作。
看多个嵌套函数的时候,不应该首先看多个嵌套函数的具体定义,而是应该像编译器一样,先看函数的返回值。由返回值来引导自己看函数的步骤。
标签:do,return,CS61A,lab02,cycle,my,def,lambda From: https://www.cnblogs.com/xuenima/p/17120938.html