# _*_ coding:utf-8 _*_"""老男孩教育python學院第二次考試(基礎數據類型與函數部分)考試時長:3個小時 滿分:100分一,選擇題(每題2分,共30分)一、如下說法正確的是: DA、Python中str的單引號與雙引號有區別B、python3x版本默認編碼方式爲unicode。C、Python設置變量能夠爲and。D、Python3x版本中的input輸入的字符串類型。二、此代碼的運行結果爲:while flag: A print(1) print(2) flag = False print(4) A、1 2 B、1 2 1 2..... C、1 2 4 D、1 2 4 1 2 4........三、下面代碼的結果爲:Dname = ‘alex’a = ‘3’print(name*a)A、alexalexalex B、 alex3 C、3alex D、TypeError四、如下說法錯誤的是:DA、ASCII碼只包含數字,字母,特殊字符。B、unicode有兩個版本,第一個版本是一個字符用兩個字節表示,第二個版本是一個字符用四個字節表示。C、utf-8中,一個字節用三個字符表示。D、gbk只包含英文,數字,特殊字符,和中文。五、計算一下這個不等式的結果: D1 > 2 and 3 or 6A、True B.False C. 3 D.6六、‘老男孩’用utf-8編碼須要幾個字節表示? CA、3 B、6 C、9 D、12七、在Python3x中:a = b‘alex’,如何將a轉化成 ‘alex’? BA、a.encode(‘utf-8’) B、a.decode() C、bytes(a) D、str(a)八、count在內存中最終等於: Ccount = 1 while count < 9: print(count) count += 1A.7 B.8 C.9 D.6九、如下敘述正確的是:BA、continue語句的做用是結束整個循環的執行B、只能在循環體內使用break語句C、在循環體內使用break語句或continue語句的做用相同D、從多層循環嵌套中退出時,只能使用quit語句十、a = ‘老男孩教育’,a[:6]的結果爲: AA、‘老男孩教育’ B、‘’ C、TypeError D、‘老男孩教育老男’十一、下列說法正確的是(多選) : A BA,字符串的capitalize()爲首字母大寫,其他字母小寫。B,列表的pop爲經過索引刪除,且有返回值。C,字典的remove爲經過鍵刪除字典的鍵值對。D,元組爲只讀列表,只能進行增和查。十二、下列表達正確的是(多選):B C DA、字典中的keys()方法是將字典的全部鍵都存放至一個列表中。B、給一個列表extend(‘ab3’)其實是添加了a,b,3三個字符串。C、s1=‘alex@’,s2=‘alex@’,print(s1 is s2) 爲True。D、‘abc’.encode(‘utf-8’).decode(‘gbk’) 結果爲‘abc’。1三、下列表達正確的是(多選):B CA、a =(1,) a爲int類型。B、l1 = [1,2,3] l2 = l1 l1.append(666) print(l2)結果爲[1,2,3,666]C、l1 = [22,33,44] l2 = l1[:] l1與l2的關係爲淺copy。D、集合是無序的不重複的,裏面的元素要求是不可哈希的。1四、選出你認爲正確的答案(多選):B DA、在文件操做中,r+模式只能讀寫,不能寫讀。B、函數是以功能爲導向的。C、文件操做中,將光標移動至末尾是seek(0,1)。D、函數的*args在默認參數前面。1五、下列說法正確的是(多選):B DA、函數的return的是將值返回給函數名。B、函數的實參的位置參數在關鍵字參數前面。C、全局做用域包含內置名稱空間和局部名稱空間。D、函數名被視爲第一類對象。二,填空題(10分)。def calc(a, b, c, d=1, e=2): return a + b + c - d - e請分別寫出下列標號代碼的輸出結果,若是出錯請寫出Error。print(calc(1, 2, 3, 4, 5))___ - 3__print(calc(1, 2))__TypeError__print(calc(e=4, c=5, a=2, b=3))___5print(calc(1, 2, 3))_____3print(calc(1, 2, 3, d=5, 4))____SyntaxError_獲取list的元素個數,和向末尾追加元素所用的方法是___append_, ____.extend不依賴中間變量,交換變量a和b的值得表達式是________a, b = b, a_________________.list = [1, 2, 3, 4, 5]print(list[10:])答案是什麼?______[]______.如何經過一行語句建立一個這樣的字典{1: 'alex', 2: 'alex', 3: 'alex'}?不能直接寫dic = {1: 'alex', 2: 'alex', 3: 'alex'})____________________________.dd = eval("{1: 'alex', 2: 'alex', 3: 'alex'}")三,簡答題(共20分)一、 is 和 == 的區別 (1分)== 值is對象二、Python如何實現tuple和list的轉換。(1分)tl = tuple(l1)lt = list(tl)三、list和tuple有什麼不一樣 (1分)list可變,不可哈希,不可比較,tuple不可變,可哈希,可比較,查詢速度較快四、*args和 ** kwargs在什麼狀況下會使到?請給出使 ** kwargs的事例(2分)*args位置參數不肯定數量, ** kwargs默認參數不肯定數量五、Python中什麼數據類型存在小數據池?小數據池有什麼做用?(1分)str: 1)不能含有特殊字符2)單個元素 * int不能超過21, 節省內存六、在Python3x版本中,s1 = ‘老男孩’,如何將s1轉化成utf - 8的bytes類型?轉化成功以後,獲得了s2,如何將s2轉化成gbk的bytes類型(請寫出具體代碼)?(2分)s1 = '老男孩's2 = s1.encode(encoding='utf-8')print(s2)s3 = s2.decode(encoding='utf-8').encode(encoding='gbk')print(s3)七、下面代碼有沒有問題?若是有問題請指出來(2分)?f = open('a.txt', encoding='utf-8')f.write('666')默認讀模式打開文件,不能寫入,不然會拋出異常八、l = [1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8]將此列表去重。(1分)l = list(set(l))九、有以下代碼,寫出最後結果,並解釋爲何。(2分)l1 = [1, [22, 33, 44], 3, 4, ]l2 = l1l3 = l1.copy()l1.append(666)l1[1].append('55')Print(l1, l2, l3)[1, [22, 33, 44, '55'], 3, 4, 666][1, [22, 33, 44, '55'], 3, 4, 666][1, [22, 33, 44, '55'], 3, 4]l2和l1指向同一個對象故l2和l1結果同樣l3和l1是淺COPY,因此666沒有添加成功十、‘1, 2, 3’如何變成[‘1’, ’2’, ’3’]? [‘1’, ’2’, ’3’]如何變成[1, 2, 3]?(寫具體代碼)(2分)"""print('1,2,3'.split(','))print(','.join(['1', '2', '3']))"""十一、什麼是閉包(closure),爲何要用它?(2分)閉包:內層函數對外層函數非全局變量的引用12,global有什麼用?nonlocal又是幹什麼的?(2分)global 實現引用並修改全局變量nonlocal不能操做全局變量從哪層引用的從那層開始所有改變"""#13,如何終止while循環?(1分)#break"""四,編程題。一、有文件t1.txt裏面的內容爲:(6分)1, alex, 22, 13651054608, IT2, wusir, 23, 13304320533, Tearcher3, taibai, 18, 1333235322, IT利用文件操做,將其構形成以下數據類型。[{'id': '1', 'name': 'alex', 'age': '22', 'phone': '13651054608', 'job': 'IT'}, ......]"""with open('t1.txt') as ff: l1 = [] for l in ff.readlines(): d = {} s = l.strip().split(',') print(s) for n in range(len(s)): d[s[n]] = s[n] l1.append(d)print(l1)"""二、寫函數,完成如下功能:(6分)用戶將文件名(文件前提必須存在),操做方法(只有r, w, a三種)傳入此函數,此函數按照傳入的參數完成相應的操做。例如:"""def func(path, mode, *args): pass"""func(‘a.txt’, ’r’) 此函數完成的就是以讀的模式打開a.txt文件,並打印出來。func(‘a.txt’, ’w’, ’老男孩教育’)此函數完成的就是以寫的模式打開a.txt文件,將內容寫入。func(‘a.txt’, ’a’, ’老男孩教育’)此函數完成的就是以追加的模式打開a.txt文件,將內容追加。"""def func(path, mode, text=None): try: f = open(path, mode) except: print('Can not find file') dirc = { 'w': f.write, 'r': f.read, 'a': f.write } if (mode in list(dirc.keys())): if (dirc.get(mode)): return dirc.get(mode)(text) if text else dirc.get(mode)() f.close() else: print('not support mode')print(func('a.txt', 'w', '老男孩教育'))print(func('a.txt', 'a', '老男孩教育'))print(func('a.txt', 'r'))"""三、寫函數完成如下功能:(6分)給函數傳入一個列表(此列表裏面的元素必須所有是str類型),將列表中的每一個元素按照順序依次加上他們的索引,造成新的元素,並添加到一個新列表,將新列表返回。例如:給函數傳入一個列表[‘alex’, ’太白’],返回值爲[‘alex0’, ’太白1’]"""def indexlist(s): return [str(i) + s[i] for i in range(len(s))]#4,寫一個函數,完成註冊的功能,將用戶名,密碼寫入到文件中(用戶名不能重複,若是重複提示他從新輸入)。再寫一個函數,完成三次登陸功能,帳號密碼從註冊的文件中獲取。(12#分)import timestatus_dict={ 'username':None, 'status':False,}def wrapper_log(l): #日誌裝飾器,用於打印用戶訪問3~6功能日誌。 def inner_log(*args,**kwargs): re = l(*args,**kwargs) while True: with open("log", encoding="utf-8", mode="a") as f2: f2.write("\n用戶: %s 在 %s 執行了 %s 函數,訪問頁面時,頁面內容爲:歡迎%s用戶訪問 %s" % \ (status_dict["username"], time.strftime("%Y-%m-%d %H:%M:%S"),l.__name__,status_dict["username"],choice_dict[choice][0])) return True return re return inner_logdef wrapper_login(loging): #登錄認證裝飾器,用於若是用戶沒有登錄選擇3~6功能會提醒用戶進行登錄。 def inner_loging(*args,**kwargs): reg = loging(*args, **kwargs) if status_dict["username"] is not None and status_dict["status"] == True: print("歡迎"+status_dict["username"]+"用戶,訪問"+choice_dict[choice][0]+"") else: print("您尚未登錄,不能使用此模塊。") return False return reg return inner_logingdef login(): #登錄函數 i = 0 while i < 3: username = input('請輸入用戶名:').strip() password = input('請輸入密碼:').strip() if status_dict["username"] is not None and status_dict["status"] == True: print("用戶"+status_dict["username"]+"已登錄,請註銷後從新登錄。") break with open('register',encoding='utf-8') as f1: for line in f1: line_list = line.strip().replace(',', ',').split(',') if username == line_list[0] and password==line_list[1]: print('登陸成功...') status_dict['username'] = username status_dict['status'] = True return True else: print('帳號或者密碼不正確,請從新輸入') i += 1 if i == 3: exit()def regiter(*args,**kwargs): #註冊函數 while True: username = input('請輸入註冊用戶名:').strip() password = input('請輸入用戶名密碼:').strip() with open('register',encoding='utf-8') as f1: for line in f1: line_list = line.strip().replace(',', ',').split(',') if username == line_list[0]: print('用戶名存在,請從新輸入!') break else: with open('register',encoding='utf-8',mode='a') as f2: f2.write('\n{},{}'.format(username,password)) print('註冊成功') return True#調用裝飾器@wrapper_login@wrapper_logdef article_page(): #文章頁面函數 print("請編輯文章。")@wrapper_login@wrapper_logdef diary_page(): #日誌頁面函數 print("請編輯日誌。")@wrapper_login@wrapper_logdef comment_page(): #評論頁面函數 print("請評論。")@wrapper_login@wrapper_logdef collection_page(): #收藏頁面函數 print("請收藏")def logout(): #註銷函數 print("確認註銷%s用戶?輸入y註銷用戶,輸入n返回。" % status_dict["username"]) while True: user_choice = input("請輸入選項:") if user_choice == "y": status_dict["username"] = None status_dict["status"] = False print("註銷成功,已返回登錄界面。") login() return True elif user_choice == "n": return False else: print("您輸入的選項不正確,請從新輸入。")def exit_program(): #退出程序函數 print("確認要退出程序?輸入y退出,輸入n返回。" % status_dict["username"]) while True: user = input("請輸入選項:") if user == "y": print("退出程序成功。") exit() elif user == "n": return False else: print("您輸入的選項不正確,請從新輸入。")choice_dict = { 1: ['登陸', login], 2: ['註冊', regiter], 3: ['文章頁面',article_page], 4: ['日記頁面', diary_page], 5: ['評論頁面', comment_page], 6: ['收藏頁面', collection_page], 7: ['註銷', logout], 8: ['退出程序',exit_program],}while True: print("歡迎來到博客園") for (k, v) in choice_dict.items(): print(k, v[0]) choice = input("請輸入選項:") if choice.isdigit(): choice = int(choice) if 0 < choice< len(choice_dict)+1: choice_dict[choice][-1]() continue else: print("超出範圍,請從新輸入!")