2015-11-22 第五天

装饰器

必备知识

1.装饰器由至少两层函数定义出来

2.动态函数

3.函数返回值

4.三层及以上函数定义的装饰器

5.多个装饰器

最简单的装饰器的实现

#!/usr/bin/env python
# -- coding: utf-8 --
__author__ = ‘EchoRep‘

#定义一个函数,作为装饰器函数,目的是把原函数加一些功能返回
def auth(args):
    # 定义一个函数内部的函数,目的是给原函数加一些功能
    def inner():
        #这个是给原函数加入的新功能
        print "this is before!!!\n**********************"
        #这个是调用原函数
        args()
    #这个是返回内部函数,确保下面运行可以获取原函数的功能和新加入的功能
    return inner

#给原函数加上装饰器
@auth
#定义原函数有一些功能
def f1():
    print "this is function one."

#定义一个主函数
def main():

    #调用已经修改过的函数
    f1()

#限制程序入口
if __name__ == "__main__":
    main()

带有参数的装饰器

#!/usr/bin/env python
# -- coding: utf-8 --
__author__ = ‘EchoRep‘

#定义一个新的能带参数的装饰器
def authArgs(args):
    #定义一个内部函数给原来的函数加入新的功能
    def inner(argsin):
        #在原函数执行之前加入的功能
        print "before"
        #执行原函数
        args(argsin)
        #在原函数执行之后加入的新功能
        print "after"
    #返回加入了新功能的内部函数
    return inner

#定义一个函数,作为装饰器函数,目的是把原函数加一些功能返回
def auth(args):
    # 定义一个函数内部的函数,目的是给原函数加一些功能
    def inner():
        #这个是给原函数加入的新功能
        print "this is before!!!\n*{22}"
        #这个是调用原函数
        args()
        #这个是在函数执行之后再加入的功能
        print "~~~~~~~~~~~~~~~~~~~~~\nthis is after!!!"
    #这个是返回内部函数,确保下面运行可以获取原函数的功能和新加入的功能
    return inner

#给原函数加上装饰器
@auth
#定义原函数有一些功能
def f1():
    print "this is function one."

#给原函数加入带有参数的装饰器
@authArgs
#定义一个带有参数的原函数
def f2(args):
    #这是原函数的功能
    print "this is function %s" %args

#定义一个主函数
def main():
    #调用已经修改过的函数
    f1()
    #加入参数,执行修改以后的函数
    f2("hi,nice to meet you!!!!")

#限制程序入口
if __name__ == "__main__":
    main()

上面只有一个参数,如果我们想要实现带两个参数,三个参数。。。。乃至于n个参数有两种做法:

第一种做法是依次定义n个带参数的装饰器来实现

第二种做法是定义一个能够兼容无参数,一个,两个,三个。。。n个参数的装饰器函数

*第二种做法的实现需要通过动态参数来配合

def func(*arg,**kwargs):

func2(*arg,**kwargs)

#!/usr/bin/env python
# -- coding: utf-8 --
__author__ = ‘EchoRep‘

#定义一个函数,作为装饰器函数,目的是把原函数加一些功能返回
def auth(args):
    # 定义一个函数内部的函数,目的是给原函数加一些功能,通过加入动态函数的方式解决了参数不固定的问题
    def inner(*arg,**kwargs):
        #这个是给原函数加入的新功能
        print "this is before!!!\n*{22}"
        #这个是调用原函数,配合函数使用动态函数的方式,解决了参数不固定的问题
        args(*arg,**kwargs)
        #这个是在函数执行之后再加入的功能
        print "~~~~~~~~~~~~~~~~~~~~~\nthis is after!!!"
    #这个是返回内部函数,确保下面运行可以获取原函数的功能和新加入的功能
    return inner

#给原函数加上装饰器
@auth
#定义原函数有一些功能
def f1():
    print "this is function one."

#给原函数加入带有参数的装饰器
@auth
#定义一个带有参数的原函数
def f2(args):
    #这是原函数的功能
    print "this is function %s" %args

#定义一个主函数
def main():
    #调用已经修改过的函数
    f1()
    #加入参数,执行修改以后的函数
    f2("hi,nice to meet you!!!!")

#限制程序入口
if __name__ == "__main__":
    main()

装饰器函数的返回值不仅在原函数里面有体现,在装饰器函数里面也需要再次返回,这样最后才可以获得我们需要的返回值。

多个装饰器可以参考“盒子模型”

三层以上的函数可以构成带多个参数的装饰器

函数内部获取不到同等级函数的名字作为赋值


递归

递归的使用:

1.计算器

2.前值相加数列

递归里面的返回值问题:

#func 没有返回值,或者说没有获取到返回值,原来是因为递归调用的时候,最后依次虽然返回了,# 但是倒数第二次没有返回,所以一路返回的是none,也就是函数默认的返回值

模块

三种模块:

自定义模块

内置模块

第三方模块

两种导入模块的方法:

import os

os.argv

for os import argv

argv

导入模块需要注意一个问题,模块的路径问题“sys.path”

时间: 2024-08-11 09:46:32

