zoukankan      html  css  js  c++  java
  • 铁乐学Python_day12_作业

    1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
    例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]

    
    def poker():
        suit = ['红心', '梅花', '黑桃', '方片']
        count = [i for i in range(2, 11)]
        king = ['J', 'Q', 'K', 'A']
        poker_list = count + king
        li = []
        for key in suit:
            for value in poker_list:
                li.append((key, value))
        return li
    
    print(poker())
    print(len(poker()))
    

    2.写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
    例如:min_max(2,5,7,8,4)
    返回:{‘max’:8,’min’:2}

    def min_max(*args):
        a = max(args)
        b = min(args)
        dic = {'max':a, 'min':b}
        return dic
    
    print(min_max(2))
    

    3.写函数,专门计算图形的面积
    其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
    调用函数area(‘圆形’,圆半径) 返回圆的面积
    调用函数area(‘正方形’,边长) 返回正方形的面积
    调用函数area(‘长方形’,长,宽) 返回长方形的面积

    答:
    # 感觉本题考的主要是嵌套函数内的参数传递,先从最内函数去倒推会容易得到答案。
    def area(patter, *args):
        if patter == '长方形':
            # 计算长方形面积
            def rectangle(a, b):
                S = a * b
                return S
            return rectangle(*args)
    
        if patter == '正方形':
            # 计算正方形面积
            def quadrate(a):
                S = a * a
                return S
            return quadrate(*args)
    
        if patter == '圆形':
            # 计算圆形面积
            def roundness(r):
                S = 3.14 * r * r
                return S
            return roundness(*args)
    
    print(area('长方形', 4, 8))
    print(area('正方形', 12))
    print(area('圆形', 6))
    
    验证:
    32
    144
    113.03999999999999
    
    另一种写法如下,所有def定义在前面,内存中能找到相应函数名对应的函数,之前试过写if在前面的结果找不到对应的函数,所以报错了。
    
    def area(patter, *args):
    
        # 计算长方形面积
        def rectangle(a, b):
            S = a * b
            return S
    
        # 计算正方形面积
        def quadrate(a):
            S = a * a
            return S
    
         # 计算圆形面积
        def roundness(r):
            S = 3.14 * r * r
            return S
    
        if patter == '正方形':
            return quadrate(*args)
        if patter == '长方形':
            return rectangle(*args)
        if patter == '圆形':
            return roundness(*args)
    
    print(area('长方形', 5, 8))
    print(area('正方形', 11))
    print(area('圆形', 7))
    
    验证:
    40
    121
    153.86
    

    4.写函数,传入一个参数n,返回n的阶乘
    例如:cal(7)
    计算7654321

    答:使用递归的方式
    def cal(n):
        if n == 1:
            return 1
        return n * cal(n - 1)
    
    print(cal(7))
    
    5040
    

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

    6、给每个函数写一个记录日志的功能,
    功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
    所需模块:
    import time
    struct_time = time.localtime()
    print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))

    答:

    from functools import wraps
    import time
    
    def timer(func):
        @wraps(func)
        def inner(*args, **kwargs):
            with open('log.txt', encoding='utf-8', mode='a') as f1:
                struct_time = time.localtime()
                timesession = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
                name = func.__name__
                f1.write('
    函数名称:{}		时间节点:{}'.format(name, timesession))
            ret = func(*args, **kwargs)
            return ret
        return inner
    
    @timer
    def hello():
        print('hello word')
    
    @timer
    def my_name(name):
        print('my name is %s' % name)
    
    # 验证
    hello()
    my_name('wutiele')
    
    # 打开log.txt可以看到己生成下列两行记录
    
    函数名称:hello		时间节点:2018-04-02 19:04:05
    函数名称:my_name	时间节点:2018-04-02 19:04:05
    

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

    答:

    def auth(func):
        def inner(*args, **kwargs):
            # 引入全局变量flag
            global flag
            if flag:
                username = input("请输入用户名:").strip()
                password = input("请输入密码:").strip()
                with open('auth.txt', encoding='utf-8', mode='r') as f1:
                    for i in f1:
                        li = i.strip().split()
                        if username == li[0] and password == li[1]:
                            print('登录成功')
                            # 修改全局变量flag标志位为False,以便接下来装饰的函数不用再进行认证。
                            flag = False
                            ret = func(*args, **kwargs)
                            return ret
                    # 循环验证完毕之后再报验证失败
                    else:
                        print('验证失败')
                        return
            else:
                ret = func(*args, **kwargs)
            return ret
        return inner
    
    flag = True
    @auth
    def hello():
        print('hello word,hello hero.')
    
    @auth
    def my_name(name):
        print('my name is %s' % name)
    
    # 验证
    hello()
    
    my_name('tiele')
    
    hello()
    
    # 效果:
    
    请输入用户名:test
    请输入密码:234
    验证失败  			# 执行第一个函数验证失败,于是到第二个时又再进行认证
    请输入用户名:伍天
    请输入密码:123567
    登录成功				# 第二个函数认证通过,接下来的第三个函数直接执行
    my name is tiele
    hello word,hello hero.  # 第三个函数直接执行了,不需要认证。
    

    8,再编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。这个作业之上进行升级操作:
    设置两套密码,一套为京东账号密码,一套为淘宝账号密码保存在文件中。
    设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。
    循环打印四个选项:京东首页,京东超市,淘宝首页,淘宝超市。
    供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。
    相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。

    答:

    def auth2(model):
        '''
        由于装饰器需带参数,故嵌套三层函数。
        :param model: 供选择jingdong或taobao
        :return: 
        '''
        def auth(func):
            def inner(*args, **kwargs):
                # 引入全局变量flag
                global flag
                if flag and model == 'jingdong':
                    username = input("请输入用户名:").strip()
                    password = input("请输入密码:").strip()
                    with open('auth_JD.txt', encoding='utf-8', mode='r') as f1:
                        for i in f1:
                            li = i.strip().split()
                            if username == li[0] and password == li[1]:
                                print('登录成功')
                                # 修改全局变量flag标志位为False,以便接下来装饰的函数不用再进行认证。
                                flag = False
                                ret = func(*args, **kwargs)
                                return ret
                        # 循环验证完毕之后再报验证失败
                        else:
                            print('验证失败')
                            return
                elif flag and model == 'taobao':
                    username = input("请输入用户名:").strip()
                    password = input("请输入密码:").strip()
                    with open('auth_TB.txt', encoding='utf-8', mode='r') as f1:
                        for i in f1:
                            li = i.strip().split()
                            if username == li[0] and password == li[1]:
                                print('登录成功')
                                # 修改全局变量flag标志位为False,以便接下来装饰的函数不用再进行认证。
                                flag = False
                                ret = func(*args, **kwargs)
                                return ret
                        # 循环验证完毕之后再报验证失败
                        else:
                            print('验证失败')
                            return
                else:
                    ret = func(*args, **kwargs)
                return ret
            return inner
        return auth
    
    flag = True
    @auth2(model='jingdong')
    def JD_index():
        print('from JD index 京东首页')
    @auth2(model='jingdong')
    def JD_supermark():
        print('from JD supermark 京东超市')
    @auth2(model='taobao')
    def TB_index():
        print('from TB index 淘宝首页')
    @auth2(model='taobao')
    def TB_supermark():
        print('from TB supermark 淘宝超市')
    
    while True:
        li2 = ['京东首页', '京东超市', '淘宝首页', '淘宝超市']
        for i in range(len(li2)):
            print(i+1, li2[i])
        sn = input("请按序号选择商城:(Q/q退出)").strip()
        if sn.upper() == 'Q':
            break
        elif sn == "1":
            JD_index()
        elif sn == "2":
            JD_supermark()
        elif sn == "3":
            TB_index()
        elif sn == "4":
            TB_supermark()
        else:
            print('你的选择有误,请重新选择:')
            continue
    
  • 相关阅读:
    andrid 上传图片 asp.net 后台接收并保存
    Volley封装
    error: Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.ActionButton'.
    The type android.support.v4.view.ScrollingView cannot be resolved. It is indirectly referenced from
    Recyclerview 实现上拉加载更多
    RecyclerAdapter封装
    项目中自己一直用到的baseAdapter的类
    SwipeRefreshLayout 和RecyclerView 使用
    DrawerLayout 使用
    学习动态性能表 v$sql
  • 原文地址:https://www.cnblogs.com/tielemao/p/8719180.html
Copyright © 2011-2022 走看看