Python麵試問題和答案
基本的Python麵試問題
Q1。列表和元組有什麽區別?
LIST | TUPLES |
列表是可變的,即可以編輯。 | 元組是不可變的(元組是無法編輯的列表)。 |
列表比元組慢。 | 元組比列表更快。 |
語法:list_1 = [10,’Chelsea’,20] | 語法:tup_1 =(10,’Chelsea’,20) |
Q2。 Python的主要特點是什麽?
- Python是一個解釋型語言。這意味著,與C語言及其變體不同,Python在運行之前不需要編譯。其他解釋語言包括PHP和 Ruby 。
- Python是動態類型,這意味著當您聲明變量時,您不需要聲明變量的類型。你可以做的事情
x=111,
接著x="I'm a string",這
沒毛病。 - Python非常適合麵向對象的編程因為它允許類的定義以及組合和繼承。 Python沒有訪問說明符(比如C++的
public
,private
),這一點的理由是“我們都是成年人”。 - 在Python中,函數是first-class對象。這意味著它們可以分配給變量,從其他函數返回並傳遞給函數。類也是first-class對象。
- 編寫Python代碼很快但運行它通常比編譯語言慢。幸運的是,Python允許包含基於C的擴展,因此瓶頸可以被優化掉並且經常被優化。
numpy
包就是一個很好的例子,它真的非常快,因為很多數字運算它實際上並不是由Python完成的。 - Python在許多領域中被使用 – 例如:Web應用程序,自動化,科學建模,大數據應用程序等等。它也經常被用作膠水“glue”代碼,以使其他語言和組件發揮得很好。
Q3。深拷貝和淺拷貝有什麽區別?
答: 淺拷貝在創建新實例類型時會用到,並保留在新實例中複製的值。淺拷貝用於複製引用指針,就像複製值一樣。這些引用指向原始對象,並且在類的任何成員中所做的更改也將影響它的原始副本。淺拷貝允許更快地執行程序,它取決於所使用的數據的大小。
深拷貝用於存儲已複製的值。深層複製不會將引用指針複製到對象。它引用一個對象,並存儲一些其他對象指向的新對象。原始副本中所做的更改不會影響使用該對象的任何其他副本。由於為每個被調用的對象創建了某些副本,因此深層複製會使程序的執行速度變慢。
Q4。如何在Python中實現多線程?
答:
- Python有一個multi-threading包,但是如果你想讓multi-thread加速你的代碼,那麽使用它通常不是一個好主意。
- Python有一個名為Global Interpreter Lock(GIL)的結構。 GIL確保隻有一個“線程”可以在任何時候執行。一個線程獲取GIL,做一點工作,然後將GIL傳遞到下一個線程。
- 這種情況很快發生,因此對於人眼看來,您的線程似乎並行執行,但它們實際上隻是輪流使用相同的CPU核心。
- 所有這些GIL傳遞都增加了執行的開銷。這意味著如果您想讓代碼運行得更快,那麽使用線程包通常不是一個好主意。
Q5。如何在python中使用三元運算符?
答: 三元運算符是用於顯示條件語句的運算符。這包含用於評估為true或false值的語句。
句法:
三元操作符語法如下,
[on_true] if [expression] else [on_false]
例:
x,y = 25,50
big = x if x < y else y
如果x <y為真,則返回值為big = x,如果不正確則返回big = y作為結果。
Q6。如何在Python中管理內存?
答:
- python中的內存管理由Python私有堆空間。所有Python對象和數據結構都位於私有堆中。程序員無權訪問此私有堆。 python解釋器負責處理這個問題。
- Python對象的堆空間分配由Python的內存管理器完成。核心API提供了一些程序員編寫代碼的工具。
- Python還有一個內置的垃圾收集器,它可以回收所有未使用的內存,並使其可用於堆空間。
Q7。用一個例子解釋Python中的繼承。
答: 繼承允許一個類獲得另一個類的所有成員(比如屬性和方法)。繼承提供代碼可重用性,使創建和維護應用程序變得更容易。我們繼承的類稱為super-class,繼承的類稱為派生/子類。
以下是Python支持的不同類型的繼承:
- 單一繼承 – 派生類獲取單個超類的成員。
- Multi-level繼承 – 從基類base1繼承的派生類d1,d2繼承自base2。
- 分層繼承 – 從一個基類可以繼承任意數量的子類
- 多重繼承 – 派生類從多個基類繼承。
Q8。解釋Flask是什麽及其好處?
答: Flask是基於“Werkzeug,Jinja2和良好意圖”BSD許可證的Python網絡微框架。 Werkzeug和Jinja2是它的兩個依賴項。這意味著它對外部庫幾乎沒有依賴性。它使框架變得輕盈,隻是少量依賴於更新和更少的安全性錯誤。
會話基本上允許您記住從一個請求到另一個請求的信息。在flask中,會話使用簽名的cookie,以便用戶可以查看會話內容並進行修改。當且僅當有密鑰Flask.secret_key,用戶可以修改會話。
Q9。 Python中 help()和 dir()函數的用途是什麽?
答: Help()和 dir()這兩個函數都可以從Python解釋器訪問,並用於查看內置函數的合並轉儲。
- Help()函數: help()函數用於顯示文檔字符串,還可以幫助您查看與模塊,關鍵字,屬性等相關的幫助。
- Dir()函數: dir()函數用於顯示定義的符號。
Q10。每當Python退出時,為什麽不是所有的內存都是de-allocated?
答:
- 每當Python退出時,特別是那些對其他對象具有循環引用的Python模塊或從全局命名空間引用的對象並不總是de-allocated或被釋放。
- 不能de-allocate由C庫保留的那些內存部分。
- 退出時,由於擁有自己的高效清理機製,Python會嘗試de-allocate /銷毀其他所有對象。
Q11。 Python中的字典是什麽?
答: Python中的內置數據類型稱為字典。它定義了鍵和值之間的one-to-one關係。字典包含一對鍵及其對應的值。字典由鍵來索引。
我們來舉個例子:
以下示例包含一些鍵,Country, Capital & PM,它們的相應值分別是印度,德裏和莫迪。
dict={'Country':'India','Capital':'Delhi','PM':'Modi'}
print dict[Country]
India
print dict[Capital]
Delhi
print dict[PM]
Modi
Q12。什麽是Python monkey補丁?
答: 在Python中,術語monkey補丁僅指run-time上的類或模塊的動態修改。
考慮以下示例:
# m.py class MyClass: def f(self): print "f()"
然後我們可以像這樣運行monkey-patch測試:
import m def monkey_f(self): print "monkey_f()" m.MyClass.f = monkey_f obj = m.MyClass() obj.f()
輸出如下:
monkey_f()
我們可以看到,在模塊之外,我們確實對函數f()的行為做了一些改變,實際執行的是函數monkey_f(),。
Q13。這是什麽意思: *args
,**kwargs
?我們為什麽要用呢?
答: 我們用*args
當我們不確定將多少個參數傳遞給函數時,或者我們是否要將存儲的列表或參數元組傳遞給函數時。**kwargs
當我們不知道將多少關鍵字參數傳遞給函數時,或者它可以用於將字典的值作為關鍵字參數傳遞時使用。標識符args
和kwargs
是一個約定,你也可以使用*bob
和**billy,
但這不是明智之舉。
Q14。寫一個one-liner,它將計算文件中的大寫字母數。即使文件太大而無法放入內存,您的代碼也應該可以正常工作。
答: 我們先寫一個多行解決方案,然後將其轉換為一個班輪代碼。
with open(SOME_LARGE_FILE) as fh: count = 0 text = fh.read() for character in text: if character.isupper(): count += 1
我們現在嘗試將其轉換為單行。
count sum(1 for line in fh for character in line if character.isupper())
Q15。什麽是負指數,為什麽使用它們?
答: Python中的序列是索引的,它由正數和負數組成。正的數字使用’0’作為第一個索引,’1’作為第二個索引,以此類推。
負數的索引從’-1’開始,表示序列中的最後一個索引,’ – 2’作為倒數第二個索引,依次類推。
Q16。如何在Python中隨機化列表中的項目?
答: 考慮下麵顯示的示例:
from random import shuffle x = ['Keep', 'The', 'Blue', 'Flag', 'Flying', 'High'] shuffle(x) print(x)
以下代碼的輸出如下。
['Flying', 'Keep', 'Blue', 'High', 'The', 'Flag']
Q17。在python中編譯和鏈接的過程是什麽?
答: 編譯和鏈接允許正確編譯新擴展而不會出現任何錯誤,並且隻有在通過編譯過程時才能進行鏈接。如果使用動態加載,則它取決於係統提供的樣式。 python解釋器可用於提供配置設置文件的動態加載,並將重建解釋器。
這需要的步驟如下:
- 使用任何名稱以及係統編譯器支持的任何語言創建文件。例如file.c或file.cpp
- 將此文件放在正在使用的發行版的Modules /目錄中。
- 在Modules /目錄中存在的Setup.local文件中添加一行。
- 使用spam file.o運行該文件
- 成功運行此重建解釋程序後,在top-level目錄中使用make命令。
- 如果文件已更改,則使用命令“make Makefile”運行rebuildMakefile。
Q18。在Python中為數值數據集編寫排序算法。
答: 以下代碼可用於在Python中對列表進行排序:
list = ["1", "4", "0", "6", "9"] list = [int(i) for i in list] list.sort() print (list)
Q19。查看下麵的代碼,記下A0,A1,…的最終值。
A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5))) A1 = range(10) A2 = sorted([i for i in A1 if i in A0]) A3 = sorted([A0[s] for s in A0]) A4 = [i for i in A1 if i in A3] A5 = {i:i*i for i in A1} A6 = [[i,i*i] for i in A1] print(A0,A1,A2,A3,A4,A5,A6)
答: 以下是A0,A1,…… A6的最終輸出
A0 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4} # the order may vary A1 = range(0, 10) A2 = [] A3 = [1, 2, 3, 4, 5] A4 = [1, 2, 3, 4, 5] A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81} A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
Q20。Python解釋“re”模塊的 split(), sub(), subn()方法。
答: 要修改字符串,Python的“re”模塊提供了3種方法。他們是:
- split() – 使用正則表達式將“split”給定字符串放入列表中。
- sub() – 查找正則表達式模式匹配的所有子字符串,然後用不同的字符串替換它們
- subn() – 它類似於 sub(),並且還返回新字符串和替換的序號。
Q21。如何在Python中生成隨機數?
答: 隨機模塊是用於生成隨機數的標準模塊。該方法定義為:
import random random.random
語句random.random()方法返回[0,1]範圍內的浮點數。該函數生成隨機浮點數。隨機類使用的方法是隱藏實例的綁定方法。可以使用Random的實例來顯示創建不同單個線程實例的multi-threading程序。其中使用的其他隨機生成器是:
- randrange(a,b):它選擇一個整數並定義範圍in-between [a,b)。它通過從指定範圍中隨機選擇元素來返回元素。它不構建範圍對象。
- uniform(a,b):它選擇一個在[a,b)範圍內定義的浮點數.Iyt返回浮點數
- normalvariate(mean,sdev):用於正態分布,其中mu是平均值,sdev是用於標準偏差的sigma。
- 使用和實例化的Random類創建一個獨立的多個隨機數生成器。
Q22。range和xrange之間有什麽區別?
答: 在大多數情況下,xrange和range在功能方麵完全相同,它們都提供了一種生成整數列表供您使用的方法。唯一的區別是range返回一個Python列表對象,x range返回一個xrange對象。
這意味著xrange實際上並不像run-time那樣生成靜態列表。它使用稱為yielding的特殊技術根據需要創建值。該技術與一種稱為生成器的對象一起使用。這意味著,如果你有一個非常巨大的範圍,你想生成一個列表,比如10億,xrange就是要使用的功能。
如果你有一個真正的內存敏感係統,例如你正在使用的手機,尤其如此,因為range將使用盡可能多的內存來創建整數數組,這可能導致內存錯誤並導致崩潰程序。
Q23。什麽是pickling and unpickling?
答: Pickle模塊接受任何Python對象並將其轉換為字符串表示形式,並使用dump函數將其轉儲到文件中,此過程稱為pickling。從存儲的字符串表示中檢索原始Python對象的過程稱為unpickling。
Django – Python訪談問題
Q24。Django,Pyramid和Flask之間的差異。
答:
- Flask是“microframework”,主要用於具有更簡單要求的小型應用程序。在Flask中,您必須使用外部庫。
- Pyramid適用於大型應用程序。它提供了靈活性,並允許開發人員為他們的項目使用正確的工具。開發人員可以選擇數據庫,URL結構,模板樣式等。
- Django也可以像Pyramid一樣用於更大的應用程序。
Q25。討論Django架構。
答: Django MVT模式:
數字: Python訪談問題 – Django架構
開發人員提供模型,視圖和模板,然後將其映射到URL,Django可以為用戶提供服務。
Q26。解釋如何在Django中設置數據庫。
答: 您可以使用命令edit mysite /setting.py,它是一個普通的python模塊,模塊級別代表Django設置。
Django默認使用SQLite;對於Django用戶來說這很容易,因此不需要任何其他類型的安裝。如果您的數據庫選擇不同,則必須使用DATABASE’default’項中的以下鍵來匹配您的數據庫連接設置。
- 引擎:您可以使用’django.db.backends.sqlite3’,’django.db.backeneds.mysql’,’django.db.backends.postgresql_psycopg2’,’django.db.backends.oracle’等來更改數據庫
- 名稱:數據庫的名稱。如果您使用SQLite作為數據庫,那麽數據庫將是您計算機上的文件,Name應該是完整的絕對路徑,包括該文件的文件名。
- 如果您沒有選擇SQLite作為數據庫,則必須添加密碼,主機,用戶等設置。
Django使用SQLite作為默認數據庫,它將數據作為單個文件存儲在文件係統中。如果你有數據庫服務器-PostgreSQL,MySQL,Oracle,MSSQL-並且想要使用它而不是SQLite,那麽使用數據庫的管理工具為你的Django項目創建一個新的數據庫。無論哪種方式,在您的(空)數據庫到位的情況下,剩下的就是告訴Django如何使用它。這是項目的settings.py文件的來源。
我們將添加以下代碼行文件:
DATABASES = { 'default': { 'ENGINE' : 'django.db.backends.sqlite3', 'NAME' : os.path.join(BASE_DIR, 'db.sqlite3'), } }
Q27。舉例說明如何在Django中編寫VIEW?
答: 在Django中編寫視圖:
from django.http import HttpResponse import datetime def Current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s</body></html>" % now return HttpResponse(html)
以HTML文檔的形式返回當前日期和時間
Q28。提到Django模板的組成部分。
答: 模板是一個簡單的文本文件。它可以創建任何text-based格式,如XML,CSV,HTML等。模板包含在評估模板時替換為值的變量和控製模板邏輯的標記(%tag%)。
數字:Python麵試問題 – Django模板
Q29。解釋在Django框架中使用session?
答: Django提供的會話允許您在per-site-visitor的基礎上存儲和檢索數據。 Django通過在客戶端放置會話ID cookie並在服務器端存儲所有相關數據來抽象發送和接收cookie的過程。
數字:Python訪談問題 – Django框架
所以數據本身並不存儲在客戶端。從安全角度來看,這很好。
Q30。列出Django中的繼承樣式。
答: 在Django中,有三種可能的繼承樣式:
- 抽象基類:當您隻希望父類包含您不想為每個子模型鍵入的信息時,使用此樣式。
- Multi-table繼承:使用此樣式如果您是sub-classing現有模型並且需要每個模型都有自己的數據庫表。
- 代理模型:您可以使用此模型,如果您隻想修改模型的Python級別行為,而無需更改模型的字段。
網頁抓取 – Python訪談問題
Q31。如何使用我已經知道的URL地址本地保存圖像?
答: 我們將使用以下代碼從URL地址本地保存圖像
import urllib.request urllib.request.urlretrieve("URL", "local-filename.jpg")
Q32。如何獲取任何網址或網頁的Google緩存時限?
答: 使用以下URL格式:
http://webcache.googleusercontent.com/search?q=cache:URLGOESHERE
請務必將“URLGOESHERE”替換為要檢索其緩存的頁麵或站點的正確Web地址,並查看時間。例如,要查看edureka.co的Google Webcache年齡,您需要使用以下網址:
http://webcache.googleusercontent.com/search?q=cache:edureka.co
Q33。您需要從IMDb前250電影頁麵中抓取數據,隻需要字段電影名稱,年份和評級。
答: 我們將使用以下代碼行:
from bs4 import BeautifulSoup import requests import sys url = 'http://www.imdb.com/chart/top' response = requests.get(url) soup = BeautifulSoup(response.text) tr = soup.findChildren("tr") tr = iter(tr) next(tr) for movie in tr: title = movie.find('td', {'class': 'titleColumn'} ).find('a').contents[0] year = movie.find('td', {'class': 'titleColumn'} ).find('span', {'class': 'secondaryInfo'}).contents[0] rating = movie.find('td', {'class': 'ratingColumn imdbRating'} ).find('strong').contents[0] row = title + ' - ' + year + ' ' + ' ' + rating print(row)
上述代碼將有助於從IMDb的前250名列表中刪除數據
數據分析 – Python麵試問題
Q34。什麽是Python中的map函數?
答: Map函數執行作為第一個參數給出的函數,該函數遍曆第二個參數給出的迭代的所有元素的。如果給定的函數包含多於1個參數,則給出了許多迭代。
Q35。如何在NumPy數組中獲得N個最大值的索引?
答: 我們可以使用以下代碼獲取NumPy數組中N個最大值的索引:
import numpy as np arr = np.array([1, 3, 2, 4, 5]) print(arr.argsort()[-3:][::-1])
輸出
[ 4 3 1 ]
Q36。你如何用Python /NumPy計算百分位數?
答: 我們可以使用以下代碼計算百分位數
import numpy as np a = np.array([1,2,3,4,5]) p = np.percentile(a, 50) #Returns 50th percentile, e.g. median print(p)
輸出
3
Q37。 NumPy陣列(arrays)相對(嵌套)Python列表(lists)有哪些優勢?
答:
- Python的列表是高效的general-purpose容器。它們支持(相當)有效的插入,刪除,追加和連接,Python的list comprehension使它們易於構造和操作。
- Python列表的一些限製:它們不支持向量化“vectorized”操作,如元素加法和乘法,並且它們可以包含不同類型的對象這一事實意味著Python必須存儲每個元素的類型信息,並且必須在每個元素上操作時執行類型調度代碼。
- NumPy不僅效率更高;它也更方便。你可以免費獲得大量的向量和矩陣運算,這有時可以避免不必要的工作。
- NumPy數組更快,你可以使用NumPy,FFT,卷積,快速搜索,基本統計,線性代數,直方圖等內置方法。
Q38。解釋裝飾器的用法。
答: Python中的裝飾器用於修改或注入函數或類中的代碼。使用裝飾器,您可以包裝類或函數方法調用,以便在執行原始代碼之前或之後執行一段代碼。裝飾器可用於檢查權限,修改或跟蹤傳遞給方法的參數,將調用記錄到特定方法等。
Q39。 NumPy和SciPy有什麽區別?
答:
- 在理想的世界中,NumPy隻包含數組數據類型和最基本的操作:索引,排序,重塑,基本元素函數等。
- 所有數字代碼都將駐留在SciPy中。但是,NumPy的一個重要目標是兼容性,因此NumPy試圖保留其前任任何一個支持的所有功能。
- 因此,NumPy包含一些線性代數函數,即使它們更恰當地屬於SciPy。無論如何,SciPy包含更多功能更全版本的線性代數模塊,以及許多其他數值算法。
- 如果你使用python進行科學計算,你應該安裝NumPy和SciPy。大多數新功能屬於SciPy而非NumPy。
Q40。如何使用NumPy /SciPy製作3D繪圖/可視化?
答: 與2D繪圖一樣,3D圖形超出了NumPy和SciPy的範圍,但就像2D情況一樣,存在與NumPy集成的包。 Matplotlib在mplot3d子包中提供基本的3D繪圖,而Mayavi使用功能強大的VTK引擎提供各種high-quality 3D可視化功能。
多項選擇題
Q41。以下哪個語句創建字典? (多個正確的答案可能)
a)d = {}
b)d = {“john”:40,“peter”:45}
c)d = {40:“john”,45:“peter”}
d)d =(40:“john”,45:“50”)
回答:b,c, d。
通過指定鍵和值來創建字典。
Q42。其中哪一個是floor division?
a) /
b)//
C) %
d)沒有提到的
回答:b)//
例如,5.0/2 = 2.5,5.0 //2 = 2
Q43。標識符的最大可能長度是多少?
a)31個字符
b)63個字符
c)79個字符
d)以上都不是
回答:d)以上都不是
標識符可以是任意長度。
Q44。為什麽不鼓勵以下劃線開頭的局部變量名?
a)它們用於表示類的私有變量
b)他們混淆了口譯員
c)它們用於表示全局變量
d)他們放慢執行速度
回答:a)它們用於表示類的私有變量
由於Python沒有私有變量的概念,因此前導下劃線用於表示不能從類外部訪問的變量。
Q45。以下哪項是無效聲明?
a)abc = 1,000,000
b)a b c = 1000 2000 3000
c)a,b,c = 1000,2000,3000
d)a_b_c = 1,000,000
回答:b)a b c = 1000 2000 3000
變量名稱中不允許使用空格。
Q46。以下是什麽輸出?
try: if '1' != 1: raise "someError" else: print("someError has not occured") except "someError": print ("someError has occured")
a)發生了someError
b)沒有發生someError
c)無效代碼
d)以上都不是
回答:c)無效代碼
新的異常類必須從BaseException繼承。這裏沒有這樣的繼承。
Q47。假設list1是[2,33,222,14,25],什麽是list1 [-1]?
a)錯誤
b)沒有
c)25
d)2
回答:c)25
索引-1對應於列表中的最後一個索引。
Q48。要打開文件c:\ scores.txt進行編寫,我們使用
a)outfile = open(“c:\scores.txt”,“r”)
b)outfile = open(“c:\\scores.txt”,“w”)
c)outfile = open(file = “c:\scores.txt”,“r”)
d)outfile = open(file = “c:\\scores.txt”,“o”)
回答:b)該位置包含雙斜杠(\\),w用於指示正在寫入文件。
Q49。以下是什麽輸出?
f = None for i in range (5): with open("data.txt", "w") as f: if i > 2: break print f.closed
a)True
b)False
c)None
d)Error
回答:a)True
與open文件一起使用時,WITH語句可確保在with塊退出時關閉文件對象。
Q50。何時執行try-except-else的else部分?
a)總是
b)發生異常時
c)沒有異常發生時
d)當發生異常時至除了塊
回答:c)沒有異常發生時
當沒有異常發生時,執行else部分。
參考資料