一:交換變數值
平時時不時會面面實習生,大多數的同學在學校里都已經掌握了Python,面試的時候要求同學們實作一個簡單的函式,交換兩個變數的值,大多數的同學給出的都是如下的答案
python def swap(x,y): tmp = x x = y y = tem
實際上,Python中還有更簡潔的更具Python風格的實作,如下:
python def swap(x,y): x,y = y,x
相比前一種方法,后一種方法節省一個中間變數,在性能上也優于前一種方法,
我們從Python的位元組碼來深入分析一下原因,
python import dis import timeit def swap1(): x = 5 y = 6 tmp = x x = y y = tmp if _name_=="_main_" print "================ swap1 ================" print dis.dis(swap1) print "================ swap2 ================"
dis是個反匯編工具,將Python代碼翻譯成位元組碼指令,這里的輸出如下:
================ swap1 ================ 5 0 LOAD_CONST 1 (5) 3 STORE_FAST 0 (x) 6 6 LOAD_CONST 2 (6) 9 STORE_FAST 1 (y) 7 12 LOAD_CONST 1 (y) 15 STORE_FAST 0 (x) None ================ swap2 ================ 10 0 LOAF_CONST 1(5) 3 STORE_FAST 0 (x ) 11 6 LOAF_CONST 2(6) 9 STORE_FAST 1 (Y ) 12 12 LOAD_FAST 0(x) 15 STORE_FAST 2 (tmp) 13 18 LOAF_CONST 1(y) 21 STORE_FAST 0 (x ) 14 24 LOAD_FAST 2(tmp) 27 STORE_FAST 1 (y ) 30 LOAF_CONST 0(None)
通過位元組碼可以看到,swap1和swap2最大的區別在于,swap1中通過ROT_TWO交換堆疊頂的兩個元素實作x和y值的互換,swap2中引入了tmp變數,多了一次LOAD_FAST, STORE_FAST的操作,執行一個ROT_TWO指令比執行一個LOAD_FAST+STORE_FAST的指令快,這也是為什么swap1比swap2性能更好的原因,
二:如何在一個函式內部修改全域變數
python a = 5 def abc(): global a a =1 abc() print(a)
三:談下python的GIL
python的GIL是python的全域解釋器鎖,同一個行程中如果有多個執行緒運行,一個執行緒運行的時候會霸占解釋器,上了個鎖即GIL,行程內其他執行緒無法運行,如果遇到耗時操作,GIL會打開,其他執行緒先運行,所以多執行緒仍然是有先后順序的,如果你沒有看明白的話可以進我的Python交流.扣扣.裙 :8衣久二五寺久寺二(數字的諧音轉換下可以找到了),可以在裙里一起討論,裙里還有最新的python學習資料、專案實戰案例和面試題集合可以免費下載,
四:fun(*args,**kwargs)中的*args,**kwargs什么意思?
用于函式的接收引數,可以接收補丁數量的引數,
*args是用來接收一個非鍵值對的可變數量的引數串列
**kwargs允許接收不定長度的鍵值對,
五:python中斷言方法舉例
aaa = 1 assert (a0) print ('斷言成功,繼續向下執行') bbb = 2 assert (bbb3) print ('斷言失敗')

六:列出python中可變資料型別和不可變資料型別,并簡述原理
不可變:int,str,tuple 不允許變數的值發生變化,如果改變了值,相當于創建一個新的物件,相同值的物件,記憶體中的地址是一樣的,
可變物件:list,dict 允許變數的值發生變化,例如append操作后,改變的是原物件的值,如果是兩個相同值的物件,記憶體中的地址也是不一樣的,
七:正則運算式匹配中,(.*)和(.*?)匹配區別?
(.*)是貪婪匹配,盡可能多的匹配
(.*?)是盡可能少的匹配結果
八:舉例說明例外模塊中try except else finally的相關意義
else 沒有捕捉到例外,執行else里面的,
finally 不管有木有例外 都執行finally里面的 參見withopen里面 不論是否成功打開檔案,都會執行close()
九:提高python運行效率的方法
1、使用生成器,節約記憶體
2、優化for回圈
3、核心模塊用Cpython PyPy等,提高效率
4、多行程,多執行緒、協程
5、判斷可能性大的放到前面

