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)式,實例化,多線程多進(jìn)程以及初始化這些都是必須了解的。
##1.在python中,如何交換兩個變量的值?
這個問題,考了python特殊的語法,也就是a, b = b, a,這個表達(dá)式,也是其他語言所沒有的,是只有python自帶的。
##2. 字符串的拼接–如何高效的拼接兩個字符串?
我們都知道python中,拼接字符串可以用”+”來拼接,然而這個方法并不是高效的,因為如果需要拼接的字符串有很多(n個)的情況下,使用”+”的話,python解釋器會申請n-1次內(nèi)存空間,然后進(jìn)行拷貝,因為字符串在python中是不可變的,所以當(dāng)進(jìn)行拼接的時候,會需要申請一個新的內(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>
類是對象的藍(lán)圖和模板,而對象是類的實例。類是抽象的概念,而對象是具體的東西。在面向?qū)ο缶幊痰氖澜缰校磺薪詾閷ο?,對象都有屬性和行為,每個對象都是獨(dú)一無二的,而且對象一定屬于某個類(型)。當(dāng)我們把一大堆擁有共同特征的對象的靜態(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只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(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í)行其他的一些輸出化工作
當(dāng)我們構(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.多線程?
多線程可以共享進(jìn)程的內(nèi)存空間,因此要實現(xiàn)多個線程之間的通信相對簡單,比如設(shè)置一個全局變量,多個線程共享這個全局變量。但是當(dāng)多個線程共享一個資源的時候,可能導(dǎo)致程序失效甚至崩潰,如果一個資源被多個線程競爭使用,那么對臨界資源的訪問需要加上保護(hù),否則會處于“混亂”狀態(tài),比如銀行存100塊錢,最終很可能存不到一百塊多個線程得到的余額狀態(tài)都是0,所有操作都是在0上面加1,從而導(dǎo)致錯誤結(jié)果。這種情況下,鎖就可以得到用處了。多線程并不能發(fā)揮cpu多核特性,因為python解釋器有一個gil鎖,任何線程執(zhí)行前必須獲得GIL鎖,然后每執(zhí)行100條字節(jié)碼,解釋器就會自動釋放GIL鎖讓別的線程有機(jī)會執(zhí)行。
##11.python內(nèi)存管理?
python內(nèi)部使用引用計數(shù),來保持追蹤內(nèi)存中的對象,Python內(nèi)部記錄了對象有多少個引用,即引用計數(shù),當(dāng)對象被創(chuàng)建時就創(chuàng)建了一個引用計數(shù),當(dāng)對象不再需要時,這個對象的引用計數(shù)為0時,它被垃圾回收。所有這些都是自動完成,不需要像C一樣,人工干預(yù),從而提高了程序員的效率和程序的健壯性。
##12.python的filter方法?
filter就像map,reduce,apply,zip等都是內(nèi)置函數(shù),用C語言實現(xiàn),具有速度快,功能強(qiáng)大等 優(yōu)點。
用于過濾與函數(shù)func()不匹配的值, 類似于SQL中select value != ‘a’
相當(dāng)于一個迭代器,調(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'])
# 上面代碼在對每個元素進(jìn)行對比的時候,會以price的值進(jìn)行比較。
##17. python實現(xiàn)單例模式?
這個題考的是python中對單例模式的理解和運(yùn)用,有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. 使用字符串拼接達(dá)到字幕滾動效果?
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ù)返回給定文件名的后綴?
這道題考了正則表達(dá)式的簡單知識點。代碼如下:
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)建、遍歷、拆分及隨機(jī)數(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


