python面試題
?
【持續更新】
1.如何判斷一個python對象的類型?
print?type(2017)print?type('junxi')
?
2.python里面如何生存隨機數?
import?random
num = random.random()
int_num = random.randint(1, 10)print?'隨機選取一個0-1之間的數', numprint?'隨機選取一個1-10之間的整數', int_num
?
3.寫出IP的python正則表達式
import reimport os # cmd = os.system('ifconfig eth0 > ip_info.txt')with open('ip_info.txt', 'r') as path: text = path.read() # print(text) # print(type(text)) result = re.findall( r ' \b([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b ' , text) # print(result)
?
?
4.寫盡可能多的str對象的方法
str1 = 'a,b,c,,D,11,222.33.55'print?str1.split('.')[0]
str1 = str1.replace('11', '99')print?str1print?str1.upper()print?str1.lower()
?
5.全局變量與局部變量的區別,如何在函數里面給一個全局變量賦值?
# 全局變量在函數內部和外部都可以使用,局部變量只能在其作用域內使用。
第一個例子:
con = ' haha ' def fun(): global con con = ' lolo ' print (con) fun() print (con)
第二個例子:
下面這段代碼輸出什么? num = 9 def f1(): num = 20 def f2(): print num f2() f1() f2() 答案: 9 9 num不是個全局變量,所以每個函數都得到了自己的num拷貝,如果你想修改num,則必須用global關鍵字聲明。比如下面這樣 num = 9 def f1(): global num num = 20 def f2(): print num f2() f1() f2() # prints: # 9 # 20
?
?
6.元組和列表的區別,有兩個list,b1=[1, 2, 3], b2[2, 3, 4],寫出合并代碼
# 元組內容不可變,列表內容可修改
b1 = [1, 2, 3 ] b2 = [2, 3, 4] print b1 + b2
?
?
7.請寫出一段python代碼實現刪除一個List里面的重復元素。list1 = [1, 1, 2, 3, 4, 5, 4]
list1 = [1, 1, 2, 3, 4, 5, 4, 6, 7, 7, 5, 2, 1 ] list1.sort() last = list1[-1] for i in range(len(list1)-2, -1, -1 ): if list1[i] == last: del list1[i] else : last = list1[i] print list1
?
?
8.寫入如下list的交集與差集代碼,b1=[1, 2, 3], b2=[2, 3, 4]
b1 = [4, 1, 2, 3, 5 ] b2 = [2, 3, 4, 4, 4, 2, 1, 3, 6 ] same = list((set(b1).union(set(b2))) ^ set(b1) ^ set(b2)) # 求交集print same diff = [] # 求差集for i in b1: if i not in b2: diff.append(i) for i in b2: if i not in b1: diff.append(i) print diff union = list(set(b1).union(set(b2))) # 求并集print union
?
9.請寫出一段python代碼實現list里排序a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
a = ['a', 1, 2, 4, 2, 4, 5, 7, 10, 5, 5, 7, 8, 9, 0, 3, 'b', 'd', 'c']
b = sorted(a, key=lambda?a:a)print?b
?
10.D=[x * x for x in range(1, 10)], 請寫出D的輸出結果
D = [x * x for?x in?range(1, 10)]print?D
?
11.如何用python輸出一個fibonacci數列(100以內)
def fib(n): num_list = [1, 1 ] print ' fib數列第1個數是: ' , num_list[0] print ' fib數列第2個數是: ' , num_list[1 ] for i in range(2 , n): num = num_list[i-1] + num_list[i-2 ] num_list.append(num) print ' fib數列第%s個數是:%s ' % (i+1 , num_list[i]) fib( 100)
?
?
12.什么是lambda函數?下面這段代碼輸出是什么?
# 匿名函數就是不用定義函數名,寫成一行的實用小函數,可直接賦值給一個變量使用,也可直接傳參使用。# 求20以內的質數
nums = range(2, 20)for?i in?nums:
nums = filter(lambda?x: x == i or?x % i, nums)print?nums
?
13.說說用過的幾種爬蟲框架及它們的優缺點,用過哪些解析Html的python庫?
"""
pyspider的優點是簡單,立刻就能上手,腳本編寫規則。懂了的話,一小時寫甚至可以寫十多個爬蟲。
scrapy的優點是自定義程度高,適合學習研究爬蟲技術,要學習的相關知識也較多,故而完成一個爬蟲的時間較長。
beautifulsoup4
urllib
requests
"""
?
14.談一下對于多線程的理解,對于cou密集型和IO密集型怎么使用多線程,說說線程池,線程鎖的用法,有沒有用過multiprocessing或concurrent,futures?
答案:略。
?
1 5 . Python 的特點和優點是什么?
答案:略。
?
16 . 深拷貝和淺拷貝的區別是什么?
深拷貝是將對象本身復制給另一個對象。這意味著如果對對象的副本進行更改時不會影響原對象。在 Python 中,我們使用 deepcopy()函數進行深拷貝,使用方法如下:
>>> import copy
>>> b=copy.deepcopy(a)
淺拷貝是將對象的引用復制給另一個對象。因此,如果我們在副本中進行更改,則會影響原對象。使用 copy()函數進行淺拷貝,使用方法如下:
>>> b=copy.copy(a)
?
17 、 TRY EXCEPT FINALLY 的執行順序
try…except…except…[else…][finally…]
執行 try下的語句,如果引發異常,則執行過程會跳到except語句。對每個except分支順序嘗試執行,如果引發的異常與except中的異常組匹配,執行相應的語句。如果所有的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。
try下的語句正常執行,則執行else塊代碼。如果發生異常,就不會執行;如果存在finally語句,最后總是會執行。
?
18 .? ?Python里面如何生成隨機數?
答: random模塊
隨機整數: random.randint(a,b):返回隨機整數x,a<=x<=b
random.randrange(start,stop,[,step]):返回一個范圍在(start,stop,step)之間的隨機整數,不包括結束值。
隨機實數: random.random( ):返回0到1之間的浮點數
random.uniform(a,b):返回指定范圍內的浮點數
?
?
19 . 用一個例子解釋Python中的繼承。
繼承允許一個類獲得另一個類的所有成員 (比如屬性和方法)。繼承提供代碼可重用性,使創建和維護應用程序變得更容易。我們繼承的類稱為super-class,繼承的類稱為派生/子類。
以下是 Python支持的不同類型的繼承:
a.? 單一繼承 - 派生類獲取單個超類的成員。
b.?Multi-level繼承 - 從基類base1繼承的派生類d1,d2繼承自base2。
c. 分層繼承 - 從一個基類可以繼承任意數量的子類
d. 多重繼承 - 派生類從多個基類繼承。
?
20 . 解釋Flask是什么及其好處?
Flask是基于“Werkzeug,Jinja2和良好意圖”BSD許可證的Python網絡微框架。 Werkzeug和Jinja2是它的兩個依賴項。這意味著它對外部庫幾乎沒有依賴性。它使框架變得輕盈,只是少量依賴于更新和更少的安全性錯誤。
會話基本上允許您記住從一個請求到另一個請求的信息。在 flask中,會話使用簽名的cookie,以便用戶可以查看會話內容并進行修改。當且僅當有密鑰Flask.secret_key,用戶可以修改會話。
?
21 .?什么是負指數,為什么使用它們?
Python中的序列是索引的,它由正數和負數組成。正的數字使用'0'作為第一個索引,'1'作為第二個索引,以此類推。
負數的索引從 '-1'開始,表示序列中的最后一個索引,' - 2'作為倒數第二個索引,依次類推。
?
22 .?如何用Python來進行查詢和替換一個文本字符串?
可以使用 sub()方法來進行查詢和替換,sub方法的格式為:
a. ?sub(replacement, string[,count=0])
b. replacement是被替換成的文本
c. string是需要被替換的文本
d. count是一個可選參數,指最大被替換的數量
?
2 3.?解釋一下python的and-or語法
與 C表達式 bool ? a : b類似,但是bool and a or b,當 a 為假時,不會象C表達式 bool ? a : b 一樣工作
應該將 and-or 技巧封裝成一個函數:
defchoose(bool, a,b):return(booland[a]or[b])[0]
因為 [a] 是一個非空列表,它永遠不會為假。甚至 a 是 0 或 '' 或其它假值,列表[a]為真,因為它有一個元素。
?
?
23 .?單引號,雙引號,三引號的區別?
單引號和雙引號是等效的,如果要換行,需要符號 (\),三引號則可以直接換行,并且可以包含注釋
如果要表示 Let’s go?這個字符串
單引號 : s4 = ‘Let\’s go’
雙引號: s5 = “Let’s go”
s6 = ‘I realy like“python”!’
這就是單引號和雙引號都可以表示字符串的原因了。
?
24 .?當退出 Python 時是否釋放所有內存分配?
答案是否定的。那些具有對象循環引用或者全局命名空間引用的變量,在 Python 退出是往往不會被釋放
另外不會釋放 C 庫保留的部分內容。
?
25 .?Python里面search()和match()的區別?
match()函數只檢測RE是不是在string的開始位置匹配,search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none 。
?
26 .?如何在Python中隨機化列表中的項目?
考慮下面顯示的示例:
from random import shuffle x = [ ' Keep ' , ' The ' , ' Blue ' , ' Flag ' , ' Flying ' , ' High ' ] shuffle(x) print (x)
以下代碼的輸出如下。
['Flying', 'Keep', 'Blue', 'High', 'The','Flag']
?
27、 __new__.__init__區別,如何實現單例模式,有什么優點
__new__是一個靜態方法,__init__是一個實例方法
__new__返回一個創建的實例,__init__什么都不返回
__new__返回一個cls的實例時后面的__init__才能被調用
當創建一個新實例時調用__new__,初始化一個實例時調用__init__
?
28、深淺拷貝
淺拷貝只是增加了一個指針指向一個存在的地址,而深拷貝是增加一個指針并且開辟了新的內存,這個增加的指針指向這個新的內存,
采用淺拷貝的情況,釋放內存,會釋放同一內存,深拷貝就不會出現釋放同一內存的錯誤
?
29、HTTP/IP相關協議,分別位于哪層
http協議是超文本傳輸協議,http協議是基于TCP/IP通信協議來傳遞數據
http協議工作與c/s架構上,瀏覽器作為http的客戶端通過URL向http服務端即web服務器發送所用請求。web服務器收到所有請求后,向客戶端發送響應信息,
http特點是短連接,無狀態
地址欄鍵輸入URL,按下回車之后經歷了什么?
1.瀏覽器向DNS服務器請求解析該URL中的域名所對應的IP地址
2.解析出IP地址后,根據IP地址和默認端口80,和服務器建立TCP連接
3.瀏覽器發出讀取文件的http請求,該請求報文作為TCP三次握手的第三個報文的數據發送給服務器
4.服務器對瀏覽器請求做出響應,并把對應的html文件發送給瀏覽器
5.釋放TCP連接
6.瀏覽器將該HMTL渲染并顯示內容
?
30、TCP/UDP區別
TCP協議是面向連接,保證高可靠性(數據無丟失,數據無失序,數據無錯誤,數據無重復達到)傳輸層協議
UDP:數據丟失,無秩序的傳輸層協議(qq基于udp協議)
?
31、webscoket
websocket是基于http協議的,可持續化連接
輪詢:瀏覽器每隔幾秒就發送一次請求,詢問服務器是否有新消息
長輪詢:客戶端發起連接后,如果沒有消息,就一直不返回response給客戶端,直到有消息返回,返回完之后,客戶端再次發起連接
?
32、RabbitMQ:
服務器端有Erlang語言來編寫,支持多種客戶端,只會ajax,用于分布式系統中存儲轉發消息,在易用性、擴展性、高可用性的方面不俗。
connection是RabbitMQ的socket連接,它封裝了socket部分相關協議邏輯
connectionFactroy為connection的制造工廠
channel是我們與RabbitMQ打交道的最重要的一個接口,大部分的業務操作是在chaanel這個接口中完成,包括定義Queue、定義Exchange、
綁定Queue與Exchange,發布消息等
?
33、裝飾器
調用裝飾器其實是一個閉包函數,為其他函數添加附加功能,不修改被修改的源代碼和不修改被修飾的方式,裝飾器的返回值也是一個函數對象。
比如:插入日志、性能測試、事物處理、緩存、權限驗證等,有了裝飾器,就可以抽離出大量與函數功能本身無關的雷同代碼并繼續重用。
34、閉包
1.必須有一個內嵌函數
2.內嵌函數必須引用外部函數的變量(該函數包含對外作用域而不是全局作用域名字的引用)
3.外部函數的返回值必須是內嵌函數
?
35、迭代器與生成器
迭代可迭代對象對應_iter_(方法)和迭代器對應_next_(方法)的一個過程
生成器:包括含有yield這個關鍵字,生成器也是迭代器,調動next把函數變成迭代器。
?
36、classmethod,staticmethod,property
類方法:將類的函數轉換成類方法,函數上裝飾@classmethod會將函數的自動傳值參數改成cls
靜態方法:此方法相當于給類擴展一個功能,將類內的函數實例化,給類或對象使用,此時類內的函數就是普通函數,不管是類還是實例化的對象都可以使用
實例化:類的實例化就會產生一個實例(對象),可以理解為類()把虛擬的東西實例化,得到具體存在的值
37、HTTP常用的狀態碼
200--服務器成功返回網頁
204--請求收到,但返回信息為空
304--客戶端已經執行了GET,但文件未變化
400--錯誤請求,如語法錯誤
403--無權限訪問
404--請求的頁面不存在
500--服務器產生內部錯誤
?
38、多進程,多線程,協程,GIL
GIL:全局解釋器鎖,是鎖在cpython解釋器上,導致同一時刻,同一進程只能有一個線程被執行
多進程:多進程模塊multiprocessing來實現,cpu密集型,IO計算型可以用多進程
多線程:多線程模塊threading來實現,IO密集型,多線程可以提高效率
協程:依賴于geenlet,對于多線程應用。cpu通過切片的方式來切換線程間的執行,遇到IO操作自動切換,線程切換時需要耗時,
而協成好處沒有切換的消耗,沒有鎖定概念。
進程:是資源管理單位,進行是相互獨立的,實現并發和并發
線程:是最小的執行單位,線程的出現為了降低上下文切換的消耗,提供系統的并發性
?
39、IO多路復用/異步非阻塞
IO多路復用:通過一種機制,可以監聽多個描述符 select/poll/epoll
select:連接數受限,查找配對速度慢,數據由內核拷貝到用戶態
poll:改善了連接數,但是還是查找配對速度慢,數據由內核拷貝到用戶態
epoll:epoll是linux下多路復用IO接口,是select/poll的增強版,它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率
異步非阻塞:異步體現在回調上,回調就是有消息返回時告知一聲兒進程進行處理。非阻塞就是不等待,不需要進程等待下去,
繼續執行其他操作,不管其他進程的狀態。
?
40、PEP8規范,規范的好處是什么?
1.縮進:4個空實現縮進,盡量不使用Tab
2.行:沒行最大長度不超過79,換行可以使用反斜杠
3.命名規范:
4.注釋規范:
?
41、range-and-xrange
都在循環時使用,xrange內存性能更好,xrange用法與range完全相同,range一個生成list對象,xrange是生成器
?
42、with上下文機制原理
_enter_和_exit_,上下文管理協議,即with語句,為了讓一個對象兼容with語句,必須在這個對象類中聲明_enter_和_exit_方法,
使用with語句的目的就是把代碼塊放入with中執行,with結束后,自動完成清理工作,無須收到干預
?
43、經典類、新式類
經典類遵循:深度優先,python2中
新式類遵循:廣度優先,Python3中
?
44、有沒有一個工具可以幫助查找Python的bug和進行靜態的代碼分析?
PyChecker是一個Python代碼的靜態分析工具,它可以幫助查找Python代碼的bug,會對代碼的復雜度和格式提出警告,
Pylint是另外一個工具可以進行codingstandard檢查
45、 Python是如何進行內存管理的
1.對象引用計數:
引用計數增加的情況:
來保持追蹤內存中的對象,所有對象都用引用計數,一個對象分配一個新名稱
將其放入一個容器中(列表,字典,元祖)
引用計數減少的情況:
使用del語句對對象別名顯示的銷毀
引用超出作用域或被重新賦值
sys.getrefcount()函數可以獲得對象的當前引用計數
2.標記-清除機制
3.分代技術
?
46、什么是python?使用python有什么好處?
python是一種編程語言,它有對象、模塊、線程、異常處理和自動內存管理。它簡潔,簡單、方便、容易擴展、有許多自帶的數據結果,而且它開源
47、什么是pickling和unpickling?
Pickle模塊讀入任何python對象,將它們轉換成字符串,然后使用dump函數將其轉儲到一個文件中——這個過程叫做pickling
反之從存儲的字符串文件中提取原始python對象的過程,叫做unpickling
?
48、python是如何被解釋的?
Python是一種解釋性語言,它的源代碼可以直接運行,Python解釋器會將源代碼轉換成中間語言,之后再翻譯成機器碼再執行
49、數組和元祖之間的區別是什么?
數組和元祖之間的區別:數組內容可以被修改,而元祖內容是只讀的,不可被修改的,另外元祖可以被哈希,比如作為字典的key
?
50、參數按值傳遞和引用傳遞是怎么實現的?
python中的一切都是類,所有的變量都是一個對象的引用。引用的值是由函數確定的,因此無法被改變,但是如果一個對象是可以被修改的,你可以改動對象
?
51、Python都有哪些自帶的數據結構?
Python自帶的數據結構分為可變和不可變的:可變的有:數組、集合、字典,不可變的是:字符串、元祖、整數
?
52、什么是python的命名空間?
在python中,所有的名字都存在于一個空間中,它們在改空間中存在和被操作——這就是命名空間,它就好像一個盒子,在每個變量名字都對應裝著一個對象,
當查詢變量的時候,會從該盒子里面尋找相應的對象
?
53、python中的unittest是什么?
在python中,unittest是python中的單元測試框架,它擁有支持共享搭建、自動測試、在測試中暫停代碼、將不同測試迭代成一組
?
54、*args與**kwargs
*args代表位置參數,它會接收任意多個參數并把這些參數作為元祖傳遞給函數。**kwargs代表的關鍵字參數,返回的是字典,位置參數一定要放在關鍵字前面
55、在Python中什么是slicing?
slicing是一種在有序的對象類型中(數組、元祖、字符串)節選某一段的語法
56、python中的docstring是什么?
Python中文檔字符串被稱為docstring,它在Python中的作用是為函數、模塊和類注釋生成文檔
?
57、os與sys區別
os是模塊負責程序與操作系統的交互,提供了訪問操作系統底層的接口
sys模塊是負責程序與python解釋器的交互,提供了一系列的函數和變量,用于操控Python時運行的環境
58、實現一個單例模式
_new_()在 _init_()之前被調用,用于生成實例對象。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。
單例模式是指創建唯一對象,單例模式設計的類只能實例,實例化1個對象
class Singleton(object): __instance = None def __init__ (self): pass def __new__ (cls, *args, ** kwargs): if Singleton. __instance is None: Singleton. __instance =object. __new__ (cls,*args,** kwargs) return Singleton. __instance
?
?
59、閉包
寫一個函數,接收整數參數n,返回一個函數,函數的功能是把函數的參數和n相乘并把結果返回。
def mulby(num): def gn(val): return num * val return gn zw = mulby(7 ) print (zw(9));
?
60、一行代碼交換兩個變量值
a=8 b =9 答案: (a,b) = (b,a)
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
