1. Python 交換兩個變量的值
答:在 Python 中交換兩個對象的值通過下面的方式即可
a , b = b ,a
但是需要強調的是這并不是元組解包,通過 dis 模塊可以發現,這是交換操作的字節碼是 ROT_TWO,意思是在棧的頂端做兩個值的互換操作。
2. 在讀文件操作的時候會使用 read、readline 或者 readlines,簡述它們各自的作用
答:.read() 每次讀取整個文件,它通常用于將文件內容放到一個字符串變量中。如果希望一行一行的輸出那么就可以使用 readline(),該方法會把文件的內容加載到內存,所以對于大文件的讀取操作來說非常的消耗內存資源,此時就可以通過 readlines 方法,將文件的句柄生成一個生產器,然后去讀就可以了。
可參考: 文獻、菜鳥教程
3. json 序列化時,可以處理的數據類型有哪些?如何定制支持 datetime 類型?
答: 可以處理的數據類型是 str、int、list、tuple、dict、bool、None, 因為 datetime 類不支持 json 序列化,所以我們對它進行拓展。
詳細知識參考:序列化
#自定義時間序列化
import json
from datetime import datetime, date#JSONEncoder 不知道怎么去把這個數據轉換成 json 字符串的時候,它就會去調 default()函數,所以都是重寫這個函數來處理它本身不支持的數據類型,
#default()函數默認是直接拋異常的。
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 序列化時,默認遇到中文會轉換成 unicode,如果想要保留中文怎么辦?
答:可以通過 json.dumps 的 ensure_ascii 參數解決,代碼示例如下:
import json
a=json.dumps({“name”:“張三”},ensure_ascii=False)
print(a)
可以參考文獻:json 中的ensure_ascii=False
5. 有兩個磁盤文件 A 和 B,各存放一行字母,要求把這兩個文件中的信息合并(按字母順序排列),輸出到一個新文件 C 中。
答:
#文件 A.txt 內容為 ASDCF
#文件 B.txt 內容為 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 的內容為 ACDEFFGGGST
6. 如果當前的日期為 20190530,要求寫一個函數輸出 N 天后的日期,(比如 N 為 2,則輸出 20190601)。
答:這個題目考察的是 datetime 里的 timedelta 方法的使用,參數可選、默認值都為 0:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) 通過這個參數可以指定不同的日期類型進行加減操作,這里我們需要改的是 days,代碼如下
import datetimedef datetime_operate(n: int):now = datetime.datetime.now() # 獲取當前時間_new_date = now + datetime.timedelta(days=n) # 獲取指定天數后的新日期new_date = _new_date.strftime("%Y%m%d") # 轉換為指定的輸出格式return new_dateif __name__ == '__main__':print(datetime_operate(4))
參考文獻:Python timedelta模塊 時間增減用法
參考二
7. 寫一個函數,接收整數參數 n,返回一個函數,函數的功能是把函數的參數和 n 相乘并把結果返回。
答:這個題目考查了閉包的使用。閉包請參考:python中的閉包
偽代碼示例如下:
def 外層函數(參數):def 內層函數():print("內層函數執行", 參數)return 內層函數內層函數的引用 = 外層函數("傳入參數")
內層函數的引用()
代碼示例如下,返回函數之類型是函數對象。
def mul_operate(num):def g(val):return num * valreturn gm = mul_operate(8)
print(m(5))
返回值為:40
8. 下面代碼會存在什么問題,如何改進?
def strappend(num):str='first'for i in range(num):str+=str(i)return str
答: 首先不應該使用 Python 的內置函數 str 作為變量名,將其改為 s,另外在Python中str 是個不可變對象,每次迭代都會生成新的存儲空間,num 越大,創建的 str 對象就會越多,內存消耗越大。
使用 yield 改成生成器即可, 還有一點就是命名規范的位置,函數名添加_分割比較好,完整的代碼如下:
def str_append(num):s = 'first'for i in range(num):s += str(i)yield sif __name__ == '__main__':for i in str_append(3):print(i)
輸出結果:
first0
first01
first012
9. 一行代碼輸出 1-100 之間的所有偶數。
答:可以通過列表生成式,然后使用與操作如果如 1 與之后結果為 0 則表明為偶數,等于 1 則為奇數。
方法1
print([i for i in range(1, 101) if i & 0x1 == 0])
方法2:測試發現方法二效率更高
print(list(range(2, 101, 2)))
10. with 語句的作用
with 語句適用于對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用后自動關閉、線程中鎖的自動獲取和釋放等。
Python之with語法原理
#一般訪問文件資源時我們會這樣處理:
f = open('c:\test.txt', 'r')
data = f.read()
f.close()
這樣寫沒有錯,但是容易犯兩個毛病:
- 如果在讀寫時出現異常而忘了異常處理。
- 忘了關閉文件句柄
#以下的加強版本的寫法:f = open('c:\test.txt', 'r')
try:data = f.read()
finally:f.close()
以上的寫法就可以避免因讀取文件時異常的發生而沒有關閉問題的處理了。代碼長了一些。但使用 with 有更優雅的寫法:
with open(r'c:\test.txt', 'r') as f:data = f.read()
11. Python 字典和 json 字符串相互轉化方法
答:
在 Python 中使用 dumps 方法 將 dict 對象轉為 Json 對象,使用 loads 方法可以將 Json 對象轉為 dict 對象。
import jsondic = {'a': 123, 'b': "456", 'c': "liming"}
# dumps:字典對象轉換成json對象
json_str = json.dumps(dic)
print(json_str)
# loads:json對象轉換成字典對象
dic2 = json.loads(json_str)
print(dic2)
輸出結果:
{"a": 123, "b": "456", "c": "liming"}
{'a': 123, 'b': '456', 'c': 'liming'}
我們再來看一個特殊的例子
import jsondic = {'a':123, 'b':"456", 'c':"liming"}
# 轉換成json格式
dic_ = str(dic).replace("'", "\"")
print(dic_)
# loads:json對象轉換成字典對象
dic_str = json.loads(dic_)
print(dic_str)
輸出結果:
{'a': 123, 'b': '456', 'c': 'liming'}
首先 json.loads(jsonstr) 這里面的參數只能是 jsonstr 格式的字符串。
當我們使用 str 將字典 dic 轉化為字符串以后,得到的結果為:"{‘a’: 123, ‘b’: ‘456’, ‘c’: ‘liming’}"。
如果直接使用 json.loads(str(dic)) 你會發現出現錯誤,原因是單引號的字符串不符合Json的標準格式。
所以再次使用了 replace("’", “”")從而得到字典,其實這個例子主要目的是告訴大家 Json 的標準格式是不支持單引號型字符串的,否則會出現以下錯誤:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)