python總結與習題(二)
python總結
相關習題
1. 計算圖形面積的函數
寫函數,專門計算圖形的面積
其中嵌套函數,計算圓的面積,正方形的面積和長方形的面積
調用函數area(‘圓形’,圓半徑) 返回圓的面積
調用函數area(‘正方形’,邊長) 返回正方形的面積
調用函數area(‘長方形’,長,寬) 返回長方形的面積
ef area():
def 計算長方形面積():
pass
def 計算正方形面積():
pass
def 計算圓形面積():
pass
代碼如下
def area(judge_type,*args):
def rectangle_area(length,wide):
return length*wide
def square_area(side_length):
return side_length**2
def circular(radius):
return 3.14*radius**2
switch = {
"長方形":rectangle_area,
"正方形":square_area,
"圓形":circular
}
if judge_type in switch:
return switch[judge_type](*args)
在python中,沒有c語言中的switch語法,如果想實現這個功能,可以通過python的字典映射功能實現
2.寫函數,傳入一個參數n,返回n的階乘
使用遞歸方法
def factorial_recursion(n): #階乘遞歸
if n == 1:
return 1
else:
return factorial_recursion(n-1)*n
遞歸的特點:
- 有明確的結束條件
- 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
- 遞歸效率低,遞歸層次過多會導致棧溢出(python遞歸層次默認最大1000層)
對於尾遞歸(遞歸條件在最後return factorial_recursion(n-1)*n
),我們可以使用循環優化效率
使用循環方法
def factorial_loop(n): #階乘循環
count = 1
for i in range(n,0,-1):
count *= i
return count
3.編寫裝飾器,爲多個函數加上認證的功能(用戶的賬號密碼來源於文件),要求登錄成功一次,後續的函數都無需再輸入用戶名和密碼
import pickle
userinfo = {
"xiao":"123",
}
def login(func):
def inner(*args,**argv):
with open("userinfo.txt","rb") as f:
userinfo = pickle.load(f)
username = input(">>:")
psword = input("ps>>:")
if username in userinfo and psword == userinfo[username]:
func(*args,**argv)
else:
print("用戶名或密碼錯誤")
return inner
@login
def sexual_online(local):
print("8s8s8s8s8s",local)
sexual_online("America")
4.寫一個日誌調用方法
通過生成器寫一個日誌調用方法, 支持以下功能
根據指令向屏幕輸出日誌
根據指令向文件輸出日誌
根據指令同時向文件&屏幕輸出日誌
以上日誌格式如下
2017-10-19 22:07:38 [1] test log db backup 3
2017-10-19 22:07:40 [2] user alex login success
代碼如下
import time
def logger(filename,channel='file'):
count = 0
def print_file():
with open(filename,"a",encoding="utf-8") as f:
f.write(s)
def print_terminal():
print(s,end="")
def print_both():
with open(filename,"a",encoding="utf-8") as f:
f.write(s)
print(s,end="")
func_dic = {
'file':print_file,
'terminal':print_terminal,
'both':print_both,
}
print_func = func_dic[channel]
while True:
msg = yield
s = "%s [%d] %s\n"%(time.strftime("%Y-%m-%d %H:%M:%S"),count,msg)
print_func()
count += 1
log_obj = logger(filename="web.log",channel='both')
log_obj.__next__()
log_obj.send('user xiao login success')
log_obj.send('user qing login success')
5.計算購買每支股票的總價
如下,每個小字典的name對應股票名字,shares對應多少股,price對應股票的價格
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]
計算購買每支股票的總價
代碼如下
print(list(map(lambda info:info['shares']*info['price'],portfolio)))
print(list(filter(lambda x:x['price'] > 100,portfolio)))
6.有名爲poetry.txt的文件,其內容如下,請刪除第三行;
昔人已乘黃鶴去,此地空餘黃鶴樓。
黃鶴一去不復返,白雲千載空悠悠。
晴川歷歷漢陽樹,芳草萋萋鸚鵡洲。
日暮鄉關何處是?煙波江上使人愁。
代碼如下
#方式一 每次從舊文件中讀取一行寫入新文件中,讀到第三行時不寫入
import os
with open("poetry1.txt","w",encoding="utf-8") as fout:
with open("poetry.txt","r",encoding="utf-8") as fin:
count = 0
for line in fin:
count += 1
if count == 3:
continue
else:
fout.write(line)
os.remove("poetry.txt")
os.rename("poetry1.txt","poetry.txt")
#os.replace("poetry1.txt","poetry.txt") #與上兩行作用一樣:刪除原poetry.txt,並重命名poetry1.txt文件爲poetry.txt
#方式二 讀取整個字符串匹配到相應行數
with open("poetry.txt","r+",encoding="utf-8") as fin:
str = fin.read()
str_list = str.split('\n')
del str_list[2]
fin.seek(0,0)
fin.truncate()
fin.write("\n".join(str_list))
7.判斷該文件中是否存在"alex"
有名爲username.txt的文件,其內容格式如下,寫一個程序,判斷該文件中是否存在"apple", 如果沒有,則將字符串"alex"添加到該文件末尾,否則提示用戶該用戶已存在;
username.txt文件內容
pizza,100001
banana,100002
pine,100003
代碼如下
with open("username.txt","r+",encoding="utf-8") as f:
str = f.read()
str_list = [ i for i in str.split('\n') if i != '']
user_dic = {i.split(',')[1].strip():i.split(',')[0].strip() for i in str_list}
user_dic['100002'] = 'alex li'
f.seek(0,0)
f.truncate()
for key,val in user_dic.items():
f.write("%s,%s\n"%(val,key))
8.寫一個計算每個程序執行時間的裝飾器
import time
def statistics_time(func):
def inner(*args,**argv):
start_time = time.time()
func(*args,**argv)
end_time = time.time()
print(start_time-end_time)
return inner
@statistics_time
def compute(a,b):
count = 0
for i in range(a):
for j in range(b):
count += i*j
print("ok")
compute(1,10)
11.題目:寫一個搖骰子游戲,要求用戶壓大小,賠率一賠一。
要求:三個骰子,搖大小,每次打印搖骰子數。
代碼如下
import random
from functools import reduce
money = 1000
choice = int(input("大(1)or 小(0)>>:"))
bet = int(input("賭注>>:"))
if bet > money:
print("你沒有那麼多錢,回去好好搬磚吧")
exit()
saizi = []
for i in range(3):
saizi.append(random.randint(1,6))
print(saizi)
judgement = reduce(lambda x,y:x+y,saizi)
result = 1 if judgement > 10 else 0
if result == choice:
print("你贏了%d元,你現在擁有%d元"%(bet,money+bet))
else:
print("你輸了%d元,你現在擁有%d元"%(bet,money-bet))