zoukankan      html  css  js  c++  java
  • 【codewar-7kyu】Unary function chainer

    ## 题目描述:

    Your task is to write a higher order function for chaining together a list of unary functions. In other words, it should return a function that does a left fold on the given functions. 

    chained([a,b,c,d])(input)

    Should yield the same result as

    d(c(b(a(input))))

    ## 思路分析:

    返回值是由原参数构成的函数,解析成多层函数的嵌套。input 是内层的参数。

    ## 代码解析:

    - Python

    1 def chained(functions):
    2     def apply(param):
    3         result = param
    4         for f in functions:
    5             result = f(result)
    6         return result
    7     return apply

    param 可是换成 result, 省略第三行(如下),不过不省略会语义上更清晰易读。注意 result 的作用域,别写成 for 的局部变量了

    完整可运行代码如下:

     1 #!/usr/bin/python
     2 # -*- coding: utf-8 -*-
     3 
     4 __author__ = 'pudding'
     5 
     6 
     7 def chained(functions):
     8     def apply(result):
     9         for f in functions:
    10             result = f(result)
    11         return result
    12     return apply
    13 
    14 
    15 def f1(x): return x*2
    16 
    17 
    18 def f2(x): return x+2
    19 
    20 
    21 def f3(x): return x**2
    22 
    23 def f4(x): return x.split()
    24 
    25 
    26 def f5(xs): return [x[::-1].title() for x in xs]
    27 
    28 
    29 def f6(xs): return "_".join(xs)
    30 
    31 
    32 if __name__ == '__main__':
    33     print chained([f1, f2, f3])(0)

    输出结果:4 即:((0**2)+2)*2

    apply一开始的参数(result 的初始值)为 chained([f1, f2, f3])(0)中的0

    一定要注意 return apply 而不是 return apply()

    ________你所记的,都是假的。
  • 相关阅读:
    OpenCV 最小二乘拟合方法求取直线倾角
    BFS-hdu-4101-Ali and Baba
    手机安全卫士开发系列(1)——功能列表
    【Linux常用工具】1.1 diff命令的三种格式
    手机安全卫士开发系列(2)——splash界面
    Ruby学习笔记(二)
    jQuery Animation实现CSS3动画
    HDU2699+Easy
    android中解析文件的三种方式
    查找某元素
  • 原文地址:https://www.cnblogs.com/pudding-ai/p/5820254.html
Copyright © 2011-2022 走看看