python面试题总结(7)--操作类
1. Python 交換兩個(gè)變量的值
答:在 Python 中交換兩個(gè)對(duì)象的值通過下面的方式即可
a , b = b ,a
但是需要強(qiáng)調(diào)的是這并不是元組解包,通過 dis 模塊可以發(fā)現(xiàn),這是交換操作的字節(jié)碼是 ROT_TWO,意思是在棧的頂端做兩個(gè)值的互換操作。
2. 在讀文件操作的時(shí)候會(huì)使用 read、readline 或者 readlines,簡(jiǎn)述它們各自的作用
答:.read() 每次讀取整個(gè)文件,它通常用于將文件內(nèi)容放到一個(gè)字符串變量中。如果希望一行一行的輸出那么就可以使用 readline(),該方法會(huì)把文件的內(nèi)容加載到內(nèi)存,所以對(duì)于大文件的讀取操作來說非常的消耗內(nèi)存資源,此時(shí)就可以通過 readlines 方法,將文件的句柄生成一個(gè)生產(chǎn)器,然后去讀就可以了。
可參考: 文獻(xiàn)、菜鳥教程
3. json 序列化時(shí),可以處理的數(shù)據(jù)類型有哪些?如何定制支持 datetime 類型?
答: 可以處理的數(shù)據(jù)類型是 str、int、list、tuple、dict、bool、None, 因?yàn)?datetime 類不支持 json 序列化,所以我們對(duì)它進(jìn)行拓展。
詳細(xì)知識(shí)參考:序列化
#自定義時(shí)間序列化 import json from datetime import datetime, date#JSONEncoder 不知道怎么去把這個(gè)數(shù)據(jù)轉(zhuǎn)換成 json 字符串的時(shí)候,它就會(huì)去調(diào) default()函數(shù),所以都是重寫這個(gè)函數(shù)來處理它本身不支持的數(shù)據(jù)類型, #default()函數(shù)默認(rèn)是直接拋異常的。 class DateToJson(json.JSONEncoder):def default(self, obj):if isinstance(obj, datetime):return obj.strftime('%Y-%m-%d %H:%M:%S')elif isinstance(obj, date):return obj.strftime('%Y-%m-%d')else:return json.JSONEncoder.default(self, obj)d = {'name': 'cxa', 'data': datetime.now()} print(json.dumps(d, cls=DateToJson))4. json 序列化時(shí),默認(rèn)遇到中文會(huì)轉(zhuǎn)換成 unicode,如果想要保留中文怎么辦?
答:可以通過 json.dumps 的 ensure_ascii 參數(shù)解決,代碼示例如下:
import json
a=json.dumps({“name”:“張三”},ensure_ascii=False)
print(a)
可以參考文獻(xiàn):json 中的ensure_ascii=False
5. 有兩個(gè)磁盤文件 A 和 B,各存放一行字母,要求把這兩個(gè)文件中的信息合并(按字母順序排列),輸出到一個(gè)新文件 C 中。
答:
#文件 A.txt 內(nèi)容為 ASDCF #文件 B.txt 內(nèi)容為 EFGGTG with open("A.txt") as f1:f1_txt = f1.readline() with open("B.txt") as f2:f2_txt = f2.readline() f3_txt = f1_txt + f2_txtf3_list = sorted(f3_txt)with open("C.txt", "a+") as f:f.write("".join(f3_list))輸出的文件 C 的內(nèi)容為 ACDEFFGGGST
6. 如果當(dāng)前的日期為 20190530,要求寫一個(gè)函數(shù)輸出 N 天后的日期,(比如 N 為 2,則輸出 20190601)。
答:這個(gè)題目考察的是 datetime 里的 timedelta 方法的使用,參數(shù)可選、默認(rèn)值都為 0:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) 通過這個(gè)參數(shù)可以指定不同的日期類型進(jìn)行加減操作,這里我們需要改的是 days,代碼如下
import datetimedef datetime_operate(n: int):now = datetime.datetime.now() # 獲取當(dāng)前時(shí)間_new_date = now + datetime.timedelta(days=n) # 獲取指定天數(shù)后的新日期new_date = _new_date.strftime("%Y%m%d") # 轉(zhuǎn)換為指定的輸出格式return new_dateif __name__ == '__main__':print(datetime_operate(4))參考文獻(xiàn):Python timedelta模塊 時(shí)間增減用法
參考二
7. 寫一個(gè)函數(shù),接收整數(shù)參數(shù) n,返回一個(gè)函數(shù),函數(shù)的功能是把函數(shù)的參數(shù)和 n 相乘并把結(jié)果返回。
答:這個(gè)題目考查了閉包的使用。閉包請(qǐng)參考:python中的閉包
偽代碼示例如下:
代碼示例如下,返回函數(shù)之類型是函數(shù)對(duì)象。
def mul_operate(num):def g(val):return num * valreturn gm = mul_operate(8) print(m(5))返回值為:40
8. 下面代碼會(huì)存在什么問題,如何改進(jìn)?
def strappend(num):str='first'for i in range(num):str+=str(i)return str答: 首先不應(yīng)該使用 Python 的內(nèi)置函數(shù) str 作為變量名,將其改為 s,另外在Python中str 是個(gè)不可變對(duì)象,每次迭代都會(huì)生成新的存儲(chǔ)空間,num 越大,創(chuàng)建的 str 對(duì)象就會(huì)越多,內(nèi)存消耗越大。
使用 yield 改成生成器即可, 還有一點(diǎn)就是命名規(guī)范的位置,函數(shù)名添加_分割比較好,完整的代碼如下:
輸出結(jié)果:
first0 first01 first0129. 一行代碼輸出 1-100 之間的所有偶數(shù)。
答:可以通過列表生成式,然后使用與操作如果如 1 與之后結(jié)果為 0 則表明為偶數(shù),等于 1 則為奇數(shù)。
方法1
print([i for i in range(1, 101) if i & 0x1 == 0])方法2:測(cè)試發(fā)現(xiàn)方法二效率更高
print(list(range(2, 101, 2)))10. with 語句的作用
with 語句適用于對(duì)資源進(jìn)行訪問的場(chǎng)合,確保不管使用過程中是否發(fā)生異常都會(huì)執(zhí)行必要的“清理”操作,釋放資源,比如文件使用后自動(dòng)關(guān)閉、線程中鎖的自動(dòng)獲取和釋放等。
Python之with語法原理
這樣寫沒有錯(cuò),但是容易犯兩個(gè)毛病:
以上的寫法就可以避免因讀取文件時(shí)異常的發(fā)生而沒有關(guān)閉問題的處理了。代碼長(zhǎng)了一些。但使用 with 有更優(yōu)雅的寫法:
with open(r'c:\test.txt', 'r') as f:data = f.read()11. Python 字典和 json 字符串相互轉(zhuǎn)化方法
答:
在 Python 中使用 dumps 方法 將 dict 對(duì)象轉(zhuǎn)為 Json 對(duì)象,使用 loads 方法可以將 Json 對(duì)象轉(zhuǎn)為 dict 對(duì)象。
import jsondic = {'a': 123, 'b': "456", 'c': "liming"} # dumps:字典對(duì)象轉(zhuǎn)換成json對(duì)象 json_str = json.dumps(dic) print(json_str) # loads:json對(duì)象轉(zhuǎn)換成字典對(duì)象 dic2 = json.loads(json_str) print(dic2)輸出結(jié)果:
{"a": 123, "b": "456", "c": "liming"} {'a': 123, 'b': '456', 'c': 'liming'}我們?cè)賮砜匆粋€(gè)特殊的例子
import jsondic = {'a':123, 'b':"456", 'c':"liming"} # 轉(zhuǎn)換成json格式 dic_ = str(dic).replace("'", "\"") print(dic_) # loads:json對(duì)象轉(zhuǎn)換成字典對(duì)象 dic_str = json.loads(dic_) print(dic_str)輸出結(jié)果:
{'a': 123, 'b': '456', 'c': 'liming'}首先 json.loads(jsonstr) 這里面的參數(shù)只能是 jsonstr 格式的字符串。
當(dāng)我們使用 str 將字典 dic 轉(zhuǎn)化為字符串以后,得到的結(jié)果為:"{‘a(chǎn)’: 123, ‘b’: ‘456’, ‘c’: ‘liming’}"。
如果直接使用 json.loads(str(dic)) 你會(huì)發(fā)現(xiàn)出現(xiàn)錯(cuò)誤,原因是單引號(hào)的字符串不符合Json的標(biāo)準(zhǔn)格式。
所以再次使用了 replace("’", “”")從而得到字典,其實(shí)這個(gè)例子主要目的是告訴大家 Json 的標(biāo)準(zhǔn)格式是不支持單引號(hào)型字符串的,否則會(huì)出現(xiàn)以下錯(cuò)誤:
總結(jié)
以上是生活随笔為你收集整理的python面试题总结(7)--操作类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 变量太多太复杂该怎么得出结论?——SPS
- 下一篇: 计算机操作系统指导书,《计算机操作系统》