標籤:並且 而在 文法 encoding 解決 函數 讀檔案 需要 報錯
補充內容:
eval 將字串變成變數名
locals 看輸入的是否是字典中的一個key
func.__name____怎麼看變數名的資料類型
斐波那契數列
li=[1,1]
while li[-1]<1000000:
li.append(li[-1]+li[-2])
print(li)
li=[1,1]
while len(li)<50:
li.append(li[-1]+li[-2])
print(li)
最後兩個數相加變成下個數,判斷什麼時候停下來
員工資訊系統編譯思路
在編譯器之前,先將使用者的需求考慮清楚,然後開始判斷從哪方面先入手。
因為函數裝飾器比較好寫,並且大體都要用在裝飾函數上,所以決定最後搞定。
先編寫了一個介面,方便使用者操作,讓使用者根據介面上的操作提醒來進行操作。
大致的編寫思路就是講功能列出,然後添加一個退出,用來代表程式的全部功能和結束。用input來進行使用者的指令輸入
寫完介面之後就可以注釋了,方便接下來的編譯
先進行查詢功能的編譯。寫了一個函數首先要想到的就是從檔案中取出資料來,
這樣,我就先將檔案開啟然後取出資料,然後根據使用者需求的公式,來進行使用者指令的擷取,
根據使用者的指令,將得到的資料進行判斷,比如當*和job是否在資料中時才進行下一項程式,將資料取出之後判斷是否與查詢條件相符合,然後輸出查詢結果。
這部分代碼編寫時主要的難度就是使用者指令中真正意圖和關鍵字的擷取,還有利用關鍵字對資料進行判斷,要思考怎樣才能取出使用者需要的資料。
根據使用者的需求,一共有三種文法,那麼久進行逐一編寫,全部拿來與取出的資料進行對比,在這裡用的方法是如果使用者查詢的資料在資料line裡面就取出這一條line
接下來開始寫建立
在寫建立之前也是先要開啟檔案,這時候要想的是建立新資料的話,肯定就是檔案操作中的追加。然後根據這個思路進行編寫
痛點在於添加資料時候要按照編號,我的方法是令i初始值為,然後每次迴圈line資料,就令i+1並且將這個i添加到列表li中,然後最後取出列表的最後一個值,也就是上一條資料的值了,然後將他+1就是下一條資料的ID
有個困難就是追加的話是不帶換行的,直接在上一條資料後面進行添加,所以每次添加都要在前面加一個\n,然而在刪除資料的時候,這種方法的弊端也出現了
因為每次刪除資料是不會刪除\n的,所以每次添加資料都會多隔一行,然後擷取資料的ID是根據行來判斷數位,這樣數字就會發生混亂。發生了這個bug之後開始思考解決辦法。
最後的解決辦法是加一個判斷,如果上一條資料中沒有\n的話就添加\n,也就是說第一次添加的時候會有一個\n嚇一跳資料添加時候如果上一行裡面有\n也就是刪除資料沒有刪去的\n就不添加\n的話就添加\n,也就是說第一次添加的時候會有一個\n嚇一跳資料添加時候如果上一行裡面有\n也就是刪除資料沒有刪去的\n就不添加\n
解決了問題
然後就是刪除資料
刪除員工資訊使用者的需求是按員工資訊的ID,這樣的話就要將重心放在資訊的首位,也就是ID上,所以每次迴圈資訊的時候,倒要取這列資料的頭一個資料,也就是ID來進行判斷
我的方法是取出資料之後如果和使用者輸入的需求ID相同,那就刪除他,然後重新寫一個檔案,上述方法也是一樣,每次修改了資料,除了建立和查詢,都是要在結尾將這個檔案刪除,重新建立一個同名檔案進行更新
當然,一個檔案更新完了,改名成修改資料的檔案,那麼這個檔案就不存在,下次操作就會報錯。所以在結尾又會添加一個相同的檔案,預備下次操作的更新
最後一個寫的修改,同樣,也是讀檔案拿出 資料,然後判斷使用者輸入的條件是否在這列資料中,如果在的話就可以用,用字串修改方法,將使用者條件替換舊的資訊。
同樣建立新檔案改名,移除舊的,編譯完成。
最後就是編譯器了,用文法糖每個都添加,然後寫登入程式,利用改變全域變數的方法,就可以完成使用者需求。
f = open(‘使用者登入‘,‘r‘,encoding=‘utf-8‘)
m = f.read() //擷取檔案中使用者資訊
f.close()
a,b = m.split(‘\n‘) //使用者名稱和密碼分割
flag=1
def yanzheng(func):
def inner(*args,**kwargs):
global flag //聲明改變全域變數
if flag==1: //第一次進來全域變數為1
while True:
n =input(‘請輸入使用者名稱‘)
if n ==a:
while True:
z = input(‘請輸入密碼‘)
if z == b:
print(‘驗證成功‘)
func(*args, **kwargs)
flag =2 //驗證成功的話全域變數變成2
break
else:
print(‘密碼錯誤‘)
break
else:
print(‘使用者名稱錯誤‘)
else:
func(*args, **kwargs) //全域變數變成2,這樣第二次往後的判斷就會直接走else
return inner
@yanzheng
def jisuan():
for i in range(0,10):
print(i)
@yanzheng
def shuchu():
print(‘老闆‘)
jisuan()
shuchu()
利用全域變數的特點,global修改全域變數下次再進來的時候全域變數已經變了,函數中添加全域變數的判斷
然後根據條件來判斷是否需要再次進行登入程式。
python學習day13一周總結補充+員工資訊系統編寫