1.寫函數,返回一個撲克牌列表,裡面有52項,每一項是一個元組 例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃’,‘A’)] 2.寫函數,傳入n個數,返回字典{‘max’:最大值,’min’:最小值} 例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2} 3 ...
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