一:交換變量值
平時(shí)時(shí)不時(shí)會(huì)面面實(shí)習(xí)生,大多數(shù)的同學(xué)在學(xué)校里都已經(jīng)掌握了Python。面試的時(shí)候要求同學(xué)們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的函數(shù),交換兩個(gè)變量的值,大多數(shù)的同學(xué)給出的都是如下的答案
python
def swap(x,y):
tmp = x
x = y
y = tem
實(shí)際上,Python中還有更簡(jiǎn)潔的更具Python風(fēng)格的實(shí)現(xiàn),如下:
python
def swap(x,y):
x,y = y,x
相比前一種方法,后一種方法節(jié)省一個(gè)中間變量,在性能上也優(yōu)于前一種方法。
我們從Python的字節(jié)碼來深入分析一下原因。
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是個(gè)反匯編工具,將Python代碼翻譯成字節(jié)碼指令。這里的輸出如下:
================ 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)
通過字節(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)部修改全局變量
python
a = 5
def abc():
global a
a =1
abc()
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)行,所以多線程仍然是有先后順序的。如果你沒有看明白的話可以進(jìn)我的Python交流.扣扣.裙 :8衣久二五寺久寺二(數(shù)字的諧音轉(zhuǎn)換下可以找到了),可以在裙里一起討論,裙里還有最新的python學(xué)習(xí)資料、項(xiàng)目實(shí)戰(zhàn)案例和面試題集合可以免費(fèi)下載。
四:fun(args,kwargs)中的args,**kwargs什么意思?
用于函數(shù)的接收參數(shù)??梢越邮昭a(bǔ)丁數(shù)量的參數(shù)。
*args是用來接收一個(gè)非鍵值對(duì)的可變數(shù)量的參數(shù)列表
**kwargs允許接收不定長度的鍵值對(duì)。
五:python中斷言方法舉例
aaa = 1
assert (a0)
print ('斷言成功,繼續(xù)向下執(zhí)行')
bbb = 2
assert (bbb3)
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ì)于自增長的字段,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è)瓉碜兞?br>
對(duì)于可變數(shù)據(jù)類型(list dict),會(huì)修改對(duì)應(yīng)變量。
最后還是要推薦下我自己建的Python開發(fā)學(xué)習(xí)裙:8衣久二五寺久寺二(數(shù)字的諧音轉(zhuǎn)換下可以找到了),群里都是學(xué)Python開發(fā)的,如果你正在學(xué)習(xí)Python ,小編歡迎你加入,大家都是軟件開發(fā)黨,不定期分享干貨(只有Python軟件開發(fā)相關(guān)的),包括我自己整理的一份2020最新的Python進(jìn)階資料和高級(jí)開發(fā)教程,歡迎進(jìn)階中和進(jìn)想深入Python的小伙伴
本文的文字及圖片來源于網(wǎng)絡(luò)加上自己的想法,僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問題請(qǐng)及時(shí)聯(lián)系我們以作處理。