30道python真實面試題(蒐集到的,看看其實都是基礎)
1、一行程式碼實現1-100之間和
In [1]: sum(range(0,101)) Out[1]: 5050
2、如何在一個函式內部修改全域性變數
利用global修改全域性變數
In [2]: a = 10 In [3]: def fn(): ...: global a ...: a=4 ...: In [4]: fn() In [5]: print(a) 43、列出5給python標準庫
os:提供了不少與作業系統相關聯的函式 sys:通常用於命令列引數 re:正則表示式 math:數學運算 datetime:處理日期時間
4、字典如何刪除和合並字典
使用字典的方法del和update
In [6]: dict1 = {1:'one',2:'two',3:'three'} In [7]: del dict1[1] #刪除字典的鍵值 In [8]: dict1 Out[8]: {2: 'two', 3: 'three'} In [9]: dict2 = {4:'four',5:'five'} In [10]: dict1.update(dict2) #update合併字典 In [11]: dict1 Out[11]: {2: 'two', 3: 'three', 4: 'four', 5: 'five'}
5、談下python的GIL
GIL是python的全域性直譯器鎖,同一程序中假如有多個執行緒執行,一個執行緒在執行python程式的時候會霸佔python直譯器(加一把鎖即GIL),使該程序內的其他執行緒無法執行,等該執行緒執行完後其他執行緒才能執行。如果執行緒執行過程中遇到耗時操作,則直譯器鎖解開,使其他執行緒進行。所以在多執行緒中,執行緒的執行仍是有先後順序的,並不是同時進行。
多程序中因為每個程序都能被系統分配資源,相當於每個有一個python直譯器,所以多程序可以實現多個程序的同時執行,缺點是程序系統資源開銷大。
6、python實現列表去重的方法
先通過集合去重,後再轉換為列表
In [20]: list1 = [4,6,3,4,12,7,5,8] In [21]: a = set(list1) #轉換為集合 In [22]: a Out[22]: {3, 4, 5, 6, 7, 8, 12} In [23]: [x for x in a] Out[23]: [3, 4, 5, 6, 7, 8, 12]
7、fun(*args,**kwargs)中的*args,**kwarg什麼意思?
*args,**kwargs主要用於函式定義,可以將不定數量的引數傳遞給一個函式,這裡的不定意思是:預先並不知道函式使用者會傳遞多少個引數,所以在這個場景下使用這兩個關鍵字。*args是用來發送一個非鍵值對的可變數量的引數列表給函式,來看個例子
In [24]: def dome(arg,*args): ...: print(arg) ...: for i in args: ...: print(i) ...: In [25]: dome(1,5,7,3,8) 1 5 7 3 8
**kwargs允許將不定長度的鍵值對作為引數傳遞給一個函式,如想要在一個函式裡處理帶名字的引數,這時就要使用**kwargs,上個例子
In [28]: def demo(**kwargs): ...: for k,v in kwargs.items(): ...: print(k,v) ...: In [29]: demo(name='marry',age='女') name marry age 女
8、python2和python3的range(100)區別
python2返回列表
python3返回迭代器,節約記憶體
9、一句話解釋什麼樣的語言能夠使用裝飾器?
函式可以作為引數傳遞語言,可以使用裝飾器
10、python內建資料型別那些
整型--int 布林型--bool 字串--str 列表--list 元組--tuple 字典--dict
11、簡述面向物件中__new__和__init__區別
__init__是初始化方法,建立物件後,就立刻被預設呼叫了,可以接收引數,如所示
In [41]: class demo_new: ...: def __init__(self,newnum,newcolor): #__init__方法自動被呼叫,可以接收引數 ...: self.newnum = newnum ...: self.newcolor = newcolor ...: def move(self): ...: print('飛起來') ...: In [42]: demo1 = demo_new(2,'green') #建立物件 In [43]: print(demo1.newcolor) green In [44]: print(demo1.newnum) 2
(1)__new__至少要有一個引數cls,當前類,此引數在例項化時由python直譯器自動識別
(2)__new__必須要有返回值,返回例項化出來的例項,這點在自己實現__new__時要特別注意,可以return父類(通過super(當前類名,cls))__new__出來的例項,或者直接是object的__new__出來的例項
(3)__init__有一個引數self,就是__new__返回的例項,__init__在__new__的基礎上可以完成一些其他初始化動作,__init__不需要返回值
(4)如果__new__建立的是當前類的例項,會自動呼叫__init__函式,通過return語句裡面呼叫__new__函式的第一個引數是cls來保證是當前類例項,如果是其他類的類名,那麼實際建立返滬的就是其他類的例項,其實就不會呼叫其他類__init__函式
In [46]: class A(object): ...: def __init__(self): ...: print('__init__方法',self) ...: def __new__(cls): ...: print('這是cls的ID',id(cls)) ...: print('這是__new__方法',object.__new__(cls)) ...: return object.__new__(cls) ...: In [47]: A() 這是cls的ID 2069068533960 這是__new__方法 <__main__.A object at 0x000001E1BEE0BE48> __init__方法 <__main__.A object at 0x000001E1BEE0BE48> Out[47]: <__main__.A at 0x1e1bee0be48> In [48]: print('這是類A的ID',id(A)) 這是類A的ID 2069068533960
12、簡述with方法開啟處理檔案幫我們做了什麼
In [50]: f = open('./1.txt','wb') In [51]: try: ...: f.write('hello world') ...: except: ...: pass ...: finally: ...: f.close()
開啟檔案在進行讀寫的時候可能會出現一些異常狀況,如果漢族常規的f.open寫,我們需要try,excpet,finally做異常判斷,並且檔案最終不管遇到什麼情況,都要執行finally f.close()關閉檔案,with方法幫我們實現了finally中的f.close()
13、列表[1,2,3,4,5],請使用map()函式輸出[1,4,9,16,25],並使用列表推導式提取出大於10的數,最終輸出[16,25]
map()函式第一個引數是fun,第二個引數一般是list,第三個引數可以寫list,也可不寫
In [52]: list1 = [1,2,3,4,5] In [53]: def fn(x): ...: return x**2 ...: In [54]: res = map(fn,list1) In [55]: res = [i for i in res if i >10] In [56]: print(res) [16, 25]
14、python中生成隨機整數、隨機銷售,0-1之間的小數方法
隨機整數:random.randint(a,b) 區間整數 隨機小數:用numpy庫,利用np.random.randn(5) 生成5個隨機小數 0-1隨機小數:random.random(),注:括號內不傳參
15、避免轉義給字串加那個字母表示原始字串:
r,表示需要原始字串,不轉義特殊字元
16、<div class=’nam’>中國</div>,用正則匹配出標籤裡面的內容(‘中國’),其中class的類名不確定
In [67]: import re In [68]: str1 = '<div class="nam">中國</div>' In [69]: res = re.findall(r'<div class=".*">(.*?)</div>',str1) In [70]: print(res) ['中國']
17、python中斷言方法舉例
assert()方法,斷言成功,則程式繼續執行,斷言失敗,則程式報錯
In [71]: a = 3 In [72]: assert(a>1) In [73]: print("斷言成功,程式繼續向下執行") 斷言成功,程式繼續向下執行 In [74]: b = 5 In [75]: assert(b>9) --------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-75-e543486a620d> in <module> ----> 1 assert(b>9) AssertionError:
18、資料表student有id,name,score,city欄位,其中name中有名字可能重複,需要消除重複行,請寫sql語句
select distinct name from student
19、10個Linux常用命令
ls pwd cd touch rm mkdir tree cp mv cat more grep echo
20、python2和python3區別?
(1)python3使用print必須用小括號包裹列印內容
(2)python2 range(10)返回列表,python3返回迭代器,節約記憶體
(3)python2使用ascii編碼,python3使用uft-8編碼
(4)python2中unicode表示字串序列,str表示位元組序列;python3中str表示字串學歷,byte表示位元組序列
(5)python2中正常顯示中文,引入coding宣告,python3不需要
(6)python2中raw_input()函式,python3中是input()函式
21、列出python中可變資料型別和不可變資料型別,簡述原理
不可變資料型別:數值型、字串型string和遠祖tuple
不可變資料型別:不允許變數的值發生變化,如果改變了變數的值,相當於新建了一個物件,而對於相同的值的物件,記憶體中則只有一個物件地址,可用id()方法檢視
可變資料型別:列表list和字典dict
允許變數的值發生變化,即如果對變數進行了append、+=等操作後,只是改變了變數的值,而新建物件,變數引用的地址也不會變化,不過對於相同的值的不同物件,在記憶體中則會存在不同的物件,即,每個物件都有自己的地址,相當於記憶體中對於同值的物件儲存了多份,這裡不存在引用計數,是實實在在的物件。
In [76]: a = 3 In [77]: b = 3 In [78]: id(a) Out[78]: 1608819872 In [79]: id(b) Out[79]: 1608819872 In [80]: a = [1,2] In [81]: b = [1,2] In [82]: id(a) Out[82]: 2069075295752 In [83]: id(b) Out[83]: 2069084580424
22、s=’abcadbdx’,去重並從小到大排序‘abcdx’
In [85]: s = 'abcadbdx' In [86]: s = set(s) In [87]: s = list(s) In [88]: s.sort(reverse=False) In [89]: res = ''.join(s) In [90]: print(res) abcdx
23、用lambda函式實現兩個數相乘
In [91]: sum1 = lambda a,b:a*b In [92]: print(sum1(4,5)) 20
24、字典根據鍵從小到大排序dict1=
{'name':'sx','age':5000,'city':'西安','tel':'132xxxxxxxxx'}
In [93]: dict1 = {'name':'sx','age':5000,'city':'西安','tel':'132xxxxxxxxx'} In [94]: list1 = sorted(dict1.items(),key=lambda i :i[0],reverse=False) In [95]: print('sorted根據字典鍵排序',list1) sorted根據字典鍵排序 [('age', 5000), ('city', '西安'), ('name', 'sx'), ('tel', '132xxxxxxxxx')] In [96]: new_dict = {} In [97]: for i in list1: ...: new_dict[i[0]]=i[1] ...: In [98]: print('新字典',new_dict) 新字典 {'age': 5000, 'city': '西安', 'name': 'sx', 'tel': '132xxxxxxxxx'}
25、字串a =’not 404 found 張三 99 西安’,每個詞中間都有空格,用正則過濾掉英文和數字,最終輸出;張三 深圳
In [106]: import re In [107]: a = 'not 404 found 張三 99 西安' In [108]: list1 = a.split(" ") In [109]: print(list1) ['not', '404', 'found', '張三', '99', '西安'] In [110]: res = re.findall('\d+|[a-zA-Z]+',a) In [111]: for i in res: ...: if i in list1: ...: list1.remove(i) ...: In [112]: new_str = " ".join(list1) In [113]: print(res) ['not', '404', 'found', '99'] In [114]: print(new_str) 張三 西安
26、用filter方法求出列表所有奇數,並構造新列表,a = [1,2,3,4,5,6,7,8,9,10]
filter()函式用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素構成的新列表。該接收兩個引數,第一個為函式,第二個位序列,序列的每個元素作為引數傳遞給函式進行判斷,返回True或False,最後將返回為True的放到中
In [115]: a = [1,2,3,4,5,6,7,8,9,10] In [116]: def fn(a): ...: return a%2==1 ...: In [117]: newlist = filter(fn,a) In [118]: newlist = [i for i in newlist] In [119]: print(newlist) [1, 3, 5, 7, 9]
27、列表推導式求列表所有奇數,並構造新列表,a=[1,2,3,4,5,6,7,8,9,10]
In [120]: a = [1,2,3,4,5,6,7,8,9,10] In [121]: res = [i for i in a if i%2==1] In [122]: print(res) [1, 3, 5, 7, 9]
28、正則re.complie作用
re.complie是將正則表示式編譯成一個物件,加快速度,並重復使用
29、a=(1,),b=(1),c=(‘1’)分別表示什麼型別資料
In [123]: type((1,)) Out[123]: tuple In [124]: type((1)) Out[124]: int In [125]: type(('1')) Out[125]: str
30、利用collections庫的Counter方法統計字串每個單詞出現的次數
In [130]: from collections import Counter In [131]: a = 'aksfnwoefjaonfakfasojf;sfhwnafsn;sfhowsjfaoemsm,' In [132]: res = Counter(a) In [133]: print(res) Counter({'f': 9, 's': 7, 'a': 6, 'o': 5, 'n': 4, 'w': 3, 'j': 3, 'k': 2, 'e': 2, ';': 2, 'h': 2, 'm': 2, ',': 1})