十:簡述mysql和redis區別
redis:記憶體級非關系資料庫,速度快,作網頁快取
mysql:關系型資料庫 檢索有一定io操作,訪問速度慢

十一:列出常見MYSQL資料存盤引擎
InnoDB:支持事務處理,支持外鍵,支持崩潰修復能力和并發控制,如果需要對事務的完整性要求比較高(比如銀行),要求實作并發控制(比如售票),那選擇InnoDB有很大的優勢,如果需要頻繁的更新、洗掉操作的資料庫,也可以選擇InnoDB,因為支持事務的提交(commit)和回滾(rollback),
MyISAM:插入資料快,空間和記憶體使用比較低,如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM能實作處理高效率,如果應用的完整性、并發性要求比 較低,也可以使用,
十二:簡述多執行緒、多行程
行程:
1、作業系統資源分配的基本單位,行程之間相互獨立
2、穩定性好,但是資源消耗大,
執行緒:
1、cpu進行資源分配和調度的基本單位,執行緒是行程再次細分,是比行程更小的獨立運行的基本單位,一個行程下所有執行緒共享該行程資源,
2、IO操作密集,多執行緒運行效率高,但是如果其中一個崩潰,行程也會崩潰,
應用:
IO密集型用多執行緒,等待時候可以切換帶其他執行緒運行
CPU密集的用多行程,IO操作少,因為執行緒多霸占GIL,其他執行緒不能運行,不能充分發揮多核CPU優勢,
十三:列出幾種魔法方法并簡要介紹用途
__init__:物件初始化方法
__new__:創建物件時候執行的方法,單列模式會用到
__str__:當使用print輸出物件的時候,只要自己定義了__str__(self)方法,那么就會列印從在這個方法中return的資料
__del__:洗掉物件執行的方法
十四:MyISAM 與 InnoDB 區別:
1、InnoDB 支持事務,MyISAM 不支持,這一點是非常之重要,事務是一種高
級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM
就不可以了;
2、MyISAM 適合查詢以及插入為主的應用,InnoDB 適合頻繁修改以及涉及到
安全性較高的應用;
3、InnoDB 支持外鍵,MyISAM 不支持;
4、對于自增長的欄位,InnoDB 中必須包含只有該欄位的索引,但是在 MyISAM
表中可以和其他欄位一起建立聯合索引;
5、清空整個表時,InnoDB 是一行一行的洗掉,效率非常慢,MyISAM 則會重
建表;
十五:Linux命令重定向 > 和 >>
Linux 允許將命令執行結果 重定向到一個 檔案
將本應顯示在終端上的內容 輸出/追加 到指定檔案中
表示輸出,會覆寫檔案原有的內容
表示追加,會將內容追加到已有檔案的末尾
用法示例:
將 echo 輸出的資訊保存到 1.txt 里echo Hello Python 1.txt
將 tree 輸出的資訊追加到 1.txt 檔案的末尾tree 1.txt
十六::python傳引數是傳值還是傳址?
傳的是指標,是參考傳遞
對于不可變型別(數值,str,tuple),不會改變原來變數
對于可變資料型別(list dict),會修改對應變數,
最后還是要推薦下我自己建的Python開發學習裙:8衣久二五寺久寺二(數字的諧音轉換下可以找到了),群里都是學Python開發的,如果你正在學習Python ,小編歡迎你加入,大家都是軟體開發黨,不定期分享干貨(只有Python軟體開發相關的),包括我自己整理的一份2020最新的Python進階資料和高級開發教程,歡迎進階中和進想深入Python的小伙伴
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/132230.html
標籤:Python
上一篇:Python函式定義及引數詳解
