zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python_day12_作业详解编程语言

Python编程语言 详解 作业 Day12
2023-06-13 09:20:37 时间

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)) 

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)) 

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

12764.html

cpython