Python基礎(chǔ)面試20題

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