python總結與習題(二)函數部分

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

遞歸的特點:

  1. 有明確的結束條件
  2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
  3. 遞歸效率低,遞歸層次過多會導致棧溢出(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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章