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('/n函数名称:{}/t/t时间节点:{}'.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

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/industrynews/12764.html

(0)
上一篇 2021年7月19日 14:53
下一篇 2021年7月19日 14:53

相关推荐

发表回复

登录后才能评论