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)
4
3、列出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})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM