自學(xué)Python已有一段時間了,就想著找份面試題來檢驗(yàn)一下自己的學(xué)習(xí)情況,今天就和大家分享一份自己從網(wǎng)上找到的貨真價實(shí)的Python面試題,每道題目看似簡單,但如果基礎(chǔ)知識不牢固,很容易回答不全面。
1. python 常用數(shù)據(jù)結(jié)構(gòu)有哪些?請簡要介紹一下。
答:Python中常見的數(shù)據(jù)結(jié)構(gòu)可以統(tǒng)稱為容器(container)。序列(如列表和元組)、映射(如字典)以及集合(set)是三類主要的容器。所以,Python常用數(shù)據(jù)結(jié)構(gòu)有:列表、字典、元組、集合。
關(guān)于這個問題,一般也會順帶問:Python中哪些數(shù)據(jù)類型是可變的,哪些是不可變的?
答:可變/不可變是針對該對象所指向的內(nèi)存中的值是否可變來判斷的。如可變類型的數(shù)據(jù)類型有:列表、字典、集合;不可變類型的數(shù)據(jù)類型有:字符串、元組、數(shù)字。
2. 簡要描述 Python 中單引號、雙引號、三引號的區(qū)別。
答:首先,單引號和雙引號在使用時基本上沒有什么區(qū)別;
唯一需要注意的是:
當(dāng)字符串中有單引號時,最好在外面使用雙引號;
當(dāng)有雙引號時,最好在外面使用單引號;
三引號一般不常用,除了用來做注釋外,還可以用來打印多行字符串。特殊用途,是可以打印多行字符串。
3. 如何在一個 function 里面設(shè)置一個全局的變量?
答:全局變量是指定義在函數(shù)外部的變量。全局變量的作用域?yàn)槿帧?/p>
局部變量是指定義在函數(shù)內(nèi)部的變量。局部變量的作用域?yàn)楹瘮?shù)內(nèi),除了函數(shù)就無效了。
例如:
num=100deffunc():globalnumnum=200num+=100print(num)func()print(num)300300
總結(jié):如果要在函數(shù)中給全局變量賦值,需要用global關(guān)鍵字聲明。
4. Python 里面如何拷貝一個對象?(賦值、淺拷貝、深拷貝的區(qū)別)
答:賦值是將一個對象的地址賦值給一個變量,讓變量指向該地址(舊瓶裝舊酒)
淺拷貝就是對引用的拷貝
深拷貝是對對象的資源的拷貝
舉例說明:
(1)
a = ['hello',[1,2,3]]
b = a[:]
print([id(x) for x in a])
print([id(x) for x in b])
a[0] = 'world'
a[1].append(4)
print(a)
print(b)
[34305224, 33841800]
[34305224, 33841800]
['world', [1, 2, 3, 4]]
['hello', [1, 2, 3, 4]]
淺拷貝是在另一塊地址中創(chuàng)建一個新的變量或容器,但是容器內(nèi)的元素的地址均是源對象的元素的地址的拷貝。也就是說新的容器中指向了舊的元素(新瓶裝舊酒)。
(2)
from copy import deepcopy
a = ['hello',[1,2,3]]
b = deepcopy(a)
print([id(x) for x in a])
print([id(x) for x in b])
a[0] = 'world'
a[1].append(4)
print(a)
print(b)
[30766280, 30785352]
[30766280, 31727688]
['world', [1, 2, 3, 4]]
['hello', [1, 2, 3]]
深拷貝是在另一塊地址中創(chuàng)建一個新的變量或容器,同時容器內(nèi)的元素的地址也是新開辟的,僅僅是值相同而已,是完全的副本。也就是說(新瓶裝新酒)。
總 結(jié):
(1)當(dāng)對象為不可變類型時,不論是賦值,淺拷貝還是深拷貝,那么改變其中一個值時,另一個都是不會跟著變化的。
(2)當(dāng)對象為可變對象時,如果是賦值和淺拷貝,那么改變其中任意一個值,那么另一個會跟著發(fā)生變化的;如果是深拷貝,是不會跟著發(fā)生改變的。
5. 如果 custname 字符串的內(nèi)容為 utf-8 的字符,如何將 custname 的內(nèi)容轉(zhuǎn)為 gb18030 的字符串?
答:先將custname編碼格式轉(zhuǎn)換為unicode,再轉(zhuǎn)換為gb18030。即custname.decode(‘utf-8’).encode(‘gb18030’)。
6. 請寫出一段 Python 代碼實(shí)現(xiàn)刪除一個 list 里面的重復(fù)元素。
答:方法(一)利用集合set的特性,元素是非重復(fù)的
a = [1,2,3,4,5,2,3]
def fun1(a):
? ? a = list(set(a))
? ? print(a)
fun1(a)
[1, 2, 3, 4, 5]
方法(二)利用字典的fromkeys來自動過濾重復(fù)值
a = [1,2,3,4,5,2,3]
def fun1(a):
? ? b = {}
? ? b = b.fromkeys(a)
? ? c = list(b.keys())
? ? print(c)
c = fun1(a)
7. 這兩個參數(shù)是什么意思:*args,**kwargs?
答:首先,*args和**kwargs并不是必須這樣寫,只有前面的*和**才是必須的,你可以寫成*var和**vars。
其次,*args和**kwargs主要用于函數(shù)定義,你可以將不定量的參數(shù)傳遞給一個函數(shù)。
其中,*args是用來發(fā)送一個非鍵值對的可變數(shù)量的參數(shù)列表給一個函數(shù);
**kwargs則允許將不定長度的鍵值對,作為參數(shù)傳遞給一個函數(shù),如果你想要在一個函數(shù)里處理帶名字的參數(shù),你應(yīng)該使用**kwargs。
8. 統(tǒng)計如下 list 單詞及其出現(xiàn)次數(shù)。
a=['apple', 'banana', 'apple', 'tomato', 'orange', 'apple', 'banana', 'watermeton']
答:我能想到的最簡單的方法就是用collection庫
from collections import Counter
a = ['apple', 'banana', 'apple', 'tomato', 'orange', 'apple', 'banana', 'watermeton']
b = Counter(a)
print(b)
Counter({'apple': 3, 'banana': 2, 'tomato': 1, 'orange': 1, 'watermeton': 1})
9. 給列表中的字典排序:假設(shè)有如下 list 對象
alist=[{"name":"a", "age":20}, {"name":"b", "age":30}, {"name":"c", "age":25}]
將 alist 中的元素按照 age 從大到小排序。
答:利用list的內(nèi)置函數(shù)sort來進(jìn)行排序
alist=[{"name":"a", "age":20}, {"name":"b", "age":30}, {"name":"c", "age":25}]
alist.sort(key=lambda x:x['age'])
print(alist)
[{'name': 'a', 'age': 20}, {'name': 'c', 'age': 25}, {'name': 'b', 'age': 30}]
10. 寫出下列代碼的運(yùn)行結(jié)果
a = 1
def fun(a):
? a = 2
fun(a)
print(a)
a = []
def fun(a):
? a.append(1)
fun(a)
print(a)
class Person:
? ? name = 'Lily'
p1 = Person()
p2 = Person()
p1.name = 'Bob'
print(p1.name)
print(p2.name)
print(Person.name)
答:第一段代碼的運(yùn)行結(jié)果為:1
第二段代碼的運(yùn)行結(jié)果為:[1]
第三段代碼的運(yùn)行結(jié)果為:
Bob
Lily
Lily
11. 假設(shè)有如下兩個 list:a = ['a', 'b', 'c', 'd', 'e'],b = [1, 2, 3, 4, 5],將 a 中的元素作為 key,b 中元素作為 value,將 a,b 合并為字典。
答:
a = ['a','b','c','d','e']
b = [1,2,3,4,5]
c = dict(zip(a,b))
print(c)
總結(jié)
通過做這份真實(shí)的面試題,我發(fā)現(xiàn)自己對一些知識掌握的比較模糊,基礎(chǔ)知識還有待進(jìn)一步的,導(dǎo)致對一些問題回答的還不夠全面。
最后,我覺得這也是一種學(xué)Python的好方法呀,可以不斷檢驗(yàn)自己的學(xué)習(xí)情況,督促自己不斷進(jìn)步。
小伙伴們,你們做對了幾道呀?歡迎留言交流Python學(xué)習(xí)。