作业10

一、编写函数(函数的执行时间是随机的)

import random,time
def random_time():
    print('start')
    time.sleep(random.randint(1,10))
    print('end')
random_time()

二、编写装饰器,为函数加上统计时间的功能

import time
def timmer(func):
    def wrapper(*args,**kwargs):
        star = time.time()
        res = func(*args,**kwargs)
        stop = time.time()
        print('run time is %s'%(stop - star))
        print(res)
        return res
    return wrapper()
@timmer
def index()
  time.sleep(3)
  print('welecome to Oldboy school')
index()

三、编写装饰器,为用户加上认证功能

def auth(func):
def wrapper(*args,**kwargs):
user = input('please input your username>>>: ').strip()
pwd = input('please input your password>>>: ').strip()
if user == 'klf' and pwd == '123':
print('login successful')
res = func(*args,**kwargs)
return res
else:
print('user or password error')
return wrapper()

四、编写装饰器,为多个函数加上认证功能(用户的账号密码来源于文件),要求登陆成功一次,后续的函数都无需在输入账户密码

from functools import wraps
user_info = {'user':None}
def auth(func):
    @wraps
    def wrapper(*args,**kwargs):
        if user_info['user'] is not None:
            res = func(*args,**kwargs)
            return res
        user = input('please input your username>>>:  ').strip()
        pwd = input('please input your password>>>:   ').strip()
        with open('user_info.txt') as f:
            for line in f:
                line = line.strip('\n').split(':')
                if line[0] == user and line[1] == pwd:
                    print('login successful')
                    res = func(*args,**kwargs)
                    return res
                else:
                    print('user or password error')
    return wrapper()
@auth
def cut():
    print('welecome to Oldboy school')

五、编写装饰器,为多个函数加上认证功能,要求登陆成功一次,在超时时间内无需重复登陆,过了超时时间则必须重新登陆。

import time,random
user = {'user':None,'login_time':None,'timeout':0.0003}     #定义空字典,将用户名,登录时间存为None,定义一个超时的值
def auth(func):
    def wrapper(*args,**kwargs):
        if user['user']:
            timeout = time.time()-user['login_time']        
            if timeout < user['timeout']:
                return func(*args,**kwargs)
        name = input('please input your name >>:    ').strip()
        pwd = input('please input your password>>:   ').strip()
        if name == 'egon' and pwd == '123':
            user['user'] = name
            user['login_time'] = time.time()
            res = func(*args,**kwargs)
            return res
    return wrapper
@auth
def index():
    time.sleep(random.randrange(3))
    print('welecome to Shanghai')

@auth
def home(name):
    time.sleep(random.randrange(3))
    print('welecome to %s home'%name)
index()
home('egon')

六、编写下载网页内容的函数,要求功能:用户输入一个url,函数返回下载页面的结果

import requests             # 导入requests模块


def get(url):         # 定义函数
    response = requests.get(url)      # 爬取网址url的内容
    if response.status_code == 200:      # 判断状态
        return response.text


url = input('>>:')
print(get(url))

七、为题目五编写装饰器,实现缓存网页内容的功能

具体实现:实现下载的页面存放与文件中,如果文件内有值(文件大小不为于0),就优先从文件中读取网页内容,否则,就去网页下载,然后存到文件中

import requests
from functools import wraps
def download(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        with open(db,mode='a+',encoding='utf-8') as f:
            f.seek(0)
            if len(f.read()) > 0:
                f.seek(0)
                res = f.read()
                return res
            else:
                res = func(*args,**kwargs)
                f.write(res)
                return res
    return wrapper

@download
def get(url, db):        # 爬取一个网页的内容
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
url = input('URL>>:       ')
db = input('File path>>:          ')
get(url,db)

八、还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的想法,在文件开头声明一个字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

from functools import wraps

functions = {}             # 定义空字典方便将函数放进去


def add(func):
    @wraps(func)       # 这一步会令装饰器变得完美
    def wrapper(*args, **kwargs):
        for i in functions:     # 循环字典,判断func是否已经存在
            if functions[i] == func:
                break
        else:          # 遍历字典没找到func则将func添加进字典
            functions[str(len(functions))] = func  # 添加时要与数字建立关系
        res = func(*args, **kwargs)
        return res

    return wrapper


@add
def login():
    print('Log in successful')


@add
def shopping():
    print("I'm shopping now")


@add
def pay():
    print("Pay for goods")


@add
def charge():
    print('Charge money')

九、编写日志装饰器,实现功能如:一旦函数f1执行,则将消息的具体时间写入日志中,日志文件路径可以指定

from functools import wraps
import time

def f1(file_path):
    def f2(func ):
        @wraps(func)
        def f3(*args,**kwargs):
            with open(file_path,'a',encoding='utf-8') as f:
                time_now = time.strftime('%Y-%m-%d %X')
                res = func(*args,**kwargs)
                f.write('%s:%s:run\n'%(time_now,func))
                return res
        return f3
    return f2
@f1('f1.txt')
def f4():
    pass

 

posted @ 2018-09-27 23:56  BlackLinks  阅读(175)  评论(0)    收藏  举报