铁乐学Python_day12_作业
1.寫函數(shù),返回一個撲克牌列表,里面有52項,每一項是一個元組
例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
2.寫函數(shù),傳入n個數(shù),返回字典{‘max’:最大值,’min’:最小值}
例如:min_max(2,5,7,8,4)
返回:{‘max’:8,’min’:2}
3.寫函數(shù),專門計算圖形的面積
其中嵌套函數(shù),計算圓的面積,正方形的面積和長方形的面積
調(diào)用函數(shù)area(‘圓形’,圓半徑) 返回圓的面積
調(diào)用函數(shù)area(‘正方形’,邊長) 返回正方形的面積
調(diào)用函數(shù)area(‘長方形’,長,寬) 返回長方形的面積
4.寫函數(shù),傳入一個參數(shù)n,返回n的階乘
例如:cal(7)
計算7654321
5、編寫下載網(wǎng)頁內(nèi)容的函數(shù),要求功能是:用戶傳入一個url,函數(shù)返回下載頁面的結(jié)果(升級題)
5.1.為題目3編寫裝飾器,實現(xiàn)緩存網(wǎng)頁內(nèi)容的功能:(升級題)
具體:實現(xiàn)下載的頁面存放于文件中,如果網(wǎng)頁有對應(yīng)的緩存文件,就優(yōu)先從文件中讀取網(wǎng)頁內(nèi)容,否則,就去下載,然后存到文件中
6、給每個函數(shù)寫一個記錄日志的功能,
功能要求:每一次調(diào)用函數(shù)之前,要將函數(shù)名稱,時間節(jié)點記錄到log的日志中。
所需模塊:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
答:
from functools import wraps import timedef 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函數(shù)名稱:{}\t\t時間節(jié)點:{}'.format(name, timesession))ret = func(*args, **kwargs)return retreturn inner@timer def hello():print('hello word')@timer def my_name(name):print('my name is %s' % name)# 驗證 hello() my_name('wutiele')# 打開log.txt可以看到己生成下列兩行記錄函數(shù)名稱:hello 時間節(jié)點:2018-04-02 19:04:05 函數(shù)名稱:my_name 時間節(jié)點:2018-04-02 19:04:057、編寫裝飾器,為多個函數(shù)加上認(rèn)證的功能(用戶的賬號密碼來源于文件),要求登錄成功一次,后續(xù)的函數(shù)都無需再輸入用戶名和密碼。
答:
def auth(func):def inner(*args, **kwargs):# 引入全局變量flagglobal flagif 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標(biāo)志位為False,以便接下來裝飾的函數(shù)不用再進行認(rèn)證。flag = Falseret = func(*args, **kwargs)return ret# 循環(huán)驗證完畢之后再報驗證失敗else:print('驗證失敗')returnelse:ret = func(*args, **kwargs)return retreturn innerflag = 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 驗證失敗 # 執(zhí)行第一個函數(shù)驗證失敗,于是到第二個時又再進行認(rèn)證 請輸入用戶名:伍天 請輸入密碼:123567 登錄成功 # 第二個函數(shù)認(rèn)證通過,接下來的第三個函數(shù)直接執(zhí)行 my name is tiele hello word,hello hero. # 第三個函數(shù)直接執(zhí)行了,不需要認(rèn)證。8,再編寫裝飾器,為多個函數(shù)加上認(rèn)證的功能(用戶的賬號密碼來源于文件),要求登錄成功一次,后續(xù)的函數(shù)都無需再輸入用戶名和密碼。這個作業(yè)之上進行升級操作:
設(shè)置兩套密碼,一套為京東賬號密碼,一套為淘寶賬號密碼保存在文件中。
設(shè)置四個函數(shù),分別代表 京東首頁,京東超市,淘寶首頁,淘寶超市。
循環(huán)打印四個選項:京東首頁,京東超市,淘寶首頁,淘寶超市。
供用戶選擇,用戶輸入選項后,執(zhí)行該函數(shù),四個函數(shù)都加上認(rèn)證功能,只要登陸成功一次,在選擇其他函數(shù),后續(xù)都無需輸入用戶名和密碼。
相關(guān)提示:用帶參數(shù)的裝飾器。裝飾器內(nèi)部加入判斷,驗證不同的賬戶密碼。
答:
def auth2(model):'''由于裝飾器需帶參數(shù),故嵌套三層函數(shù)。:param model: 供選擇jingdong或taobao:return: '''def auth(func):def inner(*args, **kwargs):# 引入全局變量flagglobal flagif 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標(biāo)志位為False,以便接下來裝飾的函數(shù)不用再進行認(rèn)證。flag = Falseret = func(*args, **kwargs)return ret# 循環(huán)驗證完畢之后再報驗證失敗else:print('驗證失敗')returnelif 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標(biāo)志位為False,以便接下來裝飾的函數(shù)不用再進行認(rèn)證。flag = Falseret = func(*args, **kwargs)return ret# 循環(huán)驗證完畢之后再報驗證失敗else:print('驗證失敗')returnelse:ret = func(*args, **kwargs)return retreturn innerreturn authflag = 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':breakelif sn == "1":JD_index()elif sn == "2":JD_supermark()elif sn == "3":TB_index()elif sn == "4":TB_supermark()else:print('你的選擇有誤,請重新選擇:')continue轉(zhuǎn)載于:https://www.cnblogs.com/tielemao/p/8719180.html
總結(jié)
以上是生活随笔為你收集整理的铁乐学Python_day12_作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乐观锁与悲观锁以及乐观锁的一种实现方式-
- 下一篇: CentOS部署NetCore - 2.