函數、裝飾器、叠代器、內置方法總練習題
函數基礎:
1.寫函數,計算傳入數字參數的和。(動態傳參):用不固定參數的*args不限定輸入的參數,然後用for循環把每個元素加到一起,函數裏的args不用加*
def sum1(*args):
j = 0
for i in args: # 不固定參數輸入元祖後,調用不需要加*
j = j + i
print(j)
sum1(1,2,3,4,5,6)
2.寫函數,用戶傳入修改的文件名,與要修改的內容,執行函數,完成整個文件的批量修改操作:原來打算打開文件後,遍歷每行數據,每行數據為字符串S--》每行數據用,分割成元素為字符串的列表A--》判斷是否需要修改--》修改後賦值給原來的列表A--》再把列表A用‘,’.join(list)轉成也就是原來的字符串S--》再用seek,truncate寫回原來文件。
也就是說不用弄一個空列表就能實現修改信息寫回文件,然而寫的時候發現問題出在--》修改後賦值給原來的列表A 這裏,要賦值就要再用一次循環,然後用到枚舉enumerae來定位索引值,而枚舉列表的元素類型為str,剛好原來列表A的元素也是字符串,字符串是不可變的元素,不能通過枚舉索引修改元素,所以還是得弄一個空列表l,把修改後的信息加到空列表l裏--》做完後感覺用字典的話應該不用像列表一樣做這麽多for循環,因為字典索引是用key,賦值不用index索引去找
用到的東西:str.split(‘,‘),list.append(str),文件寫入方法(for i in list ,f.write(‘\n),seek(0),truncate()),for index,i in enuerate(list) -->if correction-->list[index] = i
def file_change(filename,newinfo,oldinfo):
f = open(filename,‘r+‘)
d = f.readlines() # 信息變成列表,元素是一個一個的字符串,一個字符串就是一行
l = []
n = 0
for i in d:
for i1, e in enumerate(i): # 在d裏i是每行信息字符串的列表i
e = i.split(‘,‘) # 把每行信息字符串變成以,隔開的列表e
# print(i)
for index2,j in enumerate(e):
if j == oldinfo:
j = newinfo # 每個小的字符串檢查,如果有符合的替換掉
e[index2] = j # 通過索引方式把修改後的值賦值回遍歷的列表e
n += 1 # 加一個功能,計算修改的次數
e2 = ‘,‘.join(e) # 把列表e用,重新組成字符串e2
l.append(e2) # 把e2加到空列表l
# print(l)
f.seek(0)
f.truncate() # 清空文件內容
f = open(filename, ‘w‘)
for k in l:
f.write(‘{}\n‘.format(k)) # 把i信息重新寫入
f.close()
file_change(‘D:test.txt‘,‘AAA‘,‘BBB‘)
3.寫函數,檢查用戶傳入的對象(字符串、列表、元組)的每一個元素是否含有空內容。:all(),any()只能判斷可叠代對象
def check(n):
print(‘沒有空內容‘) if all(n) else print(‘有空內容‘)
check(None)
TypeError: ‘NoneType‘ object is not iterable
4.寫函數,檢查傳入字典的每一個value的長度,如果大於2,那麽僅保留前兩個長度的內容,並將新內容返回給調用者。
用到:dict.keys(),dict.values(),dict.items()--K,V
dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
def check(i):
for k,v in i.items():
if len(v) > 2:
i[k] = v[:2]
print(i)
check(dic)
答案用的return i和else continue有什麽作用?不用輸出也是一樣
解釋閉包的概念
不懂,回去再看一遍
函數、裝飾器、叠代器、內置方法總練習題