乐学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(‘\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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值