# xarefit **這幾年都以python工作 以下回答皆以python為基礎進行** 1. 如何寫一個循環,然後把它轉換成遞迴函數? 這部分以費波那契數列回答,將設計好的函數迴圈執行後呼叫函數即可 ```pyhton = def fib(n): global count count += 1 #計算總共遞迴了幾次 if n ==1 or n==2: return 1 return fib(n-1)+fib(n-2) count = 0 print(fib(10)) print(count) ``` 2. 如何找出 slow query? MySQL 如何進行效能分析? slow query ``` 以Mysql來說 可以從my.ini做參數配置(儲存當 SQL 語句執行時間超過2秒時, 便會將SQL語句儲存) slow_query_log = ON slow_query_log_file = /var/lib/mysql/mysql_slow.log long_query_time = 2 以上配置完後可在mysql_slow.log中查詢相關資訊 ``` 效能分析 ``` 可以使用mysqldumpslow工具搜尋慢mysql_slow.log中的SQL語句。 也可以用explain檢視SQL語句的相關情況 或是可以使用Query Profiler(MySQL自帶的一種query診斷分析工具) ``` 3. 索引的優缺點? ``` 1.建立適合select或經常使用的索引可以極大提升資料的檢索速度 2.索引並不是越多越好,索引固然可以提高相應select的效率,但其會耗費物理空間,同時也降低了insert及update的效率,因為insert或update時有可能會重建索引 當索引列有大量資料重複時,SQL查詢可能不會去利用索引 ``` 4. 什麼是 Deadlock? (用程式碼表示)。 *Deadlock的部分我自己沒有遇過或是解決過(只能說瞭解大概狀況跟原理),都是透過書或是網路上的文章學習* 兩個或多個以上線程執行中,因爭奪資源而造成互相等待的狀況, ```python= import threading,time class myThread(threading.Thread): def doA(self): lockA.acquire() print (self.name, " getlockA " ,time.ctime()) time.sleep( 3 ) lockB.acquire() print (self.name, ' getlockB ' ,time.ctime()) lockB.release() lockA.release() def doB(self): lockB.acquire() print (self.name, " getlockB " ,time.ctime()) time.sleep( 3 ) lockA.acquire() print (self.name, ' getlockA ' ,time.ctime()) lockA.release() lockB.release() def run(self): self.doA() self.doB() if __name__ == " __main__ " : lockA = threading.Lock() lockB = threading.Lock() threads = [] for i in range(5 ): threads.append(myThread()) for t in threads: t.start() for t in threads: t.join() ``` 5. 寫一段有 memory leak 的示例程式 (用程式碼表示)。 * python是有garbage collection機制的,理論上不會leak* 以下程序應會持續占用記憶體 ```pyhton= def leak(a=[]): a.append(time.time()) return a ``` > 註: pmap -x [pid]檢視程序佔用的堆記憶體大小 6. 查詢列表中的第一個非重複整數 (用程式表示) ```=python def get_one(list_test): seen = set() for e in list_test: if e in seen: continue seen.add(e) if len(seen) == 1: return e k = get_one([1,2,2,3,3,4,5,6]) print(k) ``` 7. 寫一個簡單的垃圾回收系統。 python 引用計數機制 ``` 每個對象維護一個ob_ref字段,用來記錄該對象當前被引用的次數,每當新的引用指向該對象時,它的引用計數ob_ref加1,每當該對象的引用失效時計數ob_ref減1,一旦對象的引用計數為0,該對象立即被回收,對象佔用的內存空間將被釋放。 ``` 8. 如何設計 REST API ? ``` 1.決定API的http動詞(POST,GET較常用,PUT DELETE PATCH HEAD) 2.決定端點 URI 3.HTTP回傳狀態碼(之前有接觸過自己設計回傳狀態的案件,但其結果並不方便,仍應使用適當的HTTP狀態碼) 4.HTTP Header(自己都是使用一般常見設定) 5.HTTP Body(個人都是以JSON格式為主) ```