python 11期 第五天

一、裝飾器基礎

1、無參數的裝飾器


def zhuang(foo):

    def shi():

        print '------'

        foo()

        print '======='

    return shi


##給以下函數裝上裝飾器

@zhuang

def yuan():

    print "###########"


2、有參數的裝飾器

def zhuang2(foo):

    def shi(str):

        print '------------'

        foo(str)

        print '============'

    return shi


@zhuang2

def yuan2(str):

    print "This is a test %s" %str


3、自定義n個參數的裝飾器:

def zhuang3(foo):

    def shi(*str,**str2):

        print '------------'

        foo(*str,**str2)

        print '============'

    return shi


@zhuang3

def yuan3(a,b,c):

    print "one %s,tow %s,three %s" %(a,b,c)


yuan3('wang','ty','tian')

此裝飾器zhuang3不管函數有無參數,或者多少參數,都可使用。


二、裝飾器的擴展

1、調用裝飾器的函數的return值

舉例1:

def zhuang3(foo):

    def shi(*str,**str2):

        print '------------'

        test=foo(*str,**str2)

        print '============'

        return test

    return shi


@zhuang3

def yuan3(a,b,c):

    print "one %s,tow %s,three %s" %(a,b,c)

    li=['aa',42]

    return li

首先在被裝飾的原函數中要有返回值,然後在裝飾器中的內函數中接受原函數的返回值,之後再從內函數中返回,即可拿到返回值

舉例2:用裝飾器來驗證是否登陸成功

def login():

    name='wang'

    password=111111

    user=raw_input("please input your name: ")

    passwd=input("please input your password: ")

    if user == name and passwd == password:

        return True

    else:

        return False


def zhuang3(foo):

    def shi(*str,**str2):

        print '------------'

        denglu=login()

        if denglu:

            pass

        else:

            return "invalied"

        test=foo(*str,**str2)

        print '============'

        return test

    return shi


@zhuang3

def yuan3(a,b,c):

    print "one %s,tow %s,three %s" %(a,b,c)

    li=['aa',42]

    return li

將裝飾器zhuang3可以加在任何需要驗證的函數上,比如和用戶相關的函數上面。



舉例3,驗證key:

def login(key):

    local = 'jfiejf0293fkdsj(fjeiwof'  ## 1、在本地中有個有效的key,和用戶傳來的key比較

    if local == key:

        return True

    else:

        return False



def zhuang3(foo):

    def shi(*str,**str2):

        key=str2.pop('token')  ## 3、裝飾器中把用戶傳來的key獲取到後並刪除,

        denglu=login(key)     ## 4、否則到下面原函數中執行會報錯

        if denglu:

            pass

        else:

            return "invalied"

        test=foo(*str,**str2)  ## 5、此處的foo函數就相當於下面的yuan3函數。

        print '============'

        return test

    return shi


@zhuang3

def yuan3(a):

    print "you are name is  %s" % a

    li=['aa',42]

    return li



key='jfiejf0293fkdsj(fjeiwof'  ## 2、業務線中用戶傳來了個key

test=yuan3('wang',token=key)

print '--->',test




2、一個函數使用多個裝飾器

def Z1(key):

    def inner():

        print 'Z1 start'

        key()

        print "Z1 end"

    return inner


def Z2(foo):

    def shi():

        print 'Z2 start'

        foo()

        print 'Z2 end'

    return shi

#使用兩層裝飾器

@Z2

@Z1

def yuan3():

    print "this is test"


##單層裝飾器可以驗證用戶登陸,兩層裝飾器可以再驗證用戶權限業務,多層裝飾器可以做其他。


3、裝飾器的參數

舉例:

def Before(request,kargs):

    print 'before'

      

def After(request,kargs):

    print 'after'

  

  

def Filter(before_func,after_func):

    def outer(main_func):

        def wrapper(request,kargs):

              

            before_result = before_func(request,kargs)

            if(before_result != None):

                return before_result;

              

            main_result = main_func(request,kargs)

            if(main_result != None):

                return main_result;

              

            after_result = after_func(request,kargs)

            if(after_result != None):

                return after_result;

              

        return wrapper

    return outer

      

@Filter(Before, After)

def Index(request,kargs):

    print 'index'


備註:此處的@Filter(Before, After)分爲兩步:

1、先執行Filter(Before, After)得到一個返回值retu

2、再執行@retu


三、遞歸函數


def foo(a,b):

    if a==0:

        print a

    else:

        print b

    c=a+b

    foo(b,c)


foo(0,1)

打印結果如下(死循環):

0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 .....

遞歸函數作用:

遞歸函數中會先有一部分來處理參數的代碼,之後產生一個新的結果,下一步再調用此函數本身,再將新的結果作爲參數傳入處理,循環反覆,就形成了遞歸處理函數。


遞歸返回值:

def foo(a,b):

    if a==0:

        print a

    else:

        print b

    c=a+b

    if c > 1000:

        return c

    return foo(b,c)



test=foo(0,1)

print '--->',test


#返回值講解:

def a():

    return 111


def b():

    a()


