python引入redis_十六大Python面试题!看完面试官给了我40K的薪资
一:交換變量值
平時時不時會面面實習生,大多數的同學在學校里都已經掌握了Python。面試的時候要求同學們實現一個簡單的函數,交換兩個變量的值,大多數的同學給出的都是如下的答案
def swap(x,y):tmp = xx = yy = tem實際上,Python中還有更簡潔的更具Python風格的實現,如下:
def swap(x,y):x,y = y,x相比前一種方法,后一種方法節省一個中間變量,在性能上也優于前一種方法。
我們從Python的字節碼來深入分析一下原因。
import disimport timeitdef swap1():x = 5y = 6tmp = xx = yy = tmpif _name_=="_main_"print "================ swap1 ================"print dis.dis(swap1)print "================ swap2 ================"dis是個反匯編工具,將Python代碼翻譯成字節碼指令。這里的輸出如下:
================ swap1 ================ 50 LOAD_CONST 1 (5) 3 STORE_FAST 0 (x)66 LOAD_CONST 2 (6) 9 STORE_FAST 1 (y) 712 LOAD_CONST 1 (y) 15 STORE_FAST 0 (x )通過字節碼可以看到,swap1和swap2最大的區別在于,swap1中通過ROT_TWO交換棧頂的兩個元素實現x和y值的互換,swap2中引入了tmp變量,多了一次LOAD_FAST, STORE_FAST的操作。執行一個ROT_TWO指令比執行一個LOAD_FAST+STORE_FAST的指令快,這也是為什么swap1比swap2性能更好的原因。
二:如何在一個函數內部修改全局變量
a = 5def abc():global a a =1abc()print(a)三:談下python的GIL
python的GIL是python的全局解釋器鎖,同一個進程中如果有多個線程運行,一個線程運行的時候會霸占解釋器,上了個鎖即GIL,進程內其他線程無法運行。如果遇到耗時操作,GIL會打開,其他線程先運行,所以多線程仍然是有先后順序的。
四:fun(*args,**kwargs)中的*args,**kwargs什么意思?
用于函數的接收參數??梢越邮昭a丁數量的參數。
*args是用來接收一個非鍵值對的可變數量的參數列表
**kwargs允許接收不定長度的鍵值對。
五:python中斷言方法舉例
aaa = 1assert (a>0)print ('斷言成功,繼續向下執行')bbb = 2assert (bbb>3)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開發工程師,這里有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,并在后臺私信小編:“01”即可領取。
總結
以上是生活随笔為你收集整理的python引入redis_十六大Python面试题!看完面试官给了我40K的薪资的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 符号链接文件_Windows10下创建符
- 下一篇: go 打印bool_Golang语言基础