Python基礎(chǔ)面試20題

最近python是真的火,加上有許多公司都在招python方面的程序員,而網(wǎng)上的面試題又總是千篇一律復(fù)制粘貼,在這里博主打算自己寫(xiě)一些python的一些面試題一些是我遇到的,覺(jué)得還不錯(cuò),一些是python必須知道的一些知識(shí)點(diǎn)。相應(yīng)的,自己也在python這條路上,努力做的更好,也希望在測(cè)試自己同時(shí)幫到更多的小白和從別的語(yǔ)言轉(zhuǎn)過(guò)來(lái)的同行們,如果大家喜歡,我會(huì)在以后繼續(xù)拓展更多的面試題的篇幅,在基礎(chǔ)篇中,我將僅僅提到關(guān)于python的基礎(chǔ)。在python基礎(chǔ)中,很明顯我們需要了解python的特性,像面向?qū)ο笏枷耄址牟僮?,推?dǎo)式,實(shí)例化,多線程多進(jìn)程以及初始化這些都是必須了解的。
##1.在python中,如何交換兩個(gè)變量的值?
這個(gè)問(wèn)題,考了python特殊的語(yǔ)法,也就是a, b = b, a,這個(gè)表達(dá)式,也是其他語(yǔ)言所沒(méi)有的,是只有python自帶的。
##2. 字符串的拼接–如何高效的拼接兩個(gè)字符串?
我們都知道python中,拼接字符串可以用”+”來(lái)拼接,然而這個(gè)方法并不是高效的,因?yàn)槿绻枰唇拥淖址泻芏?n個(gè))的情況下,使用”+”的話,python解釋器會(huì)申請(qǐng)n-1次內(nèi)存空間,然后進(jìn)行拷貝,因?yàn)樽址趐ython中是不可變的,所以當(dāng)進(jìn)行拼接的時(shí)候,會(huì)需要申請(qǐng)一個(gè)新的內(nèi)存空間。所以,正確答案是,使用.join(list),因?yàn)樗皇褂昧艘淮蝺?nèi)存空間。
##3. list = [a,a,a,1,2,3,4,5,A,B,C]提取出”12345”
這個(gè)考點(diǎn)考了python的解壓賦值的知識(shí)點(diǎn),即 a,b,c,*middle, e,f,g = list, *middle = [1,2,3,4,5]。注意,解壓賦值提取出來(lái)的是列表。
##4. python的面向?qū)ο螅?/strong>
類是對(duì)象的藍(lán)圖和模板,而對(duì)象是類的實(shí)例。類是抽象的概念,而對(duì)象是具體的東西。在面向?qū)ο缶幊痰氖澜缰?,一切皆為?duì)象,對(duì)象都有屬性和行為,每個(gè)對(duì)象都是獨(dú)一無(wú)二的,而且對(duì)象一定屬于某個(gè)類(型)。當(dāng)我們把一大堆擁有共同特征的對(duì)象的靜態(tài)特征(屬性)和動(dòng)態(tài)特征(行為)都抽取出來(lái)后,就可以定義出一個(gè)叫做“類”的東西。面向?qū)ο笥腥笾е悍庋b、繼承和多態(tài)。
##5. 什么是元類?
同上,我們講到在python中皆為對(duì)象,而元類即是用來(lái)創(chuàng)建類的”東西”。類也是元類的實(shí)例。而在python中,它們要么是類的實(shí)例,要么是元類的實(shí)例,除了type。type實(shí)際上是它自己的元類。元類主要的用途是用來(lái)創(chuàng)建API,比如django的ORM。
##6.python的search和match知識(shí)點(diǎn)?
search和match都在re模塊中,match只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None。search匹配整個(gè)字符串,直到找到一個(gè)匹配。
##7. python中深淺拷貝的區(qū)別?
淺拷貝沒(méi)有拷貝子對(duì)象,所以原對(duì)象發(fā)生改變,其子對(duì)象也發(fā)生了改變,而深拷貝拷貝了子對(duì)象,原對(duì)象發(fā)生改變,其本身也不會(huì)改變。具體的可以看我之前的博客python深淺copy一分鐘掌握
##8. 類的初始化:new() 和 init()?
new()方法用來(lái)實(shí)例化最終的類對(duì)象,在類創(chuàng)建之前被調(diào)用,它在類的主體被執(zhí)行完后開(kāi)始執(zhí)行。
init()方法是在類被創(chuàng)建之后被調(diào)用,用來(lái)執(zhí)行其他的一些輸出化工作
當(dāng)我們構(gòu)造元類的時(shí)候,通常只需要定一個(gè)init()或new()方法,但不是兩個(gè)都定義。但是,如果需要接受其他的關(guān)鍵詞參數(shù)的話,這兩個(gè)方法就要同時(shí)提供,并且都要提供對(duì)應(yīng)的參數(shù)簽名。
##9.類的初始化?
B類繼承A類,在B類自己的基礎(chǔ)上可以調(diào)用A類所有方法,如果A,B同時(shí)擁有init, B會(huì)改寫(xiě)A中的init方法,A類的方法失效。
Super函數(shù)可以調(diào)用A類中的屬性,B類中有同名屬性時(shí),覆蓋A類中的同名屬性。但調(diào)用函數(shù)時(shí),總是先查找它自身的定義,如果沒(méi)有定義,則順著繼承鏈向上插座,知道在某個(gè)父類中找到為止。
B類 init參數(shù)需大于或等于A 父類的init方法,因?yàn)閟uper初始化了,參數(shù)量為父類參數(shù)量。
##10.多線程?
多線程可以共享進(jìn)程的內(nèi)存空間,因此要實(shí)現(xiàn)多個(gè)線程之間的通信相對(duì)簡(jiǎn)單,比如設(shè)置一個(gè)全局變量,多個(gè)線程共享這個(gè)全局變量。但是當(dāng)多個(gè)線程共享一個(gè)資源的時(shí)候,可能導(dǎo)致程序失效甚至崩潰,如果一個(gè)資源被多個(gè)線程競(jìng)爭(zhēng)使用,那么對(duì)臨界資源的訪問(wèn)需要加上保護(hù),否則會(huì)處于“混亂”狀態(tài),比如銀行存100塊錢,最終很可能存不到一百塊多個(gè)線程得到的余額狀態(tài)都是0,所有操作都是在0上面加1,從而導(dǎo)致錯(cuò)誤結(jié)果。這種情況下,鎖就可以得到用處了。多線程并不能發(fā)揮cpu多核特性,因?yàn)閜ython解釋器有一個(gè)gil鎖,任何線程執(zhí)行前必須獲得GIL鎖,然后每執(zhí)行100條字節(jié)碼,解釋器就會(huì)自動(dòng)釋放GIL鎖讓別的線程有機(jī)會(huì)執(zhí)行。
##11.python內(nèi)存管理?
python內(nèi)部使用引用計(jì)數(shù),來(lái)保持追蹤內(nèi)存中的對(duì)象,Python內(nèi)部記錄了對(duì)象有多少個(gè)引用,即引用計(jì)數(shù),當(dāng)對(duì)象被創(chuàng)建時(shí)就創(chuàng)建了一個(gè)引用計(jì)數(shù),當(dāng)對(duì)象不再需要時(shí),這個(gè)對(duì)象的引用計(jì)數(shù)為0時(shí),它被垃圾回收。所有這些都是自動(dòng)完成,不需要像C一樣,人工干預(yù),從而提高了程序員的效率和程序的健壯性。
##12.python的filter方法?
filter就像map,reduce,apply,zip等都是內(nèi)置函數(shù),用C語(yǔ)言實(shí)現(xiàn),具有速度快,功能強(qiáng)大等 優(yōu)點(diǎn)。
用于過(guò)濾與函數(shù)func()不匹配的值, 類似于SQL中select value != ‘a’
相當(dāng)于一個(gè)迭代器,調(diào)用一個(gè)布爾函數(shù)func來(lái)迭代seq中的每個(gè)元素,返回一個(gè)是bool_seq返 回為T(mén)rue的序列
第一個(gè)參數(shù): function or None, 函數(shù)或None
第二個(gè)參數(shù): sequence,序列
##13. 字符串的查詢替換?
考點(diǎn):python的find和replace函數(shù)。
給定一串字符串:
string = 'life is short, I use python' # 返回的為0或正數(shù)時(shí),為其索引號(hào) >>> string.find('life') string.replace('short','long') # replace 將short替換為long >>> life is long, I use python
##14.給定一串排好序的列表,打亂這個(gè)函數(shù)?
這個(gè)題考了python里的shuffle函數(shù)的用法。
# random模塊中的shuffle(洗牌函數(shù)) import random list = [1, 2, 3, 4] random.shuffle(list) print(list)
##15. 裝飾器?
裝飾器是一個(gè)函數(shù),接收一個(gè)函數(shù)返回另一個(gè)函數(shù)。用法如下:
import time from functools import wraps def timethis(func): ''' Decorator that reports the execution time. ''' @wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(func.__name__, end-start) return result return wrapper @timethis def countdown(n): ''' Counts down ''' while n > 0: n -= 1 >>> countdown(100000) countdown 0.008917808532714844 >>> countdown(10000000) countdown 0.87188299392912”
##16.給定一串字典(或列表),找出指定的(前N個(gè))最大值?最小值?
這道題的考點(diǎn)是python內(nèi)的heapq模塊的nlargest() 和 nsmallest(), 而不是min()和max()。這兩個(gè)函數(shù)都能接收關(guān)鍵字參數(shù),用于復(fù)雜的結(jié)構(gòu)數(shù)據(jù)中:
portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65} ] # 參數(shù)3為最大的3個(gè)值(最小的3個(gè)值) cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price']) expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price']) # 上面代碼在對(duì)每個(gè)元素進(jìn)行對(duì)比的時(shí)候,會(huì)以price的值進(jìn)行比較。
##17. python實(shí)現(xiàn)單例模式?
這個(gè)題考的是python中對(duì)單例模式的理解和運(yùn)用,有4個(gè)方法實(shí)現(xiàn)單例模式:
#方法1,實(shí)現(xiàn)__new__方法 #并在將一個(gè)類的實(shí)例綁定到類變量_instance上, #如果cls._instance為None說(shuō)明該類還沒(méi)有實(shí)例化過(guò),實(shí)例化該類,并返回 #如果cls._instance不為None,直接返回cls._instance class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): orig = super(Singleton, cls) cls._instance = orig.__new__(cls, *args, **kw) return cls._instance class MyClass(Singleton): a = 1 one = MyClass() two = MyClass() two.a = 3 print(one.a) #3 #one和two完全相同,可以用id(), ==, is檢測(cè) print(id(one)) #29097904 print(id(two)) #29097904 print(one == two) #True print(one is two) #True print('----------------------方法2--------------------------') #方法2,共享屬性;所謂單例就是所有引用(實(shí)例、對(duì)象)擁有相同的狀態(tài)(屬性)和行為(方法) #同一個(gè)類的所有實(shí)例天然擁有相同的行為(方法), #只需要保證同一個(gè)類的所有實(shí)例具有相同的狀態(tài)(屬性)即可 #所有實(shí)例共享屬性的最簡(jiǎn)單最直接的方法就是__dict__屬性指向(引用)同一個(gè)字典(dict) #可參看:http://code.activestate.com/recipes/66531/ class Borg(object): _state = {} def __new__(cls, *args, **kw): ob = super(Borg, cls).__new__(cls, *args, **kw) ob.__dict__ = cls._state return ob class MyClass2(Borg): a = 1 one = MyClass2() two = MyClass2() #one和two是兩個(gè)不同的對(duì)象,id, ==, is對(duì)比結(jié)果可看出 two.a = 3 print(one.a) #3 print(id(one)) #28873680 print(id(two)) #28873712 print(one == two) #False print(one is two) #False #但是one和two具有相同的(同一個(gè)__dict__屬性),見(jiàn): print(id(one.__dict__)) #30104000 print(id(two.__dict__)) #30104000 print '----------------------方法3--------------------------' #方法3:本質(zhì)上是方法1的升級(jí)(或者說(shuō)高級(jí))版 #使用__metaclass__(元類)的高級(jí)python用法 class Singleton2(type): def __init__(cls, name, bases, dict): super(Singleton2, cls).__init__(name, bases, dict) if not hasattr(cls, '_instance'): cls._instance = None def __call__(cls, *args, **kw): if cls._instance is None: cls._instance = super(Singleton2, cls).__call__(*args, **kw) return cls._instance class MyClass3(object): __metaclass__ = Singleton2 one = MyClass3() two = MyClass3() two.a = 3 print(one.a) #3 print(id(one)) #31495472 print(id(two)) #31495472 print(one == two) #True print(one is two) #True print '----------------------方法4--------------------------' #方法4:也是方法1的升級(jí)(高級(jí))版本, #使用裝飾器(decorator), #這是一種更pythonic,更elegant的方法, #單例類本身根本不知道自己是單例的,因?yàn)樗旧?自己的代碼)并不是單例的 def singleton(cls, *args, **kw): instances = {} def _singleton(): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls] return _singleton @singleton class MyClass4(object): a = 1 def __init__(self, x=0): self.x = x one = MyClass4() two = MyClass4() two.a = 3 print(one.a) #3 print(id(one)) #29660784 print(id(two)) #29660784 print(one == two) #True print(one is two) #True one.x = 1 print(one.x) #1 print(two.x) #1
##18. 實(shí)現(xiàn)一個(gè)斐波那契數(shù)列的生成器?
這道題的考點(diǎn)關(guān)鍵是生成器的yield關(guān)鍵字將一個(gè)普通函數(shù)改造成生成器函數(shù):
def fib(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b yield a def main(): for val in fib(20): print(val) if __name__ == '__main__': main()
##19. 使用字符串拼接達(dá)到字幕滾動(dòng)效果?
import os import time def main(): content = '曹查理的python面試集-基礎(chǔ)篇' while True: # 清理屏幕上的輸出 os.system('cls') # os.system('clear') print(content) # 休眠200毫秒 time.sleep(0.2) content = content[1:] + content[0] if __name__ == '__main__': main()
##20. 設(shè)計(jì)一個(gè)函數(shù)返回給定文件名的后綴?
這道題考了正則表達(dá)式的簡(jiǎn)單知識(shí)點(diǎn)。代碼如下:
def get_suffix(filename, has_dot=False): """ 獲取文件名的后綴名 :param filename: 文件名 :param has_dot: 返回的后綴名是否需要帶點(diǎn) :return: 文件的后綴名 """ pos = filename.rfind('.') if 0 < pos < len(filename) - 1: index = pos if has_dot else pos + 1 return filename[index:] else: return ''
到此這篇關(guān)于Python基礎(chǔ)面試20題 的文章就介紹到這了,更多相關(guān)Python基礎(chǔ)面試題 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- 這篇文章主要介紹了2019Python必刷面試題 (110道),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-02-07
- 這篇文章主要介紹了常見(jiàn)Python面試題目整理小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-02-07
- 這篇文章主要介紹了2019年最新的Python面試題(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-12-30
- 本文給大家分享Python高頻面試題及其答案,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-12-26
- 這篇文章主要介紹了2019Python必刷面試題(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-12-25
- 這篇文章主要介紹了Python經(jīng)典面試題與參考答案,總結(jié)分析了Python面試中各種常見(jiàn)的概念、數(shù)據(jù)結(jié)構(gòu)、算法等相關(guān)操作技巧,需要的朋友可以參考下2019-11-04
- 這篇文章主要介紹了兩道阿里python面試題與參考答案,結(jié)合具體實(shí)例形式分析了Python數(shù)組創(chuàng)建、遍歷、拆分及隨機(jī)數(shù)等相關(guān)操作技巧,需要的朋友可以參考下2019-09-02
- 這篇文章主要介紹了60道硬核Python面試題,論面霸是如何煉成的,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-08-28
關(guān)于Python爬蟲(chóng)面試170道題(推薦)
這篇文章主要介紹了關(guān)于Python爬蟲(chóng)面試170道題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-08-15- Python是目前編程領(lǐng)域最受歡迎的語(yǔ)言。在本文中,我將總結(jié)Python面試中最常見(jiàn)的50個(gè)問(wèn)題。每道題都提供參考答案,感興趣的可以了解下2019-06-26