python之路 day5

http://www.cnblogs.com/wupeiqi/articles/4963027.html

最近一直忙,这次决定抽出时间,把博客写好。博客好处多多这里就不说了,开写。

今天学习的主要内容是装饰器,递归函数及模块的使用

一、装饰器

装饰器上节课已经学习了,但讲的太快理解的不够透彻,今日老师讲的很详细,记了主要6点

1.装饰器是一个函数,至少两层函数

2.执行auth函数,被装饰的函数作为参数auth(foo)

auth函数的返回值,赋值给被装饰的函数的函数名

 @auth
 def foo():
     pass 

 

3.动态参数,可以装饰含有多个参数的函数

4.函数的返回值在装饰器中的应用

5.多装饰器 ———》盒子模型,就是函数装饰器套着装饰器

6.至少三层,3层装饰器的如何使用

    @w1

            1.执行w1函数

            2.将w1函数的返回值赋值给被装饰器的函数的函数名

    @w2(arg)

            1.执行w2函数,得到返回值,ret

            2.创建装饰器,@+ret结合 @ret

            3.。。。。

1.执行ret函数

                     2.将ret函数的返回值赋值给被装饰器的函数的函数名

    def foo()

http://www.cnblogs.com/wupeiqi/articles/4980620.html

]$4s}btzh(2~dlianlyq}1y

一般装饰器的用法

#过程:

def auth(func):  #2  func = f1
    def inner(): #4 加载inner
        print 'before'  #5 执行inner
        return func   #6 返回 原f1,并执行了inner中的验证
return inner  #3 f1=inner

def f1():
    print 'f1'

f1 = auth(f1) #1 执行f1的赋值
f1()

下面看下在实际工作中的装饰器应用,basic.py为基础部门缩写的程序调用接口,b1为业务部门调用方法

av44_q]1~i4@7t5lxym{tlo`rfp]k(bmky@$e4npffdfpw

函数带参数的装饰器使用方法

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# powered by  xiaobing

#装饰器

#过程:
def auth(func):  #2  func = f1
    def inner(): #4 加载inner
        print 'before'  #5 执行inner
         func()   #6 执行f1,并执行了inner中的验证
return inner  #3 f1=inner

def auth_arg(func):  #2  func = f1
    def inner(arg): #4 加载inner
        print 'before'  #5 执行inner
         func(arg)   #6 执行f1,并执行了inner中的验证
return inner  #3 f1=inner

@auth
def f1():
    print 'f1'
@auth_arg
def f2(arg):
    print 'f2',arg

动态参数装饰器

多个参数或者没有参数,使用动态参数可以减少创建多个装饰器的麻烦

def auth(func):  #2  func = f1
    def inner(*args,**kwargs): #4 加载inner
    print 'before'  #5 执行inner
    func(*args,**kwargs)   #6 执行f1,并执行了inner中的验证
return inner  #3 f1=inner

@auth
def f1():
    print 'f1'
@auth
def f2(arg):
    print 'f2',arg

函数返回值在装饰器中的应用

def auth(func):  #2  func = f1
    def inner(*args,**kwargs): #4 加载inner
        print 'before'  #5 执行inner
        print 'fetch_serverlist'
         temp = func(*args,**kwargs)   #将fetch_serverlist函数执行结果赋值给temp
        print 'after'
        return temp  #装饰器将结果return出去
return inner  #3 f1=inner

@auth
def fetch_serverlist():
    serverlist = [1,2,3,4]
return serverlist

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# powered by  xiaobing
import index
ser_list=index.fetch_serverlist()
print ser_list
print '---------'
index.f2('1.1.1.1')

登陆验证装饰器

def login():
    name = 'alex'
   if name == 'xiaobing':
       return True
   else:
       return False

def auth(func):  #2  func = f1
    def inner(*args,**kwargs): #4 加载inner
        is_login = login()  #5 执行inner
       if not is_login:
           return 'invild name'

        print 'fetch_serverlist'
         temp = func(*args,**kwargs)   #6 执行f1,并执行了inner中的验证    
        print 'after'
        return temp
return inner  #3 f1=inner

@auth
def fetch_serverlist():
    serverlist = [1,2,3,4]
return serverlist

@auth
def f2(arg):
    print 'f2',arg

3层装饰器

这个后续注释后贴进来

ls@d%sqsa4)7ar8ahwhh%0g

二、递归函数

def func(arg1,arg2):
    if arg1 == 0:
        print arg1,arg2

     arg3 = arg1 + arg2
    print arg3
    if arg3 > 10000:
        exit()
    func(arg2,arg3)

递归深入,上面的递归没有返回值,所以再下面这个例子里才打印了None

def func(arg1,arg2):
if arg1 == 0:
pass

arg3 = arg1 + arg2

if arg3 > 10000:
return arg3
    func(arg2,arg3)

result = func(0,1)
print result
clipboard

返回 None

通过增加 return 函数递归返回最终值

def func(arg1,arg2):
if arg1 == 0:
pass

arg3 = arg1 + arg2

if arg3 > 10000:
return arg3
return func(arg2,arg3)

result = func(0,1)
print result
clipboard[1]

三、模块

#实现某个功能,且是实现

#  存在方式有两种:1. .py文件  2.文件夹

#模块:

    1.自己写  第三方或者python自带的模块不能满足的情况下

    2.别人写    python之所以这么牛逼,就是因为有大量的第三方库和模块

    3.python写        python自带的模块也有很多,os,sys等

作业:

1.os 模块命令执行一遍

2.

解释3层装饰器

def Filter(a1,a2):
    def outer(main_func):
        def wrapper(request,kargs):
            print a1
            main_result = main_func(request,kargs)
            print a2
return main_result
        return wrapper
    return outer
@Filter(f5, f6)
def Index(request,kargs):
    print 'index'

原文地址:https://www.cnblogs.com/xiaobing1024/p/4987113.html