Python是目前編程領域最受歡迎的語言腥寇。小編已總結(jié)Python面試中最常見的100個問題都整理成PDF了待侵,每道題都提供參考答案颗胡,希望能夠幫助你在2022年求職面試中脫穎而出舶担,找到一份高薪工作惭婿。這些面試題涉及Python基礎知識找田、Python編程歌憨、數(shù)據(jù)分析以及Python函數(shù)庫等多個方面,還有一些簡歷模板墩衙。
1. (1)python下多線程的限制以及多進程中傳遞參數(shù)的方式
python多線程有個全局解釋器鎖(global interpreter lock)务嫡,這個鎖的意思是任一時間只能有一個線程使用解釋器,跟單cpu跑多個程序一個意思漆改,大家都是輪著用的心铃,這叫“并發(fā)”,不是“并行”挫剑。
多進程間共享數(shù)據(jù)去扣,可以使用 multiprocessing.Value 和 multiprocessing.Array
(2)python多線程與多進程的區(qū)別
在UNIX平臺上,當某個進程終結(jié)之后暮顺,該進程需要被其父進程調(diào)用wait厅篓,否則進程成為僵尸進程(Zombie)秀存。所以,有必要對每個Process對象調(diào)用join()方法 (實際上等同于wait)羽氮。對于多線程來說或链,由于只有一個進程,所以不存在此必要性档押。
多進程應該避免共享資源澳盐。在多線程中,我們可以比較容易地共享資源令宿,比如使用全局變量或者傳遞參數(shù)叼耙。在多進程情況下,由于每個進程有自己獨立的內(nèi)存空間粒没,以上方法并不合適筛婉。此時我們可以通過共享內(nèi)存和Manager的方法來共享資源。但這樣做提高了程序的復雜度癞松,并因為同步的需要而降低了程序的效率爽撒。
2.Python是如何進行內(nèi)存管理的?解讀Python內(nèi)存管理機制-51CTO.COMPython引用了一個內(nèi)存池(memory pool)機制响蓉,即Pymalloc機制(malloc:n.分配內(nèi)存)硕勿,用于管理對小塊內(nèi)存的申請和釋放
內(nèi)存池(memory pool)的概念:
當 創(chuàng)建大量消耗小內(nèi)存的對象時,頻繁調(diào)用new/malloc會導致大量的內(nèi)存碎片枫甲,致使效率降低源武。內(nèi)存池的概念就是預先在內(nèi)存中申請一定數(shù)量的,大小相等 的內(nèi)存塊留作備用想幻,當有新的內(nèi)存需求時粱栖,就先從內(nèi)存池中分配內(nèi)存給這個需求,不夠了之后再申請新的內(nèi)存脏毯。這樣做最顯著的優(yōu)勢就是能夠減少內(nèi)存碎片查排,提升效率。
內(nèi)存池的實現(xiàn)方式有很多抄沮,性能和適用范圍也不一樣。
python中的內(nèi)存管理機制——Pymalloc:
python中的內(nèi)存管理機制都有兩套實現(xiàn)岖瑰,一套是針對小對象叛买,就是大小小于256bits時,pymalloc會在內(nèi)存池中申請內(nèi)存空間;當大于256bits蹋订,則會直接執(zhí)行new/malloc的行為來申請內(nèi)存空間率挣。
關于釋放內(nèi)存方面,當一個對象的引用計數(shù)變?yōu)?時露戒,python就會調(diào)用它的析構(gòu)函數(shù)椒功。在析構(gòu)時捶箱,也采用了內(nèi)存池機制,從內(nèi)存池來的內(nèi)存會被歸還到內(nèi)存池中动漾,以避免頻繁地釋放動作丁屎。
3.什么是lambda函數(shù)?它有什么好處?http://www.kuqin.com/diveinto_python_document/apihelper_lambda.htmllambda 函數(shù)是一個可以接收任意多個參數(shù)(包括可選參數(shù))并且返回單個表達式值的函數(shù)旱眯。 lambda 函數(shù)不能包含命令晨川,它們所包含的表達式不能超過一個。不要試圖向lambda 函數(shù)中塞入太多的東西删豺;如果你需要更復雜的東西共虑,應該定義一個普通函數(shù)赡麦,然后想讓它多長就多長癞蚕。
4.如何用Python輸出一個Fibonacci數(shù)列?
1 a,b = 0, 1
2 while b<100:
3 print (b),
4? ? a, b = b, a+b
5.介紹一下Python中webbrowser的用法狭园?
webbrowser模塊提供了一個高級接口來顯示基于Web的文檔蓬蝶,大部分情況下只需要簡單的調(diào)用open()方法尘分。
webbrowser定義了如下的異常:
exception webbrowser.Error, 當瀏覽器控件發(fā)生錯誤是會拋出這個異常
webbrowser有以下方法:
webbrowser.open(url[, new=0[, autoraise=1]])
這個方法是在默認的瀏覽器中顯示url, 如果new = 0, 那么url會在同一個瀏覽器窗口下打開,如果new = 1, 會打開一個新的窗口疾党,如果new = 2, 會打開一個新的tab, 如果autoraise = true, 窗口會自動增長音诫。
webbrowser.open_new(url)
在默認瀏覽器中打開一個新的窗口來顯示url, 否則,在僅有的瀏覽器窗口中打開url
webbrowser.open_new_tab(url)
在默認瀏覽器中當開一個新的tab來顯示url, 否則跟open_new()一樣
webbrowser.get([name]) 根據(jù)name返回一個瀏覽器對象雪位,如果name為空竭钝,則返回默認的瀏覽器
webbrowser.register(name, construtor[, instance])
注冊一個名字為name的瀏覽器,如果這個瀏覽器類型被注冊就可以用get()方法來獲取雹洗。
6.解釋一下python的and-or語法http://www.kuqin.com/diveinto_python_document/apihelper_andor.html與C表達式 bool ? a : b類似香罐,但是bool and a or b,當 a 為假時时肿,不會象C表達式 bool ? a : b 一樣工作
應該將 and-or 技巧封裝成一個函數(shù):
def choose(bool, a, b):
return (bool and [a] or [b])[0]
因為 [a] 是一個非空列表庇茫,它永遠不會為假。甚至 a 是 0 或 '' 或其它假值螃成,列表[a]為真旦签,因為它有一個元素。
7.how do I iterate over a sequence in reverse order
for x in reversed(sequence):
? ? ... # do something with x..
如果不是list, 最通用但是稍慢的解決方案是:
for i in range(len(sequence)-1, -1, -1):
? ? x = sequence[i]
? ? <do something with x>
8.Python是如何進行類型轉(zhuǎn)換的寸宏?http://canofy.iteye.com/blog/298263
1 函數(shù)? ? ? ? ? ? ? ? ? ? ? 描述
2 int(x [,base ])? ? ? ? 將x轉(zhuǎn)換為一個整數(shù)
3 long(x [,base ])? ? ? ? 將x轉(zhuǎn)換為一個長整數(shù)
4 float(x )? ? ? ? ? ? ? 將x轉(zhuǎn)換到一個浮點數(shù)
5 complex(real [,imag ])? 創(chuàng)建一個復數(shù)
6 str(x )? ? ? ? ? ? ? ? 將對象 x 轉(zhuǎn)換為字符串
7 repr(x )? ? ? ? ? ? ? ? 將對象 x 轉(zhuǎn)換為表達式字符串
8 eval(str )? ? ? ? ? ? ? 用來計算在字符串中的有效Python表達式,并返回一個對象
9 tuple(s )? ? ? ? ? ? ? 將序列 s 轉(zhuǎn)換為一個元組
10 list(s )? ? ? ? ? ? ? ? 將序列 s 轉(zhuǎn)換為一個列表
11 chr(x )? ? ? ? ? ? ? ? 將一個整數(shù)轉(zhuǎn)換為一個字符
12 unichr(x )? ? ? ? ? ? ? 將一個整數(shù)轉(zhuǎn)換為Unicode字符
13 ord(x )? ? ? ? ? ? ? ? 將一個字符轉(zhuǎn)換為它的整數(shù)值
14 hex(x )? ? ? ? ? ? ? ? 將一個整數(shù)轉(zhuǎn)換為一個十六進制字符串
15 oct(x )? ? ? ? ? ? ? ? 將一個整數(shù)轉(zhuǎn)換為一個八進制字符串
9.Python里面如何實現(xiàn)tuple和list的轉(zhuǎn)換?
1 >>> l = tuple(iplist)
2 >>> print l
3 ('217.169.209.2:6666', '192.227.139.106:7808', '110.4.12.170:83', '69.197.132.80:7808', '205.164.41.101:3128', '63.141.249.37:8089', '27.34.142.47:9090')
4 >>> t = list(l)
5 >>> print t
6 ['217.169.209.2:6666', '192.227.139.106:7808', '110.4.12.170:83', '69.197.132.80:7808', '205.164.41.101:3128', '63.141.249.37:8089', '27.34.142.47:9090']
10.請寫出一段Python代碼實現(xiàn)刪除一個list里面的重復元素
1 >>> l = [1,1,2,3,4,5,4]
2 >>> list(set(l))
3 [1, 2, 3, 4, 5]
4 或者
5 d = {}
6 for x in mylist:
7? ? d[x] = 1
8 mylist = list(d.keys())
11.Python如何實現(xiàn)單例模式氮凝?其他23種設計模式python如何實現(xiàn)羔巢?
1 #使用__metaclass__(元類)的高級python用法?
2 class Singleton2(type):?
3 def __init__(cls, name, bases, dict):?
4? ? ? ? super(Singleton2, cls).__init__(name, bases, dict)?
5? ? ? ? cls._instance = None?
6 def __call__(cls, *args, **kw):?
7 if cls._instance is None:?
8? ? ? ? ? ? cls._instance = super(Singleton2, cls).__call__(*args, **kw)?
9 return cls._instance?
10
11 class MyClass3(object):?
12 __metaclass__ = Singleton2?
13
14 one = MyClass3()?
15 two = MyClass3()?
16
17 two.a = 3?
18 print one.a?
19 #3?
20 print id(one)?
21 #31495472?
22 print id(two)?
23 #31495472?
24 print one == two?
25 #True?
26 print one is two?
27 #True?
1 #使用裝飾器(decorator),?
2 #這是一種更pythonic,更elegant的方法,?
3 #單例類本身根本不知道自己是單例的,因為他本身(自己的代碼)并不是單例的?
4 def singleton(cls, *args, **kw):?
5? ? instances = {}?
6 def _singleton():?
7 if cls not in instances:?
8? ? ? ? ? ? instances[cls] = cls(*args, **kw)?
9 return instances[cls]?
10 return _singleton?
11
12 @singleton?
13 class MyClass4(object):?
14? ? a = 1?
15 def __init__(self, x=0):?
16? ? ? ? self.x = x?
17
18 one = MyClass4()?
19 two = MyClass4()?
20
21 two.a = 3?
22 print one.a?
23 #3?
24 print id(one)?
25 #29660784?
26 print id(two)?
27 #29660784?
28 print one == two?
29 #True?
30 print one is two?
31 #True?
32 one.x = 1?
33 print one.x?
34 #1?
35 print two.x?
36 #1?
12.Python里面如何拷貝一個對象?Python Cookbook 4.1 復制(拷貝)對象(淺復制和深復制)_sharkw的專欄-CSDN博客標準庫中的copy模塊提供了兩個方法來實現(xiàn)拷貝.一個方法是copy,它返回和參數(shù)包含內(nèi)容一樣的對象.
使用deepcopy方法,對象中的屬性也被復制
13.介紹一下except的用法和作用?
Python的except用來捕獲所有異常竿秆,因為Python里面的每次錯誤都會拋出一個異常启摄,所以每個程序的錯誤都被當作一個運行時錯誤。
14.Python中pass語句的作用是什么幽钢?
pass語句什么也不做歉备,一般作為占位符或者創(chuàng)建占位程序,pass語句不會執(zhí)行任何操作
15.如何知道一個python對象的類型搅吁?
type()
16.介紹一下Python下range()函數(shù)的用法威创?http://docs.python.org/library/functions.html#rangerange(start, stop[, step])
17.如何用Python來進行查詢和替換一個文本字符串?
可以使用sub()方法來進行查詢和替換谎懦,sub方法的格式為:sub(replacement, string[, count=0])
replacement是被替換成的文本
string是需要被替換的文本
count是一個可選參數(shù)肚豺,指最大被替換的數(shù)量
18.Python里面search()和match()的區(qū)別?
match()函數(shù)只檢測RE是不是在string的開始位置匹配界拦,search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回吸申,如果不是開始位置匹配成功的話,match()就返回none
19.用Python匹配HTML tag的時候享甸,<.*>和<.*?>有什么區(qū)別截碴?
前者是貪婪匹配,會從頭到尾匹配 <a>xyz</a>蛉威,而后者是非貪婪匹配日丹,只匹配到第一個 >。
20.Python里面如何生成隨機數(shù)蚯嫌?
import random
random.random()
它會返回一個隨機的0和1之間的浮點數(shù)
21.如何用Python來發(fā)送郵件哲虾?
python實現(xiàn)發(fā)送和接收郵件功能主要用到poplib和smtplib模塊。
poplib用于接收郵件择示,而smtplib負責發(fā)送郵件束凑。
代碼如下:
1 #! /usr/bin/env python
2 #coding=utf-8
3 import sys
4 import time
5 import poplib
6 import smtplib
7 #郵件發(fā)送函數(shù)
8 def send_mail():
9 try:
10? ? ? ? handle = smtplib.SMTP('smtp.126.com',25)
11? ? ? ? handle.login('XXXX@126.com','**********')
12? ? ? ? msg = 'To: XXXX@qq.com\r\nFrom:XXXX@126.com\r\nSubject:hello\r\n'
13? ? ? ? handle.sendmail('XXXX@126.com','XXXX@qq.com',msg)
14? ? ? ? handle.close()
15 return 1
16 except:
17 return 0
18 #郵件接收函數(shù)
19 def accpet_mail():
20 try:
21? ? ? ? p=poplib.POP3('pop.126.com')
22? ? ? ? p.user('pythontab@126.com')
23? ? ? ? p.pass_('**********')
24? ? ? ? ret = p.stat() #返回一個元組:(郵件數(shù),郵件尺寸)
25 #p.retr('郵件號碼')方法返回一個元組:(狀態(tài)信息,郵件,郵件尺寸)?
26 except poplib.error_proto,e:
27 print "Login failed:",e
28? ? ? ? sys.exit(1)
29
30 #運行當前文件時,執(zhí)行sendmail和accpet_mail函數(shù)
31 if __name__ == "__main__":
32? ? send_mail()
33? ? accpet_mail()
最后聊聊我的感受吧
一切技術的產(chǎn)生與發(fā)展都離不開最基本的原理栅盲,只要追本溯源汪诉,了解技術體系最基本、底層的原理谈秫,我們就能根據(jù)這些知識儲備建立自己的后端技術框架扒寄,從而搭建一條完整的成長道路。因為篇幅原因拟烫,還有更多的大廠面試題已經(jīng)總結(jié)成PDF了
點擊鏈接加入群聊【Python加速學習交流群】:https://jq.qq.com/?_wv=1027&k=jlS0wzAhjq.qq.com
每道題都提供參考答案旗们,希望能夠幫助你在2022年求職面試中脫穎而出,找到一份高薪工作构灸,祝大家山頂見!