python作業03-文件操作&函數(未完成)
一、文件處理相關 |
1、編碼問題
(1)請說明python2 與python3中的默認編碼是什麽?
答:Python2是ascii python3是utf-8
(2)為什麽會出現中文亂碼?你能列舉出現亂碼的情況有哪幾種?
答:中文出現亂碼都是由於文件編碼導致的。
(3)如何進行編碼轉換?
答:對文件先decode為unicode,再encode為需要轉換的編碼。
(4)#-*-coding:utf-8-*- 的作用是什麽?
答:告訴解釋器這個文件的編碼格式是utf-8
(5)解釋py2 bytes vs py3 bytes的區別
答:python3把字符串的編碼改成了unicode, 還把str和bytes做了明確區分, str就是unicode格式的字符,bytes是單純二進制。
在python2裏,bytes == str
2、文件處理
(1)r和rb的區別是什麽?
答:r是文本只讀模式
rb:二進制只讀模式,無法指定encoding,因為在該模式下數據讀到內存裏直接是bytes格式,如要查看內容還需手動decode
(2)解釋一下以下三個參數的分別作用
open(f_name,‘r‘,encoding="utf-8")
答:f_name將打開的當前目錄文件名,r:文本只讀模式,encoding="utf-8":指定打開文件為utf-8編碼模式。
二、函數基礎 |
1、寫函數,計算傳入數字參數的和。(動態傳參)
def func(*args): list1= [] sum_data = 0 for i in args: list1.append(i) sum_data += i print(list1) print(sum_data) func(313, 213, 12, 1234, 453, 56)
2、寫函數,用戶傳入修改的文件名,與要修改的內容,執行函數,完成整個文件的批量修改操作
def file_modify(filename, old, new): import os f = open(filename, mode=‘r+‘, encoding=‘utf-8‘) new_f = open(filename+"_bak", mode=‘w‘, encoding=‘utf-8‘) for line in f: if old in line: line = line.replace(old,new) new_f.write(line) os.remove(filename) os.rename(filename+"_bak",filename) file_modify(‘aaaa.txt‘, ‘ddd‘, ‘goodman‘)
3、寫函數,檢查用戶傳入的對象(字符串、列表、元組)的每一個元素是否含有空內容。
def func(args): n = 0 for i in args: if i == "": n += 1 print("有%s個空內容"%n) func((1, ‘‘, 2, 44, ‘‘, 12))
4、寫函數,檢查傳入字典的每一個value的長度,如果大於2,那麽僅保留前兩個長度的內容,並將新內容返回給調用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
def func(args_dic): for i in args_dic: if len(args_dic[i]) > 2: item = args_dic[i][0:2] # 前兩項 args_dic[i] = item print(args_dic) dic = {"k1": "v1v1", "k2": [11,22,33,44]} func(dic) # {‘k1‘: ‘v1‘, ‘k2‘: [11, 22]}
5、解釋閉包的概念
答:在一個外函數中定義了一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。
三、函數進階 |
1、寫函數,返回一個撲克牌列表,裏面有52項,每一項是一個元組
例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃A’)]
def poker(): a = [‘紅心‘, ‘草花‘, ‘方片‘, ‘黑桃‘] b = [2, 3, 4, 5, 6, 7, 8, 9, 10] c = [‘J‘, ‘Q‘, ‘K‘, ‘A‘] li = [] for i in b: for j in a: item = (j,i) li.append(item) for m in c: for n in a: item2 = (n+m) li.append(item2) print(li) print(len(li)) poker()
2、寫函數,傳入n個數,返回字典{‘max’:最大值,’min’:最小值}
例如:min_max(2,5,7,8,4)
返回:{‘max’:8,’min’:2}
def min_max(*args): # dict形式 li = [] for i in args: li.append(i) li.sort() dic = {‘max‘:li[-1], ‘min‘:li[0]} print(dic) min_max(2,5,7,8,4) # 輸出:{‘max‘: 8, ‘min‘: 2}
3、寫函數,專門計算圖形的面積
其中嵌套函數,計算圓的面積,正方形的面積和長方形的面積
調用函數area(‘圓形’,圓半徑) 返回圓的面積
調用函數area(‘正方形’,邊長) 返回正方形的面積
調用函數area(‘長方形’,長,寬) 返回長方形的面積
def area(type, *args): def rectangle(length, wide): return "長方形面積", length*wide def square(length): return "正方形面積", length**2 def circlar(radius): import math return "圓形面積", math.pi*(radius**2) if type in locals(): return eval(type)(*args) print(area(‘rectangle‘, 133, 4)) print(area(‘circlar‘, 20)) print(area(‘square‘, 10))
4、寫函數,傳入一個參數n,返回n的階乘
例如:cal(7)
計算7*6*5*4*3*2*1
def cal(n): item = 1 if int(n) == n: li = range(n+1) for i in li: if i == 0: pass else: item = item*i print(item) else: return "%s不是整數"%n cal(3) # 法二: def cal(n): result=1 for i in range(n, 0, -1): # 倒序 result=result*i return result print(cal(7))
5、編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源於文件),要求登錄成功一次,後續的函數都無需再輸入用戶名和密碼
user_db = { ‘hqs‘:‘123‘, ‘susiff‘:‘123‘, ‘guangfa‘:‘123‘ } with open(‘db.txt‘, ‘w‘, encoding=‘utf-8‘) as f: f.write(str(user_db)) login_db = {‘user‘: None, ‘status‘: False} db_path = r‘db.txt‘ def login(func): def inner(*args,**kwargs): if login_db[‘user‘] and login_db[‘status‘]: res = func(*args, **kwargs) return res user = input(‘input user:‘) passwd = input(‘input passwd:‘) with open(db_path, ‘r‘, encoding=‘utf-8‘) as f: user_db2 = eval(f.read()) if user in user_db2 and passwd == user_db2[user]: print(‘login ok‘) login_db[‘user‘] = user login_db[‘status‘] = True res = func(*args, **kwargs) return res else: print(‘login error‘) return inner # 加括號執行,不加括號返回內存地址 @login def home(): print("首頁".center(40,‘-‘)) @login def america(name): print("歐美專區".center(40,‘-‘)) home() america(‘hqs‘)
四、生成器和叠代器 |
1、生成器和叠代器的區別?
可以被next()函數調用並不斷返回下一個值的對象稱為叠代器(Iterator).
在Python中,可以在循環過程中不斷推算後續元素,這種一邊循環一邊計算的機制,稱為生成器(generator)。
生成器是叠代器的一種:
1、生成器都是叠代器對象,但list\dict\str雖然是可叠代對象,但不是叠代器。
2、把list\dict\str等可叠代對象變成叠代器可以使用iter()函數
2、生成器有幾種方式獲取value?
next:喚醒生成器並繼續執行
send("stop"):
1.喚醒並繼續執行
2.發送一個信息到生成器內部
3、通過生成器寫一個日誌調用方法, 支持以下功能
- 根據指令向屏幕輸出日誌
- 根據指令向文件輸出日誌
- 根據指令同時向文件&屏幕輸出日誌
-
以上日誌格式如下
2017-10-19 22:07:38 [1] test log db backup 3 2017-10-19 22:07:40 [2] user alex login success #註意:其中[1],[2]是指自日誌方法第幾次調用,每調用一次輸出一條日誌
python作業03-文件操作&函數(未完成)