def e():

    b()


result=e()

print "--->",result


此時result的值並不是111,而是None,因爲函數e沒有返回值,所以默認返回是None,如果想得到111,必須在每個函數裏面都加一個return關鍵字。如:

def a():

    return 111


def b():

   return a()


def e():

   return b()


result=e()


遞歸函數相當於上面的例子,一層調一層,只是傳的參數發生了變化。


四、模塊

模塊是爲了實現某種功能的py文件,或者實現的所有代碼集合的文件夾。

模塊有三種:

1、內置模塊

2、自定義模塊

3、第三方模塊


導入模塊:

import sys

import sys as test #給sys模塊重命名爲test.

模塊導入的默認路徑:

sys.path

因此如果想增加路徑可在此模塊中增加路徑,比如
sys.path.append('/tmp/')


模塊在被導入的時候,就會被解釋器調入內存並執行。

文件夾如果想變成python的模塊包,在此文件夾下必須有一個名爲__init__.py的文件。


內置模塊:

1、os模塊:提供與系統相關的級別的操作


os模塊,主要方法如下:

os.listdir(dirname):列出dirname下的目錄和文件

os.getcwd():獲得當前工作目錄

os.curdir:返回當前目錄('.')

os.chdir(dirname):改變工作目錄到dirname

os.path.isdir(name):判斷name是不是一個目錄,name不是目錄就返回false

os.path.isfile(name):判斷name是不是一個文件,不存在name也返回false

os.path.exists(name):判斷是否存在文件或目錄name

os.path.getsize(name):獲得文件大小,如果name是目錄返回0L

os.path.abspath(name):獲得絕對路徑

os.path.normpath(path):規範path字符串形式

os.path.split(name):分割文件名與目錄(事實上,如果你完全使用目錄,它也會將最後一個目錄作爲文件名而分離,同時它不會判斷文件或目錄是否存在)

os.path.splitext():分離文件名與擴展名

os.path.join(path,name):連接目錄與文件名或目錄

os.path.basename(path):返回文件名

os.path.dirname(path):返回文件路徑

os.remove(dir) #dir爲要刪除的文件夾或者文件路徑

os.rmdir(path) #path要刪除的目錄的路徑。需要說明的是,使用os.rmdir刪除的目錄必須爲空目錄,否則函數出錯。

os.path.getmtime(name) #獲取文件的修改時間

os.stat(path).st_mtime#獲取文件的修改時間

os.stat(path).st_ctime #獲取文件修改時間

os.path.getctime(name)#獲取文件的創建時間


2、sys模塊:與python解釋器相關的操作。


3、subprocess模塊,可以做與系統相關操作的所有功能,主要是進程相關操作。


4、ConfigParser模塊,處理配置文件的模塊

比如以下種類的配置文件:

[server]

host=192.168.1.5

port=2208

[client]

name=wang

passwd=abcd


讀取:

import ConfigParser


conf=ConfigParser.ConfigParser()

conf.read('tingyun.ini')


sec=conf.sections()  #讀取tingyun.ini中的section。

print sec


option=conf.options('server')   ##獲取此'server'section下的key。

print option


option2=conf.items('client')   #獲取section 'client' 的key 和 value

print option2


#獲取指定的value

value=conf.get('server','port')  #獲取server 下的 port的value

print value


寫入:

#sec=conf.remove_section('server')      #刪除section--server

#sec=conf.remove_option('server','host')  #刪除server下的host選項

#sec=conf.add_section('other')  #增加一個section


conf.write(open('tingyun.ini','w'))    #將刪除寫入文件


對文件密碼進行加密模塊hashlib:

1、之前用md5,但是該模塊將要被廢棄,不建議使用

import md5


hash1=md5.new()

hash1.update('12345')

print hash1.hexdigest()


2、sha

此模塊也不推薦


3、hashlib


import hashlib

hasd2=hashlib.md5()    #用md5加密

hasd2.update('admin')

print hasd2.hexdigest()


hash3=hashlib.sha1()   #用sha1加密

hash3.update('admin')

print hash3.hexdigest()


爲了防止撞庫發生,可以給md5值加密時候再加一個key:

hasd2=hashlib.md5('afe')  #在此處加一個字符串

hasd2.update('admin')

print hasd2.hexdigest()


4、hmac模塊

import hmac


h=hmac.new('keyfew')

h.update('admin')

print h.hexdigest()

功能很強大的密碼加鹽模塊。


5、logging模塊


用於便捷記錄日誌且線程安全的模塊



import logging

 

 

logging.basicConfig(filename='log.log',

                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',

                    datefmt='%Y-%m-%d %H:%M:%S %p',

                    level=10)

 

logging.debug('debug')

logging.info('info')

logging.warning('warning')

logging.error('error')

logging.critical('critical')

logging.log(10,'log')

對於等級:



CRITICAL = 50

FATAL = CRITICAL

ERROR = 40

WARNING = 30

WARN = WARNING

INFO = 20

DEBUG = 10

NOTSET = 0

只有大於當前日誌等級的操作纔會被記錄。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章