天天看點

python面試題

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?

答案:略。

15. 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是一個可選參數,指最大被替換的數量

23. 解釋一下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)