python语言程序设计作业
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
发布评论