zoukankan      html  css  js  c++  java
  • 4--2日 函数 装饰器 作业题

    1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
    例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
    def func(*args,**kwargs):
        li = []
        for i in args:
            for j in range(1,14):
                if j == 1:
                    j = 'A'
                li.append((i,j))
        return li
    ret = func('红桃','方块','梅花','黑桃')
    print(ret)
    def func(*args):
        li = []
        for i in args:
            for j in range(1,14):
                if j == 1:
                    j = 'A'
                elif j == 11:
                    j = 'J'
                elif j == 12:
                    j = 'Q'
                elif j == 13:
                    j = 'K'
                li.append((i,j))
        return li
    print(func('黑桃','梅花','方片','红桃'))
    2.写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
    例如:min_max(2,5,7,8,4)
    返回:{‘max’:8,’min’:2}
    def func(*args,**kwargs):
        a = max(args)
        b = min(args)
        return {'max':a,'min':b}
    set = func(1,3,343,34,5,743)
    print(set)
    def func(*args):
        return {'max':max(args),'min':min(args)}
    print(func(1,2,4,6,8))

    3.写函数,专门计算图形的面积
    其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
    调用函数area(‘圆形’,圆半径) 返回圆的面积
    调用函数area(‘正方形’,边长) 返回正方形的面积
    调用函数area(‘长方形’,长,宽) 返回长方形的面积
    def area(*args):
        if args[0] == '长方形':
            def 计算长方形面积():
                s = args[1]*args[2]
                return s
            return 计算长方形面积()
        elif args[0] == '正方形':
            def 正方形面积():
                f = args[1]*args[1]
                return f
            return 正方形面积()
        elif args[0] == '圆形':
            def 圆形面积():
                y = 3.14*args[1]*args[1]
                return y
            return 圆形面积()
    
    print(area('长方形',3,5))
    print(area('正方形',6))
    print(area('圆形',5))


    4.写函数,传入一个参数n,返回n的阶乘
    例如:cal(7)
    计算7*6*5*4*3*2*1
    def cal(a):
        sum = 1
        for i in range(1,a+1):
            sum = i*sum
        return sum
    print(cal(7))
    def func(n):
        count = 1
        for i in range(n,0,-1):
            count = count * i
        return count
    print(func(8))

    5、编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果(升级题)
    5.1.为题目3编写装饰器,实现缓存网页内容的功能:(升级题)
    具体:实现下载的页面存放于文件中,如果网页有对应的缓存文件,就优先从文件中读取网页内容,否则,就去下载,然后存到文件中


    6给每个函数写一个记录日志的功能,
    功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
    所需模块:
    import time
    struct_time = time.localtime()
    print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
    import time
    dic_status = {'username':None,'status':False}
    def wrapper(func):
    def inner(*args,**kwargs):
    struct_time = time.localtime()
    now_time = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
    dic_status['username'] = 'yuyu'
    dic_status['status'] = True
    with open('log','a',encoding='utf-8')as f1:
    f1.write('%s在%s时间,调用了%s函数 '%(dic_status['username'],now_time,func.__name__))
    ret = func(*args,**kwargs)
    return ret
    return inner

    @wrapper
    def login():
    print('欢迎加油')

    @wrapper
    def argv():
    print('韩寒')

    login()
    time.sleep(3)
    argv()


    7、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
    dic = {'username':None,
           'status':False,}
    def wrapper(func):
        def inner(*args,**kwargs):
            if dic['status']:
                ret = func(*args,**kwargs)
                return ret
            else:
                i = 0
                while i < 3:
                    username = input('请输入用户名:').strip()
                    password = input('请输入密码:').strip()
                    with open('rigister.txt',encoding='utf-8')as f1:
                        for j in f1:
                            j_list = j.strip().split()
                            if username == j_list[0] and password == j_list[1]:
                                dic['username'] = username
                                dic['status'] = True
                                ret = func(*args, **kwargs)
                                return ret
                        else:
                            print('账号或密码错误,请重新输入%s机会'%(2-i))
                            i += 1
        return inner
    
    @wrapper
    def comment():
        print('评论')
    
    @wrapper
    def article():
        print('文章')
    
    @wrapper
    def diary():
        print('日记')
    
    @wrapper
    def file():
        print('文件')
    
    
    comment()
    article()
    diary()
    file()
    8,在编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。这个作业之上进行升级操作:
    设置两套密码,一套为京东账号密码,一套为淘宝账号密码保存在文件中。
    设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。
    循环打印四个选项:东首页,京东超市,淘宝首页,淘宝超市。
    供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。
    相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。
    dic = {'username':None,
           'status':False,}
    
    def login(flag):
        def wrapper(func):
            def inner(*args,**kwargs):
                if dic['status']:
                    ret = func(*args,**kwargs)
                    return ret
                else:
                    i = 0
                    while i < 3:
                        username = input('请输入用户名(用%s账号)%flag:').strip()
                        password = input('请输入密码:').strip()
                        with open('login.txt',encoding='utf-8')as f1:
                            msg_dic = eval(f1.readline())
                            if username == msg_dic[flag]['username'] and password == msg_dic[flag]['password']:
                                dic['username'] = username
                                dic['status'] = True
                                ret = func(*args,**kwargs)
                                return ret
                            else:
                                print('用户名或者密码错误请重新输入,还剩%s次机会'%(2-i))
                                i += 1
            return inner
        return wrapper
    
    @login('qq')
    def taobao_home():
        print('淘宝首页')
    
    
    @login('qq')
    def taobao_shop():
        print('淘宝商城')
    
    
    @login('微信')
    def jingdong_home():
        print('京东首页')
    
    
    @login('微信')
    def jingdong_shop():
        print('京东商城')
    
    choice_dict = {1:taobao_home,
                  2:taobao_shop,
                  3:jingdong_home,
                  4:jingdong_shop}
    
    while True:
        print('
    1-淘宝首页 
    2-淘宝商城 
    3-京东首页 
    4-京东商城')
        choice_num = input('请选择输入的序号:').strip()
        if choice_num.isdigit():
            choice_num = int(choice_num)
            if 0 < choice_num <= len(choice_dict):
                choice_dict[choice_num]()
            else:
                print('请重新选择:')
    
        else:
            print('输入的有非法字符,请重新输入')
    View Code


  • 相关阅读:
    Node.js系列基础学习-----回调函数,异步
    Git版本控制工具学习
    大三下学期计划
    JavaScript基础插曲---apply,call和URL编码等方法
    JavaScript基础插曲-练习
    Jira内存调整
    IntelliJ IDEA 简单设置
    介绍一个国内强大的API接口文档写作网站showdoc
    使用IntelliJ IDEA 配置Maven(入门)
    Jira内存调整
  • 原文地址:https://www.cnblogs.com/yzxing/p/8693801.html
Copyright © 2011-2022 走看看