您的位置:首页 > 编程语言 > Python开发

python 11期 第五天

2015-12-02 22:07 567 查看
一、装饰器基础

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
@zhuang3def yuan3(a): print "you are name is %s" % a li=['aa',42] return li

key='jfiejf0293fkdsj(fjeiwof' ## 2、业务线中用户传来了个keytest=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
只有大于当前日志等级的操作才会被记录。

本文出自 “Linux天地” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: