python引入redis_十六大Python面试题!看完面试官给了我40K的薪资
一:交換變量值
平時(shí)時(shí)不時(shí)會(huì)面面實(shí)習(xí)生,大多數(shù)的同學(xué)在學(xué)校里都已經(jīng)掌握了Python。面試的時(shí)候要求同學(xué)們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的函數(shù),交換兩個(gè)變量的值,大多數(shù)的同學(xué)給出的都是如下的答案
def swap(x,y):tmp = xx = yy = tem實(shí)際上,Python中還有更簡(jiǎn)潔的更具Python風(fēng)格的實(shí)現(xiàn),如下:
def swap(x,y):x,y = y,x相比前一種方法,后一種方法節(jié)省一個(gè)中間變量,在性能上也優(yōu)于前一種方法。
我們從Python的字節(jié)碼來深入分析一下原因。
import disimport timeitdef swap1():x = 5y = 6tmp = xx = yy = tmpif _name_=="_main_"print "================ swap1 ================"print dis.dis(swap1)print "================ swap2 ================"dis是個(gè)反匯編工具,將Python代碼翻譯成字節(jié)碼指令。這里的輸出如下:
================ 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 )通過字節(jié)碼可以看到,swap1和swap2最大的區(qū)別在于,swap1中通過ROT_TWO交換棧頂?shù)膬蓚€(gè)元素實(shí)現(xiàn)x和y值的互換,swap2中引入了tmp變量,多了一次LOAD_FAST, STORE_FAST的操作。執(zhí)行一個(gè)ROT_TWO指令比執(zhí)行一個(gè)LOAD_FAST+STORE_FAST的指令快,這也是為什么swap1比swap2性能更好的原因。
二:如何在一個(gè)函數(shù)內(nèi)部修改全局變量
a = 5def abc():global a a =1abc()print(a)三:談下python的GIL
python的GIL是python的全局解釋器鎖,同一個(gè)進(jìn)程中如果有多個(gè)線程運(yùn)行,一個(gè)線程運(yùn)行的時(shí)候會(huì)霸占解釋器,上了個(gè)鎖即GIL,進(jìn)程內(nèi)其他線程無法運(yùn)行。如果遇到耗時(shí)操作,GIL會(huì)打開,其他線程先運(yùn)行,所以多線程仍然是有先后順序的。
四:fun(*args,**kwargs)中的*args,**kwargs什么意思?
用于函數(shù)的接收參數(shù)。可以接收補(bǔ)丁數(shù)量的參數(shù)。
*args是用來接收一個(gè)非鍵值對(duì)的可變數(shù)量的參數(shù)列表
**kwargs允許接收不定長(zhǎng)度的鍵值對(duì)。
五:python中斷言方法舉例
aaa = 1assert (a>0)print ('斷言成功,繼續(xù)向下執(zhí)行')bbb = 2assert (bbb>3)print ('斷言失敗')六:列出python中可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型,并簡(jiǎn)述原理
不可變:int,str,tuple 不允許變量的值發(fā)生變化,如果改變了值,相當(dāng)于創(chuàng)建一個(gè)新的對(duì)象,相同值的對(duì)象,內(nèi)存中的地址是一樣的。
可變對(duì)象:list,dict 允許變量的值發(fā)生變化,例如append操作后,改變的是原對(duì)象的值。如果是兩個(gè)相同值的對(duì)象,內(nèi)存中的地址也是不一樣的。
七:正則表達(dá)式匹配中,(.*)和(.*?)匹配區(qū)別?
(.*)是貪婪匹配,盡可能多的匹配
(.*?)是盡可能少的匹配結(jié)果
八:舉例說明異常模塊中try except else finally的相關(guān)意義
else 沒有捕捉到異常,執(zhí)行else里面的,
finally 不管有木有異常 都執(zhí)行finally里面的 參見withopen里面 不論是否成功打開文件,都會(huì)執(zhí)行close()
九:提高python運(yùn)行效率的方法
1、使用生成器,節(jié)約內(nèi)存
2、優(yōu)化for循環(huán)
3、核心模塊用Cpython PyPy等,提高效率
4、多進(jìn)程,多線程、協(xié)程
5、判斷可能性大的放到前面
十:簡(jiǎn)述mysql和redis區(qū)別
redis:內(nèi)存級(jí)非關(guān)系數(shù)據(jù)庫,速度快,作網(wǎng)頁緩存
mysql:關(guān)系型數(shù)據(jù)庫 檢索有一定io操作,訪問速度慢
十一:列出常見MYSQL數(shù)據(jù)存儲(chǔ)引擎
InnoDB:支持事務(wù)處理,支持外鍵,支持崩潰修復(fù)能力和并發(fā)控制。如果需要對(duì)事務(wù)的完整性要求比較高(比如銀行),要求實(shí)現(xiàn)并發(fā)控制(比如售票),那選擇InnoDB有很大的優(yōu)勢(shì)。如果需要頻繁的更新、刪除操作的數(shù)據(jù)庫,也可以選擇InnoDB,因?yàn)橹С质聞?wù)的提交(commit)和回滾(rollback)。
MyISAM:插入數(shù)據(jù)快,空間和內(nèi)存使用比較低。如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM能實(shí)現(xiàn)處理高效率。如果應(yīng)用的完整性、并發(fā)性要求比 較低,也可以使用。
十二:簡(jiǎn)述多線程、多進(jìn)程
進(jìn)程:
1、操作系統(tǒng)資源分配的基本單位,進(jìn)程之間相互獨(dú)立
2、穩(wěn)定性好,但是資源消耗大。
線程:
1、cpu進(jìn)行資源分配和調(diào)度的基本單位,線程是進(jìn)程再次細(xì)分,是比進(jìn)程更小的獨(dú)立運(yùn)行的基本單位,一個(gè)進(jìn)程下所有線程共享該進(jìn)程資源,
2、IO操作密集,多線程運(yùn)行效率高,但是如果其中一個(gè)崩潰,進(jìn)程也會(huì)崩潰。
應(yīng)用:
IO密集型用多線程,等待時(shí)候可以切換帶其他線程運(yùn)行
CPU密集的用多進(jìn)程,IO操作少,因?yàn)榫€程多霸占GIL,其他線程不能運(yùn)行,不能充分發(fā)揮多核CPU優(yōu)勢(shì)。
十三:列出幾種魔法方法并簡(jiǎn)要介紹用途
__init__:對(duì)象初始化方法
__new__:創(chuàng)建對(duì)象時(shí)候執(zhí)行的方法,單列模式會(huì)用到
__str__:當(dāng)使用print輸出對(duì)象的時(shí)候,只要自己定義了__str__(self)方法,那么就會(huì)打印從在這個(gè)方法中return的數(shù)據(jù)
__del__:刪除對(duì)象執(zhí)行的方法
十四:MyISAM 與 InnoDB 區(qū)別:
1、InnoDB 支持事務(wù),MyISAM 不支持,這一點(diǎn)是非常之重要。事務(wù)是一種高
級(jí)的處理方式,如在一些列增刪改中只要哪個(gè)出錯(cuò)還可以回滾還原,而 MyISAM
就不可以了;
2、MyISAM 適合查詢以及插入為主的應(yīng)用,InnoDB 適合頻繁修改以及涉及到
安全性較高的應(yīng)用;
3、InnoDB 支持外鍵,MyISAM 不支持;
4、對(duì)于自增長(zhǎng)的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM
表中可以和其他字段一起建立聯(lián)合索引;
5、清空整個(gè)表時(shí),InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會(huì)重
建表;
十五:Linux命令重定向 > 和 >>
Linux 允許將命令執(zhí)行結(jié)果 重定向到一個(gè) 文件
將本應(yīng)顯示在終端上的內(nèi)容 輸出/追加 到指定文件中
> 表示輸出,會(huì)覆蓋文件原有的內(nèi)容
>> 表示追加,會(huì)將內(nèi)容追加到已有文件的末尾
用法示例:
將 echo 輸出的信息保存到 1.txt 里echo Hello Python > 1.txt將 tree 輸出的信息追加到 1.txt 文件的末尾tree >> 1.txt十六::python傳參數(shù)是傳值還是傳址?
傳的是指針,是引用傳遞
對(duì)于不可變類型(數(shù)值,str,tuple),不會(huì)改變?cè)瓉碜兞?/p>
對(duì)于可變數(shù)據(jù)類型(list dict),會(huì)修改對(duì)應(yīng)變量。
結(jié)尾
最后多說一句,小編是一名python開發(fā)工程師,這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程,包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、數(shù)據(jù)分析、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)等。想要這些資料的可以關(guān)注小編,并在后臺(tái)私信小編:“01”即可領(lǐng)取。
總結(jié)
以上是生活随笔為你收集整理的python引入redis_十六大Python面试题!看完面试官给了我40K的薪资的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 符号链接文件_Windows10下创建符
- 下一篇: xp python35.dll_pyth