前言
網上有大量的基礎面試題目,但是通過面試python后台開發,掌握的一些基礎面試題,覺得有必要整理出來,以便日后查閱;
正文
一、面試基礎題目;
1、可迭代對象、迭代器與生成器的區別?
(1)迭代器就是用於迭代操作的對象,可以記住遍歷位置,迭代器基本方法有iter()和next();
(2)生成器是一種特殊的迭代器,返回值不通過return而是通過yield;
(3)使用iter內置函數可以獲取迭代器的對象。如果對象實現了能返回迭代器的__iter__方法,那么對象就是可迭代的;
拓展:
1)斐波那契列為例實現一個迭代器:
class Fib: def __init__(self, n): self.prev = 0 self.cur = 1 self.n = n def __iter__(self): return self def __next__(self): if self.n > 0: value = self.cur self.cur = self.cur + self.prev self.prev = value self.n -= 1 return value else: raise StopIteration() # 兼容python2 def __next__(self): return self.next() f = Fib(10) print([i for i in f]) #[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
2)什么是Python 生成器?
用關鍵字 yield 來返回值,這種函數叫生成器函數,函數被調用時會返回一個生成器對象,生成器本質上還是一個迭代器;
>>> def func(n): ... yield n*2 ... >>> func <function func at 0x00000000029F6EB8> >>> g = func(5) >>> g <generator object func at 0x0000000002908630> >>>
func 就是一個生成器函數,調用該函數時返回對象就是生成器 g ,這個生成器對象的行為和迭代器是非常相似的,可以用在 for 循環等場景中;注意 yield 對應的值在函數被調用時不會立刻返回,而是調用next方法時(本質上 for 循環也是調用 next 方法)才返回。
2、redis知識點?
(1)Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日志型、Key-Value數據庫,並提供多種語言的API;
3、三次握手四次揮手?
4、進程與線程的區別?
(1)一個進程可以管理一個及一個以上的線程;
(2)一個進程相當於一個應用程序,一個線程相當於一個應用程序的一個功能分支;
5、python里面使用線程的缺點?
(1)GIL導致python無法使用到計算機的多核,僅能使用單核;
(2)python想要提高效率,可以使用多個進程,不要使用多個線程;
6、GIL鎖什么時候會釋放?
(1)當線程等待結果的時候會釋放GIL;
(2)在IO操作等可能會引起阻塞的system call之前,會暫時釋放GIL;
(3)利用多解釋器pypy、jpython來釋放GIL鎖;
7、python垃圾怎么回收的?
1)python什么時候觸發垃圾回收?
(1)達到了垃圾回收的閾值,Python虛擬機自動執行;
(2)手動調用gc.collect();
(3)Python虛擬機退出的時候;
2)Python主要運用GC模塊的“引用計數”來跟蹤和回收垃圾,在引用計數的基礎上,還可以通過“標記-清除”(mark and sweep)解決容器對象可能產生的循環引用的問題,通過“分代回收”(generation collection)以空間換取時間來進一步提高垃圾回收的效率;
8、python上下文管理器?
(1)任何實現了 __enter__() 和 __exit__() 方法的對象都可稱之為上下文管理器,上下文管理器對象可以使用 with 關鍵字。顯然,文件(file)對象也實現了上下文管理器。
(2)模擬實現一個自己的文件類,讓該類實現 __enter__() 和 __exit__() 方法:
class File(): def __init__(self, filename, mode): self.filename = filename self.mode = mode def __enter__(self): print("entering") self.f = open(self.filename, self.mode) return self.f def __exit__(self, *args): print("will exit") self.f.close()
__enter__() 方法返回資源對象,這里就是你將要打開的那個文件對象,__exit__() 方法處理一些清除工作;
因為 File 類實現了上下文管理器,現在就可以使用 with 語句了,
with File('out.txt', 'w') as f: print("writing") f.write('test')
引用連接:https://www.cnblogs.com/zhangfengxian/p/10201400.html
9、存儲引擎innodb的特性?
1:支持事務(要么全成功、要么全失敗); 2:行級鎖定(更新數據時一般指鎖定當前行):通過索引實現、全表掃描忍讓時表鎖、注意間隙所的影響; 3:讀寫阻塞與事務的隔離級別相關; 4:具有非常高的緩存特性(既能緩存索引、也能緩存數據); 5:這個表和主鍵以組(Cluster)的方式存儲、組成一顆平衡樹; 6:所有的輔助索引(secondary indexes)都會保存主鍵信息; 7:支持分區、表空間類似與oracle 數據庫; 8:支持外鍵約束、不支持全文檢索(5.5.5之前的MyISAM支持全文檢索、5.5.5之后就不在支持); 9:相對MyISAM而言、對硬件的要求比較高;
10、mysql事務有哪些特性?
四大特性:原子性、一致性、隔離性、持久性;
(1)原子性:原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響;
(2)一致性:一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處於一致性狀態。舉例來說,假設用戶A和用戶B兩者的錢加起來一共是1000,那么不管A和B之間如何轉賬、轉幾次賬,事務結束后兩個用戶的錢相加起來應該還得是1000,這就是事務的一致性;
(3)隔離性是當多個用戶並發訪問數據庫時,比如同時操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個並發事務之間要相互隔離;
(4)持久性:持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作;
拓展:什么是悲觀鎖、樂觀鎖:
1)悲觀鎖,它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度。因此,在整個數據處理過程中,將數據處於鎖定狀態;
2)樂觀鎖:相對悲觀鎖而言,樂觀鎖假設認為數據一般情況下不會造成沖突,所以只會在數據進行提交更新的時候,才會正式對數據的沖突與否進行檢測,如果發現沖突了,則返回用戶錯誤的信息,讓用戶決定如何去做。
3)聚簇索引:在innodb中,主鍵的索引結構中,既存儲了主鍵值,有存儲了行數據,這種數據成為‘聚簇索引’;
11、數據庫索引的功能是什么?
(1)數據庫索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息;
(2)加快數據庫的信息查詢與檢索,縮短搜索數據庫信息的時間;
12、innodb索引數據結構是什么樣的?
(1)B+樹結構;
(2)扁平特性,節省內存;
(3)B+樹除了葉子節點其他節點並不存儲數據,節點小,磁盤IO次數就少,而磁盤IO次數少,就說明mysql的查詢效率高;
拓展:
關系型數據庫與非關系型數據庫的區別:
1)關系型數據庫通過外鍵關聯來建立表與表之間的關系,非關系型數據庫通常指數據以對象的形式存儲在數據庫中,而對象之間的關系通過每個對象自身的屬性來決定,即使用鍵值對存儲數據;
2)MongoDB為什么使用B-樹而不是B+樹,可以從它的設計角度來考慮,它並不是傳統的關系型數據庫,而是以json格式作為存儲的nosql,目的就是高性能,高可用,易擴展;
13、mysql建索引需要注意哪些事項?
(1)更新頻繁的列不應設置索引;
(2)數據量小的表不要使用索引;
(3)重復數據多的字段不應設為索引;
(4)首先應該考慮對where 和 order by 涉及的列上建立索引;
14、數據庫怎么優化慢查詢?
15、表的拆分有哪些緯度?
16、什么情況下會用上讀寫分離?
17、mysql的binlog主要有哪些信息?
主要以事件形式記錄兩類消息:DDL和DML語句;
18、kafka和rabbitmq的區別?
(1)功能上,兩者都是實現了AMQP協議。那么在使用上的最大區別是什么呢?如何根據自己的需求進行選型?
(2)kafka是嚴格順序保證的消息隊列。即使在分布式環境下,也保證在同一分區內消息的順序性。既然是順序的,那么在同一個Topic下面,如果前面的消息沒有消費完畢(收到回應),則不能讀取下一條消息。那么在消費端,就變成了一個單線程操作,無法並發。雖然kafka可以通過分區實現並發,不過這個需要用多台kafka實現。
(3)Rabbitmq不承諾消息的順序性,因此可以並發多線程處理。在隊列中不必排隊。如果你對順序處理沒有要求,可以用Rabbitmq實現較大的並發。
19、數據結構算法,常用十大排序算法,時間復雜度、空間復雜度簡單說下?
20、二叉樹鏡像反轉代碼,手寫?
class Node(object): def __init__(self, value=None, lchild=None, rchild=None): self.value = value self.lchild = lchild self.rchild = rchild def mirror(root): """翻轉鏡像""" if not root: return root.lchild, root.rchild = root.rchild, root.lchild mirror(root.lchild) mirror(root.rchild) def in_order_traverse(root): """中序遍歷""" if not root: return in_order_traverse(root.lchild) print(root.value) in_order_traverse(root.rchild) if __name__ == '__main__': root = Node(1, Node(2, Node(4), Node(5)), Node(3)) mirror(root) # 翻轉二叉樹 in_order_traverse(root) # 中序遍歷
21、hadoop怎么進行容錯的?
22、http協議常見請求方法有哪些?狀態碼有哪些?
23、https和http的區別,https怎么進行加密的?
https通過TLS進行加密,
24、tcp與udp協議的區別?
25、tcp協議如何進行流量控制?
滑窗控制
26、git如何管理分支?