建立函数抽象

什么是好的抽象?

比如这样一个函数:

def accumulate(combiner, base, n, term):
    total, k=base, 1
    while k<=n:
        total,k = combiner(total, term(k)), k+1
    return total

利用这个函数能够构建出不同的符合这个抽象的函数。

比如 将0-x间的不同特征的数相加:

term函数可以是平方,立方
def summation_using_accumulate(n, term):
    return accumulate(add, 0, n, term)

相乘:

def product_using_accumulate(n, term):
    return accumulate(mul, 1, n, term)

将0-x间的数过滤出来相加可以这样子做:

def filtered_accumulate(combiner, base, pred, n,term):
    def combiner_if(x,y):
        if pred(y):
            return combiner(x,y)
        else:
            return x
    return accumulate(combiner_if, base, n, term)

利用一个高阶函数,pred是过滤的规则
比如只要偶数
odd = lambda x: x%2==1
filtered_accumulate(add, 0, odd, x, term)

再比如对一个函数多次调用

repeated(square, 2)(5) = square(square(5))
利用高阶函数能够很简单实现。
def repeated(f, n):
    def inner(x):
        nonlocal n
        if n == 0:
            return x
        result = x
        while n > 0:
            result = f(result)
            n -= 1
        return result
    return inner
但是仔细想想,似乎能够用上面的那个函数来写 可以这样做:
定义一个高阶函数
def compose(f, g):
    def h(x):
        return f(g(x))
    return h
def repeated(f, n):
    return accumulate(compose, lambda x:x, n,lambda k:f)

发现 要进行0-n次term计算,用compose来组合起来 都可以用accumuldate这个抽象
比如上面这个例子 对x进行term计算,然后组合.

lambda 表达式,注意它是运行时绑定的。

>>> a=3
>>> b=2
>>> c = lambda a,b:a+b
>>> b-=a
>>> c(a,b)
2

递归:

以常见的斐波那契数列来说
树形递归,复杂度最高,有很多的重复计算。
从f(1)=1开始的。
def fib(n):
    if n<2:
        return n
    return fib(n-1)+fib(n-2)
我们可以这样子写,利用数来保存中间变量,不用重复计算。
def fib2(a,b,n):
    if n > 0:
        return fib2(b,a+b,n-1)
    return a

装饰器:

@decorator
def func
相当于decorator(func)
能够用装饰器做很多事情。比如:
定义一个memo缓存函数,来优化上面的fib
def memo(f):
    cache = {}
    def helper(*args):
        if args not in cache:
            cache[args]=f(args)
        return cache[args]
    return helper
利用了一个缓存来保存变量。

总结 要多思考建立好的函数抽象。

函数编码原则:

  1. 函数名 称应 该小写 , 以下划 线分隔。 提倡描述性的名 称。
  2. 函数名 称通常反映解释器 向参数应 用 的操作( 例如 print 、 add 、 square ) , 或者结
    果( 例 如 max 、 abs 、 sum ) 。
  3. 参数名 称应 小写 , 以下划 线分隔。 提倡单个词的名 称。
  4. 参数名 称应 该反映参数在函数中 的作用 , 并不仅仅是满足的值的类型 。
  5. 当 作用 非常明 确时, 单个字母的参数名 称可以接受, 但是永远不要使用 l ( 小写 的 L )
    和 O ( 大写 的 o ) , 或者 I ( 大写 的 i ) 来避免和数字混淆。

函数设计原则

一个函数只完成一个功能,遵循dry原则。
写函数帮助文档,利用doctest进行测试。
调试的一些原则:
逐步测试,隔离错误,追踪到最小的代码片。检查假设。

来自http://www.97up.cn/post/83

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容