zoukankan      html  css  js  c++  java
  • 核心编程(第十章)嵌套函数,装饰器

    例10.1

    #!/usr/bin/env python
    # encoding: utf-8
    import ipdb
    
    
    def safe_float(obj):
        'safe version of float()'
        try:
            retval = float(obj)
        except (ValueError, TypeError), diag:
            retval = str(diag)
        return retval
    
    
    def main():
        'handles all the data processing'
        log = open('cardlog.txt', 'w')
        try:
            ccfile = open('carddata.txt', 'r')
        except IOError, e:
            log.write('no txns this month
    ')
            log.close()
            return e
    
        txns = ccfile.readlines()
        ccfile.close()
        total = 0.00
        log.write('account log:
    ')
    
        for eachTxn in txns:
            result = safe_float(eachTxn)
            if isinstance(result, float):
                total = total + result
                log.write('data... processed
    ')
            else:
                log.write('ignored: %s' % result)
        print '$%.2f (new balance)' % (total)
        log.close()
    
    if __name__ == "__main__":
        main()

    11.3.6 装饰器

    http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html

    http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

    下面的内容参考http://pythonmap.iteye.com/blog/1682696,加了部分我的理解

    一、首先来大致了解下嵌套函数:

    def foo(a):
        def subfoo(b):
            return(b + a)
        return(subfoo)
    
    f = foo('content') #由于foo返回的是subfoo,所以f是对subfoo的引用
    f('sub_') #因为subfoo记录了foo的参数变量'content',所以返回值为'sub_content'

    实际上,这里的关系为:f == subfoo,a == 'cotent',b == 'sub_'

    二、嵌套函数和它的变种(装饰器)

    def action(z):
        return(z + 1)
    
    
    def action_pro(y):
        def warpper(x):
            ipdb.set_trace()
            return(y(1) * x)
        return(warpper)
    
    action2 = action_pro(action)  # action2一般和要装饰的函数一致,这里为了区分,这样写而已。
    print action2(4)  # 此函数实际为warpper(4),返回值为8

    这里,action2 == warpper, y == action(所以嵌套层用到y时,要有括号中的参数), x == 4

    其实也等价于下面,action经过重新赋予,已经变为新的函数了:

    def action(z):
        return(z + 1)
    
    
    def action_pro(y):
        def warpper(x):
            ipdb.set_trace()
            return(y(1) * x)
        return(warpper)
    
    action = action_pro(action)  # 第一个action为自定义的伪装变量,第二个action
    print action(4)  # 此函数实际为warpper(4),返回值为8

    使用@的写法,结果都是相同的:

    def action_pro(y):
        def warpper(x):
            ipdb.set_trace()
            return(y(1) * x)
        return(warpper)
    
    
    @action_pro
    def action(z):
        return(z + 1)
  • 相关阅读:
    9.20-9.21学习内容
    轮播图案例
    一个封装函数的实现过程
    9.18-9.19学习内容
    事件捕获和事件冒泡
    9.17学习内容
    appendChild()方法遇到的问题
    9.15学习内容
    9.16学习内容
    通过端口检测远程服务器是否开启,如果没有开启开启本地替代服务脚本
  • 原文地址:https://www.cnblogs.com/ohmydenzi/p/5503264.html
Copyright © 2011-2022 走看看