铁乐学Python_day12_作业
1.寫函數,返回一個撲克牌列表,里面有52項,每一項是一個元組
例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
2.寫函數,傳入n個數,返回字典{‘max’:最大值,’min’:最小值}
例如:min_max(2,5,7,8,4)
返回:{‘max’:8,’min’:2}
3.寫函數,專門計算圖形的面積
其中嵌套函數,計算圓的面積,正方形的面積和長方形的面積
調用函數area(‘圓形’,圓半徑) 返回圓的面積
調用函數area(‘正方形’,邊長) 返回正方形的面積
調用函數area(‘長方形’,長,寬) 返回長方形的面積
4.寫函數,傳入一個參數n,返回n的階乘
例如:cal(7)
計算7654321
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 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函數名稱:{}\t\t時間節點:{}'.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可以看到己生成下列兩行記錄函數名稱:hello 時間節點:2018-04-02 19:04:05 函數名稱:my_name 時間節點:2018-04-02 19:04:057、編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源于文件),要求登錄成功一次,后續的函數都無需再輸入用戶名和密碼。
答:
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標志位為False,以便接下來裝飾的函數不用再進行認證。flag = Falseret = func(*args, **kwargs)return ret# 循環驗證完畢之后再報驗證失敗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 驗證失敗 # 執行第一個函數驗證失敗,于是到第二個時又再進行認證 請輸入用戶名:伍天 請輸入密碼: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):# 引入全局變量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標志位為False,以便接下來裝飾的函數不用再進行認證。flag = Falseret = func(*args, **kwargs)return ret# 循環驗證完畢之后再報驗證失敗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標志位為False,以便接下來裝飾的函數不用再進行認證。flag = Falseret = func(*args, **kwargs)return ret# 循環驗證完畢之后再報驗證失敗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轉載于:https://www.cnblogs.com/tielemao/p/8719180.html
總結
以上是生活随笔為你收集整理的铁乐学Python_day12_作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乐观锁与悲观锁以及乐观锁的一种实现方式-
- 下一篇: python常见的数据转化函数