设为首页 加入收藏

TOP

Python高阶函数与函数装饰器-day4(二)
2017-09-30 12:54:41 】 浏览:1472
Tags:Python 高阶 函数 装饰 -day4
es2,d)
return res3

  通过上面的代码我们做一记忆。什么时候会用到嵌套调用呢?很显然,就是我们这个函数(calc4)需要另外一个函数的实行结果(return的y或者x)。

 

五、装饰器(高级的闭包函数)

  就拿下面的这段代码来说。如何在不改源代码的情况下实现计算代码的运行时间

def geturl(url):
    response = requests.get(url)
    print(response.status_code)

geturl("http://www.baidu.com")
def timer(func):
    def wapper(url):
        start_time = time.time()
        func(url)
        stop_time = time.time()
        so_time_is = stop_time - start_time
        print("运行时间%s"%so_time_is)
    return wapper


@timer
def geturl(url):
    response = requests.get(url)
    print(response.status_code)

python = geturl("http://www.baidu.com")

   图解代码

装饰器必备:

  1. @timer就是装饰器,意思是装饰它下面的函数,而装饰器和被装饰的都是一个函数。
  2. timer(装饰器函数),首先它会有一个位置参数(func)名字随意,但是必须并且只能是一个位置参数
  3. func参数就是被装饰的geturl这个函数
  4. 为什么func是geturl这个函数呢-->上面写了一个装饰器功能:geturl=timer(geturl),我们看到这里的timer中传入的其实就是func函数所以func = geturl(被装饰的函数)
  5. 分析geturl=timer(geturl),首先我们可以得知timer这是一个闭包函数,当我们执行这个闭包函数,会把里层的函数(wapper)返回,也就是说timer(geturl)其实就是返回的wapper,所以就可以这样理解了geturl==wapper,所以当我们运行geturl的时候就相当于在执行wapper()这样的一个操作;如果这里实在记不住,就这样。咱上面不是有一个闭包函数吗?你就把geturl=timer(geturl)中的geturl(执行函数的返回结果)当做上面g(函数调用的返回结果),然后在分别再执行了下"g"或者"geturl”这个对象。
  6. 如果被装饰者有位置参数的话,我们需要在wapper函数中加上对应的位置参数用来接收,如果长度是不固定的话还可以用*args和**kwargs

六、有参装饰器

  听着名字顾名思义,就是在装饰器中还有位置参数。

#一个low得不能再low得验证脚本,如果是显示环境中所有数据必须是由数据库或者一个静态文件提供,并且登录成功时,需要保存用户的一个状态

def auth(auth_type):   #有参装饰器名称
    def auth_deco(func):   #定义第二层函数名称
        def wrapper(*args,**kwargs):  #最里层函数,主要实现认证功能
            if auth_type == "file":
                username = input("username>>:").strip()
                password = input("username>>").strip()
                if username == "leon" and password == "loveleon":
                    res = func(*args,**kwargs)
                    return res
            elif auth_type == "mysql_auth":
                print("mysql_auth...")
                return func(*args,**kwargs)
        return wrapper  #第二层返回的是wrapper函数,其实就是home
    return auth_deco    #第一层返回的结果等于第二层函数的名称

@auth('file')
def home():
    print("welcome")

home() #执行home-->wrapper

有参函数必备知识:

  1. 套路,通过上面无参装饰器,我们得出了geturl=timer(geturl)这个等式。回到有参装饰器,我们又会有什么样子的等式呢?首先@auth("file")是一个装饰器也就是一个函数,所以我们定义了一个auth(auth_type)这个函数,而这个函数返回的是什么呢?没有错就是第二层函数;到了这里我们就会发现@auth("file")其实就是@auth_deco,现在我们知道了现在装饰器其实就是auth_deco,那剩下的还不知道怎么写吗?
  2. 整理公式,auth('file')-----------(return)> auth_deco----->@auth_deco ->home=auth_deco(home)
  3. 如果记不住?如果实在是记不住,其实就可以这样理解,有参装饰器无非就是在无参装饰器上面加了一层(三层),然后在第一层返回了第二层的函数,而到了第二层就和我们普通用的装饰器是一毛一样了

 七、模块导入

  import ,创建一个leonyan.py的模块文件,等待被导入

a = 10
b = 20
c = 30

def read1():
    print("in the read1")

def read2():
    print("in the read2")

  导入leonyan.py文件(调用模块文件和模块文件在同一目录下)

import leonyan #Python IDE这行会爆红,但是不用管

leonyan.read1() #执行leonyan这个包中的read1函数

leonyan.read2() #执行leonyan这个包中read2函数

print(leonyan.a + leonyan.b + leonyan.c ) #输出60

 总结:在Python中包的导入(import ***)会干三个事情:1:创建新的作用域;2:执行该作用域的顶级代码,比如你导入的那个包中有print执行后就会直接在屏幕中输出print的内容;3:得到一个模块名,绑定到该模块内的代码

  

  在模块导入的时候给模块起别名

import leonyan as ly
import pandas as pd #这是一个第三方模块,以后的博客中会写到,这是一个用于做统计的

 给模块起别名还是挺多的,在有些模块的官方文档中,还是比较推荐这种方法的,比如pandas的官方文档中就是起了一个pd别名,总之as就是一个模块起别名

 

  from *** import ***

from leonyan import read1 #
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇洗礼灵魂,修炼python(4)--从简.. 下一篇洗礼灵魂,修炼python(6)--活起..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目