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

铁乐学Python_day12_作业的更多相关文章

  1. 铁乐学python_day10_作业

    1.继续整理函数相关知识点,写博客. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def sum_n(*args): sum = 0 for i in args: sum += i r ...

  2. 铁乐学Python_day12_装饰器

    [函数的有用信息] 例: def login(user, pwd): ''' 功能:登录调用 参数:分别有user和pwd,作用分别是用户和密码: return: 返回值是登录成功与否(True,Fa ...

  3. 铁乐学python_day09_作业

    练习题 1.整理函数相关知识点,写博客 2.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素, 并将其作为新列表返回给调用者. def odd_index(l): lis = [] for ...

  4. 铁乐学Python_day08作业

    1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数. apple 10 3 tesla 100000 1 mac 3000 2 lenovo 30000 3 chicken 10 3 通过 ...

  5. 铁乐学python_Day44_IO多路复用

    目录 IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO ...

  6. 铁乐学python_Day43_协程

    铁乐学python_Day43_协程 引子 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位. 按道理来说我们已经算是把cpu的利用率提高很多了. ...

  7. 铁乐学python_Day42_线程池

    铁乐学python_Day42_线程池 concurrent.futures 异步调用模块 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor: ...

  8. 铁乐学python_Day42_线程-信号量事件条件

    铁乐学python_Day42_线程-信号量事件条件 线程中的信号量 同进程的一样,Semaphore管理一个内置的计数器, 每当调用acquire()时内置计数器-1:调用release() 时内置 ...

  9. 铁乐学python_Day42_锁和队列

    铁乐学python_Day42_锁和队列 例:多个线程抢占资源的情况 from threading import Thread import time def work(): global n tem ...

随机推荐

  1. Java并发编程笔记之LongAdder和LongAccumulator源码探究

    一.LongAdder原理 LongAdder类是JDK1.8新增的一个原子性操作类.AtomicLong通过CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器来说性能已经很好了,但是JDK ...

  2. video 安卓ios系统 浏览器 全屏播放以及自动播放的问题

    ios自动播放 <body onload="load()"> <div class="result_box"> <div clas ...

  3. 如何学习JavaEE,项目又该如何做?

    本文主要分为三个部分: 如何学习java基础 如何学习javaEE 你关心的项目问题 01 java基础学习 建议初学者看视频学习,不推荐看书.入门视频选择非常重要,最好是通俗易懂.深入浅出的教学视频 ...

  4. java 实现 PDF 加水印功能

    使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 <dependency> <groupId>com.itextpdf</groupId> <a ...

  5. 牛客网剑指offer java 全部题解

    经过数月的努力,终于更完了牛客网的66道剑指offer,以下的顺序和大家在牛客网的顺序是一样的(排序也花了不少时间),希望对大家找工作/提高算法能力能起到些许帮助. 每天一道剑指offer-二维数组中 ...

  6. 转载:SQL按照日、周、月、年统计数据的方法

    转载源:http://www.jb51.net/article/42613.htm SQL按照日.周.月.季度.年统计数据的方法 方式一: --按日 select sum(consume),day([ ...

  7. C++读取配置文件

    在牛人的指导下,和前一个版本有了较大改变. 逐行读取配置文件,然后逐行解析~ 读取一次之后,将键值对存入map,之后都从map中去取,减少读取文件次数 主要代码如下: /** * * read con ...

  8. [LeetCode]Flatten Binary Tree to Linked List题解(二叉树)

    Flatten Binary Tree to Linked List: Given a binary tree, flatten it to a linked list in-place. For e ...

  9. Job控制台(elastic job lite console)

    elastic job lite console: 设计理念 1.本控制台和Elastic Job并无直接关系,是通过读取Elastic Job的注册中心数据展现作业状态,或更新注册中心数据修改全局配 ...

  10. 应用层协议FTP、DNS协议、HTTP协议分析

    分析所用软件下载:Wireshark-win32-1.10.2.exe 一.阅读导览 1.分析FTP协议 2.分析DNS协议 3. 分析HTTP协议 二.分析要求 (1)ftp部分: 学习 Serv- ...