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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值