4.2 homework

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

def poker(li):
    l1=[]
    l2=['A','J','Q','K']
    for i in li:
        for j in range(2,11):
            l1.append((i,j))
        for n in l2:
            l1.append((i,n))
    return l1

print(poker(['红心','草花','黑桃','红心']))
# 2.
# 写函数,传入n个数,返回字典
# {‘max’:最大值,’min’:最小值}
# 例如: min_max(2, 5, 7, 8, 4)
# 返回: {‘max’:8,’min’:2}

def min_max(*args):return {'max':max(args),'min':min(args)}


print(min_max(2,5,7,8,4))

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

from math import pi


def area(*args):
    if args[0] == '正方形':
        def square():
            s=args[1]**2
            return s
        return square()

    elif args[0] == '长方形':
        def rectangle():
            s=args[1]*args[2]
            return s
        return rectangle()

    elif args[0] == '圆形':
        def circle():
            s = args[1]**2*pi
            return s
        return circle()
    return area


print(area('长方形',2,3))
print(area('正方形',4))
print(area('圆形',2))
# 4.
# 写函数,传入一个参数n,返回n的阶乘
# 例如: cal(7)
# 计算7 * 6 * 5 * 4 * 3 * 2 * 1

def cal(n):
    count=1
    for i in range(n,0,-1):
        count=count*i
    return count


print(cal(3))
# 6  #加username
# 给每个函数写一个记录日志的功能,
# 功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
# 所需模块:

import time

def wrapper(func):
    def inner(*args,**kwargs):
        username = input('user:').strip()
        password=input('password:').strip()
        with open ('user',encoding='utf-8') as f2:
            for i in f2:
                l2 = i.strip().split()
                if username == l2[0] and password == l2[1]:
                    print('welcome %s' % username)
                struct_time = time.localtime()
                time_now = time.strftime('%Y_%m_%d %H:%M:%S', struct_time)
                with open('logs',encoding='utf-8',mode='a')as f1:
                    f1.write('在%s时,用户%s执行了%s函数\n' % (time_now,username,func.__name__))
                    ret = func(*args,**kwargs)
                    return ret
    return inner


@wrapper
def func1():
    time.sleep(0.1)
    print(555)

@wrapper
def func2():
    time.sleep(0.1)
    print(666)

@wrapper
def func3():
    time.sleep(0.1)
    print(777)

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

def login(func):
    def inner():
        global user_status
        if user_status == False:
            username=input('user:').strip()
            password=input('password:').strip()
            with open('userlist',encoding='utf-8') as f1:
                for i in f1:
                    li=i.strip().split()
                    if username == li[0] and password == li[1]:
                        print('welcome %s' % username)
                        user_status = True
                        func()
        else:
            func()
    return inner


@login
def func1():
    print(666)

@login
def func2():
    print(777)

@login
def func3():
    print(888)


func1()
func2()
func3()
dic = {'username':None,
       'status': False,
       }
def wrapper(func):
    def inner(*args,**kwargs):
        if dic['status']:
            ret = func(*args,**kwargs)
            return ret
        else:
            count=0
            while count <3:
                username=input('username:').strip()
                password=input('password:').strip()
                with open('userlist',encoding='utf-8') as f1:
                    for i in f1:
                        l2=i.strip().split()
                        if username==l2[0] and password==l2[1]:
                            print('welcome %s' % username)
                            dic['username']=username
                            dic['status']=True
                            ret = func(*args,**kwargs)
                            return ret
                    else:
                        print('账号或者密码错误,还有%s机会' % (2-count))
                        count += 1
    return inner

@wrapper
def article():
    print('文章')

@wrapper
def log():
    print('日志')

article()
log()
# 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:
                count=0
                while count<3:
                    username=input('username:%s' % flag).strip()
                    password=input('password:').strip()
                    with open('tb',encoding='utf-8') as f1:
                        tb_dic=eval(f1.readline())
                        if username == tb_dic[flag]['username'] and password == tb_dic[flag]['password']:
                            dic['username']=username
                            dic['status']= True
                            ret = func(*args,**kwargs)
                            return ret
                        else:
                            print('您输入的用户或者密码错误,请重新输入,还有%s次机会' % (2-count))
                            count += 1

        return inner
    return wrapper

@login('weixin')
def taobao_home():
    print('淘宝首页')

@login('weixin')
def taobao_shop():
    print('淘宝超市')

@login('royalpay')
def jingdong_home():
    print('京东首页')

@login('royalpay')
def jingdong_shop():
    print('京东超市')


choice_dict ={
    1:taobao_home,
    2:taobao_shop,
    3:jingdong_home,
    4:jingdong_shop,
}

while True:
    print('1 淘宝首页\n2 淘宝超市\n3 京东首页\n4 京东超市')
    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('您输入包含非法字符,请重新输入')

 



posted on 2018-04-03 20:40  欣蔚  阅读(172)  评论(0编辑  收藏  举报