2015-11-22 第五天的相关文章

分布式系统一周技术动态 2015.11.22

分布式系统实践 1. 直观理解paxos http://drmingdrmer.github.io/pdf/paxos-slide/paxos.pdf 要点: paxos协议一直以难以理解著称, 以至于该论文发表10年后才被人们认识到重要性, 这篇文章通过具体的例子来阐述paxos协议, 让人感觉到paxos协议不是发明出来的, 而是演化而来的, 让paxos协议不再那么难以理解了. 2. NoSQL数据库模型 http://darkhouse.com.cn/blog/4?hmsr=toutia

work of weekend 11/21/2015~11/22/2015 && scenarios

组员 周末工作 工作耗时/h 明日计划 计划耗时/h 冯晓云 完成网络状况的侦听,对网络连接断开,WiFi状况不佳,未查询到结果设定不同的返回码,按约定格式返回:对于超时未查询进行了相关的学习: 3 规范在线查词的各项请求:与同学讨论内部缓存区的建立,以应对查询超时 3 朱玉影         张葳       林建平         周以舟         BINGdict API——1.2 [additional]standard output string format: if (Offl

周三(2015.7.22)学习内容

周三(2015.7.22)学习内容: 一.计算机程序是什么? 就是为了解决某一个问题而编写的一系列有序指令的集合. 二.Java的相关技术有哪些? JavaSE(桌面应用程序)  JavaEE(网站)  JavaME(手机应用),现在已被Android取代 三.开发Java程序的步骤有哪些? 首先编写,接着编译,然后运行. 编写一个Java程序的详细步骤 1.配置环境变量 (1).首先对我的电脑点击右键→属性→高级系统设置→环境变量→系统变量,在系统变量中查找有没有名称为path的变量名,如果有

2008 Ubuntu Release Party 台中场(11/22)

摘要:2008 Ubuntu Release Party 台中场(11/22) 2008 Ubuntu Release Party 台中场主办:? Ubuntu-tw 和 SA@台中 , 联合举办活动日期:? 2008/11/22(六) 14:00~17:00活动地点:? ? ?台中教育大学 数位内容系? ? ?台中市西区民生路140号? ? ? (民权路,五权路交叉口? ?求真楼4F 409,410)费用:? ? 仅酌收餐点费用 150 元(含点心及饮料)自备:? notebook.电源线报名

JQuery日记 5.11 Sizzle选择器(五)

//设置当前document和document对应的变量和方法 setDocument = Sizzle.setDocument = function( node ) { var hasCompare, //node为Element时返回node所属document //node为Document时返回node //node为空时返回window.document doc = node ? node.ownerDocument || node : preferredDoc, //document

2015.11.06 学习Ubuntu下常用命令

2015.11.06 学习Ubuntu下常用命令 1.关闭防火墙:ufw disable 2.开启防火墙:ufw enable 3.防火墙状态:ufw status 4.查看占用的端口:#lsof -i 5.查看某一个端口:#lsof -i:8080  或者是: #netstat -apn|grep 8080————接着:#ps -aux|grep 进程号 6.结束占用端口的进程:#killall 进程名 7.自己写一遍,记得牢!

PCB设计软件CadSoft Eagle Professional v7.5 Multilingual +DownStream Products 2015.11

PCB设计软件CadSoft Eagle Professional v7.5 Multilingual Win64 1CDCadSoft Eagle Professiona是一款简单易用的印刷电路板设计软件,其中包含原理图编辑器.PCB编辑 器和自动布线器三个模块,方便设计者更方便操作.CadSoft Eagle Professiona支持中文版 DownStream Products 2015.11 1CD业界领先的PCB后处理解决方案CadSoft.Eagle.Professional.v7

我关注的一周技术动态 2015.11.15

分布式系统实践 1. 一致性哈希算法 http://www.javaranger.com/archives/1781?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 要点: 一致性hash算法是解决分布式系统数据划分的有效手段, 解决了传统hash算法在机器扩容时需要大量移动数据的问题. 这篇文章对一致性hash算法做了简要的介绍, 如果你还不了解一致性hash算法, 那么请读读这篇文章吧 2. 巧用CAS解决数据一致

2015.11.04 学习 Ubuntu下安装gocode

2015.11.04 学习 Ubuntu下安装gocode 1.go get github.com/nsf/gocode,如果不成功 2.网页http://github.com/nsf/gocode,下载包,然后解压,解压后的文件名为gocode-master,修改为gocode. 3.复制gocode文件夹到go的安装目录~/go/github.com/nsf/gocode,(没有的话自行创建) 4.然后命令行执行go install github.com/nsf/gocode.确保安装目录的

2015.11.02 学习 Ubuntu下安装gosublime插件及其配置

2015.11.02 学习 Ubuntu下安装gosublime插件及其配置 1.Ctrl+shift+P 打开package control 输入pcip 回车 2.出现的框中输入gosublime,回车 3.preferences---package setting--gosublime--setting default 打开后在env{}中添加GOROOT和GOPATH 4.保存后全部复制到preferences---package setting--gosublime--setting