天天看點

108 道 Python 面試筆試題超強彙總 - 上部

1、一行代碼實作1--100之和?

利用sum()函數求和

sum(range(0, 101))
           

2、如何在一個函數内部修改全局變量?

利用global 修改全局變量

3、列出5個Python标準庫?

☞ Python3 标準庫概覽 

os:提供了不少與作業系統相關聯的函數

sys:通常用于指令行參數

re:正則比對

math:數學運算

datetime:處理日期時間

4、字典如何删除鍵和合并兩個字典?

del和update方法

In [1]: dict1 = {"name": "zhangsan", "age": 18}                                                                     

In [2]: dict2 = {"gender": "man", "height": 1.82}                                                                   

In [3]: del dict1["age"]                                                                                           

In [4]: dict1                                                                                                      
Out[4]: {'name': 'zhangsan'}

In [5]: dict1.update(dict2)                                                                                        

In [6]: dict1                                                                                                      
Out[6]: {'gender': 'man', 'height': 1.82, 'name': 'zhangsan'}
           

5、談下Python的GIL?

GIL是Python的全局解釋器鎖,同一程序中假如有多個線程運作,一個線程在運作Python程式的時候會霸占Python解釋器(加了一把鎖即GIL),使該程序内的其他線程無法運作,等該線程運作完後其他線程才能運作。如果線程運作過程中遇到耗時操作,則解釋器鎖解開,使其他線程運作。是以在多線程中,線程的運作仍是有先後順序的,并不是同時進行。

多程序中因為每個程序都能被系統配置設定資源,相當于每個程序有了一個Python解釋器,是以多程序可以實作多個程序的同時運作,缺點是程序系統資源開銷大

6、Python實作清單去重的方法?

先通過集合去重,在轉清單

In [1]: li = [1, 2, 2, 3, 3, 3]                                                                                    

In [2]: a = set(li)                                                                                                

In [3]: a                                                                                                          
Out[3]: {1, 2, 3}

In [4]: [x for x in a]                                                                                             
Out[4]: [1, 2, 3]
           

7、fun(*args,**kwargs)中的*args,**kwargs什麼意思?

*args和**kwargs主要用于函數定義。你可以将不定數量的參數傳遞給一個函數。這裡的不定的意思是:預先并不知道函數使用者會傳遞多少個參數給你,是以在這個場景下使用這兩個關鍵字。

*args是用來發送一個非鍵值對的可變數量的參數清單給-一個函數,這裡有個例子幫你了解這個概念:

def demo(a, *args):
    print("輸出:")
    print(a)
    print("------")
    print(args)
    print("------")
    for data in args:
        print(data)


demo(1, 2, 3, 4, 5)

"""
輸出:
1
------
(2, 3, 4, 5)
------
2
3
4
5
"""
           

**kwargs允許你将不定長度的鍵值對,作為參數傳遞給一個函數。如果你想要在一個函數裡處理帶名字的參數,你應該使用**kwargs。這裡有個例子幫你了解這個概念:

def demo(**kwargs):
    print("輸出:")
    for k, v in kwargs.items():
        print(k, v)


demo(name='apollo', gender="man")

"""
輸出:
name apollo
gender man
"""
           

8、Python2和Python3的range(100)的差別?

Python2傳回清單,Python3傳回疊代器,節約記憶體。

9、一句話解釋什麼樣的語言能夠用裝飾器?

函數可以作為參數傳遞的語言,可以使用裝飾器。

10、Python内建資料類型有哪些?

整型   --->   int

布爾型   --->   bool

字元串   --->   str

清單   --->   list

元組   --->   tuple

字典   --->   dict

11、簡述面向對象中__init__和__new__差別?

__init__是初始化方法,建立對象後,就立刻被預設調用了,可接收參數,如圖

108 道 Python 面試筆試題超強彙總 - 上部

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__函數,也不會調用其他類的__init__函數。

108 道 Python 面試筆試題超強彙總 - 上部

12、簡述with方法打開處理檔案幫我我們做了什麼?

108 道 Python 面試筆試題超強彙總 - 上部

打開檔案在進行讀寫的時候可能會出現一些異常狀況,如果按照正常的f.open寫法,我們需要try、except、finally,做異常判斷,并且檔案最終不管遇到什麼情況,都要執行finally f.close()關閉檔案,with方法幫我們實作了finally中f.close(當然還有其他自定義功能,有興趣可以研究with方法源碼)。

13、清單[1,2,3,4,5],請使用map()函數輸出[1,4,9,16,25],并使用清單推導式提取出大于10的數,最終輸出[16,25]?

map()函數第一個參數是fun,第二個參數一般是list,第三個參數可以寫list,也可以不寫,根據需求。

li = [1, 2, 3, 4, 5]

def func(x):
    return x ** 2

a = map(func, li)
b = [x for x in a if x > 10]
print(b)  # [16, 25]
           

14、python中生成随機整數、随機小數、0--1之間小數方法?

随機整數:random.randint(a, b),生成區間内的整數

随機小數:習慣用numpy庫,利用np.random.randn(5)生成5個随機小數

0-1随機小數:random.random(),括号中不傳參

import random
import numpy as np

x = random.randint(1, 20)
print("随機整數:", x)  # 随機整數: 15

x = np.random.randn(5)
print("随機小數:", x)  # 随機小數: [ 0.92587753  0.35187744 -1.96555253  0.33319831 -1.85219944]

x = random.random()
print("0-1随機小數:", x)  # 0-1随機小數: 0.9007093018571225
           

15、避免轉義給字元串加哪個字母表示原始字元串?

r , 表示需要原始字元串,不轉義特殊字元

16、<div class="nam">中國</div>,用正則比對出标簽裡面的内容(“中國”),其中class的類名是不确定的。

import re

str = '<div class="nam">中國</div>'
ret = re.findall(r'<div class=".*">(.*)</div>', str)  # (.*)提取文本
print(ret)  # ['中國']
           

17、Python中斷言方法舉例?

assert()方法,斷言成功,則程式繼續執行,斷言失敗,則程式報錯。

x = 4
assert(x > 2)
print("斷言成功,程式繼續執行")

assert(x > 8)
print("斷言失敗,則程式報錯")
           
108 道 Python 面試筆試題超強彙總 - 上部

18、資料表student有id,name,score,city字段,其中name中的名字可有重複,需要消除重複行,請寫sql語句?

MySQL複習:MySQL資料庫的基本操作、MySQL查詢

select distinct name from student
           

19、10個Linux常用指令?

複習:Linux 的基本指令

ls  pwd  cd  touch  rm  mkdir  tree  cp  mv  cat  more  grep  echo 

20、Python2和Python3差別?列舉5個

1、Python3 使用 print 必須要以小括号包裹列印内容,比如 print('hi')

Python2 既可以使用帶小括号的方式,也可以使用一個空格來分隔列印内容,比如 print 'hi'

2、Python2 range(1,10)傳回清單,python3中傳回疊代器,節約記憶體

3、Python2中使用ascii編碼,python中使用utf-8編碼

4、Python2中unicode表示字元串序列,str表示位元組序列

     Python3中str表示字元串序列,byte表示位元組序列

5、Python2中為正常顯示中文,引入coding聲明,python3中不需要

6、Python2中是raw_input()函數,python3中是input()函數

21、列出python中可變資料類型和不可變資料類型,并簡述原理

不可變資料類型:數值型、字元串型string和元組tuple

不允許變量的值發生變化,如果改變了變量的值,相當于是建立了一個對象,而對于相同的值的對象,在記憶體中則隻有一個對象(一個位址),用id()方法可以列印對象的id。

a = 1
b = a
print(id(a))  # 10919424
print(id(b))  # 10919424
b = b + 1
print(id(b))  # 10919456
           

可變資料類型:清單list和字典dict;

允許變量的值發生變化,即如果對變量進行append、+=等這種操作後,隻是改變了變量的值,而不會建立一個對象,變量引用的對象的位址也不會變化,不過對于相同的值的不同對象,在記憶體中則會存在不同的對象,即每個對象都有自己的位址,相當于記憶體中對于同值的對象儲存了多份,這裡不存在引用計數,是實實在在的對象。

list1 = [1, 2]
list2 = list1
print(id(list1))  # 139906662832712
print(id(list2))  # 139906662832712
list2.append(3)
print(id(list2))  # 139906662832712
           
108 道 Python 面試筆試題超強彙總 - 上部

22、s = "ajldjlajfdljfddd",去重并從小到大排序輸出"adfjl"?

set去重,去重轉成list,利用sort方法排序,reverse=False是從小到大排。

list是不變資料類型,s.sort時候沒有傳回值。

s = "ajldjlajfdljfddd"
l = list(s)  # 将字元串轉化為清單
x = set(l)  # 将清單轉化為集合,目的是去重
l = list(x)  # 再将集合轉化為清單
l.sort(reverse=False)  # 進行排序, reverse=False 從小到大排序,是預設狀态
s = "".join(l)  # 将清單轉化為字元串
print(s)  # adfjl
           

23、用lambda函數實作兩個數相乘?

sum = lambda a, b: a * b  # 函數名 = lambda 參數: 表達式
print(sum(4, 5))  # 20
           

24、字典根據鍵從小到大排序?

dict={"name":"zs","age":18,"city":"深圳","tel":"1362626627"}

dict = {"name": "zs", "age": 18, "city": "深圳", "tel": "1362626627"}
list = sorted(dict, key=lambda i: i[0], reverse=False)  # dict的結果為字典的鍵(key)
print("根據字典鍵排序的鍵:", list)  # 根據字典鍵排序的鍵: ['age', 'city', 'name', 'tel']
new_dict = {}
for key in list:
    new_dict[key] = dict[key]
print("新字典:", new_dict)
# 新字典: {'age': 18, 'city': '深圳', 'name': 'zs', 'tel': '1362626627'}

           

sorted 文法:

    sorted(iterable[, cmp[, key[, reverse]]])

參數說明:

    iterable -- 可疊代對象。

    cmp -- 比較的函數,這個具有兩個參數,參數的值都是從可疊代對象中取出,此函數必須遵守的規則為,大于則傳回1,小于則傳回-1,等于則傳回0。

    key -- 主要是用來進行比較的元素,隻有一個參數,具體的函數的參數就是取自于可疊代對象中,指定可疊代對象中的一個元素來進行排序。

    reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(預設)。

傳回值:

    傳回重新排序的清單。

25、利用collections庫的Counter方法統計字元串每個單詞出現的次數"kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"?

from collections import Counter

str = "kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
res = Counter(str)
print(res)
# Counter({'l': 9, ';': 6, 'h': 6, 'f': 5, 'a': 4, 'j': 3, 'd': 3, 's': 2, 'k': 1, 'g': 1, 'b': 1})
           

26、字元串a = "not 404 found 張三 99 深圳",每個詞中間是空格,用正則過濾掉英文和數字,最終輸出"張三  深圳"?

import re

a = "not 404 found 張三 99 深圳"
list = a.split(" ")
ret = re.findall(r"\d+|[a-zA-Z]+", a)  # | 連接配接多個比對方式,兩邊不能有空格
print(ret)  # ['not', '404', 'found', '99']
for data in ret:
    if data in list:
        list.remove(data)
print(list)  # ['張三', '深圳']
new_a = " ".join(list)
print(new_a)  # 張三 深圳
           

27、filter方法求出清單所有奇數并構造新清單a =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]?

filter() 函數用于過濾序列,過濾掉不符合條件的元素,傳回由符合條件元素組成的新清單。該接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然後傳回 True 或 False,最後将傳回 True 的元素放到新清單。

def fn(x):
    return x % 2 == 1

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = filter(fn, a)  # filter()傳回值是一個對象 <filter object at 0x00000000027F8048>
c = [x for x in b]
print(c)  # [1, 3, 5, 7, 9]
           

28、清單推導式求清單所有奇數并構造新清單,a =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]?

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x for x in a if x % 2 == 1]
print(b)  # [1, 3, 5, 7, 9]
           

29、正則re.complie作用?

re.compile是将正規表達式編譯成一個對象,加快速度,并重複使用。

30、a=(1,)b=(1),c=("1") 分别是什麼類型的資料?

a = (1,)
b = (1)
c = ("1")
print(type(a))  # <class 'tuple'>
print(type(b))  # <class 'int'>
print(type(c))  # <class 'str'>
           

31、兩個清單[1,5,7,9]和[2,2,6,8]合并為[1,2,2,5,6,7,8,9]?

extend可以将另一個集合中的元素逐一添加到清單中,差別于append整體添加。

a = [1, 5, 7, 9]
b = [2, 2, 6, 8]
a.extend(b)
print(a)  # [1, 5, 7, 9, 2, 2, 6, 8]
a.sort(reverse=False)
print(a)  # [1, 2, 2, 5, 6, 7, 8, 9]
           

32、用Python删除檔案和用linux指令删除檔案方法?

python:os.remove (檔案名)

linux:rm 檔案名

33、log日志中,我們需要用時間戳記錄error,warning等的發生時間,請用datetime子產品列印目前時間戳 “2018-04-01 11:38:54”?

順便把星期的代碼也貼上了

import datetime

t = datetime.datetime.now()
print(t)  # 2018-11-09 19:06:19.259846
t1 = t.strftime("%Y-%m-%d %H:%M:%S")
print(t1)  # 2018-11-09 19:06:19
w = t.isoweekday()
print(w)  # 5
time = str(t1) + "  星期:" + str(w)
print(time)  # 2018-11-09 19:06:19  星期:5
           

34、資料庫優化查詢方法?

外鍵、索引、聯合查詢、選擇特定字段等等。

詳情點選連結 ☞ 資料庫優化查詢方法總結

35、請列出你會的任意一種統計圖(條形圖、折線圖等)繪制的開源庫,第三方也行?

pychart、matplotlib

36、寫一段自定義異常代碼?

自定義異常用raise抛出異常

# raise 自定義異常
def fn():
    try:
        for i in range(5):
            if i > 2:
                raise Exception("數字大于2")
    except Exception as e:
        print(e)

fn()
           

37、正規表達式比對中,(.*)和(.*?)比對差別?

(.*)是貪婪比對,會把滿足正則的盡可能多的往後比對。

(.*?)是非貪婪比對,會把滿足正則的盡可能少比對。

import re

str = '<a>abc</a><a>def</a>'

ret = re.findall(r"<a>(.*)</a>", str)
print("貪婪比對:", ret)  # 貪婪比對: ['abc</a><a>def']

ret = re.findall(r"<a>(.*?)</a>", str)
print("非貪婪比對:", ret)  # 非貪婪比對: ['abc', 'def']
           

38、簡述Django的orm?

ORM,全拼Object-Relation Mapping,意為對象-關系映射。

實作了資料模型與資料庫的解耦,通過簡單的配置就可以輕松更換資料庫,而不需要修改代碼,隻需要面向對象程式設計,orm操作本質上會根據對接的資料庫引擎,翻譯成對應的sql語句,所有使用Django開發的項目無需關心程式底層使用的是MySQL、Oracle、sqlite....,如果資料庫遷移,隻需要更換Django的資料庫引擎即可。

108 道 Python 面試筆試題超強彙總 - 上部

39、[[1,2],[3,4],[5,6]]一行代碼展開該清單,得出[1,2,3,4,5,6]?

清單推導式的騷操作 ​ ​ ​

運作過程:for y in a,每個y是[1,2],[3,4],[5,6],for x in y,每個x就是1,2,3,4,5,6,合并後就是結果。

a = [[1, 2], [3, 4], [5, 6]]
new_a = [x for y in a for x in y]
print(new_a)  # [1, 2, 3, 4, 5, 6]
           

還有更騷的方法,将清單轉成numpy矩陣,通過numpy的flatten()方法,代碼永遠是隻有更騷,沒有最騷 ​ ​ ​

import numpy as np
a = [[1, 2], [3, 4], [5, 6]]
new_a = np.array(a).flatten().tolist()
print(new_a)  # [1, 2, 3, 4, 5, 6]
           

40、x="abc",y="def",z=["d","e","f"],分别求出x.join(y)和x.join(z)傳回的結果?

join()括号裡面的是可疊代對象,x插入可疊代對象中間,形成字元串,結果一緻 

x = "abc"
y = "def"
z = ["d", "e", "f"]
m = x.join(y)
n = x.join(z)
print(m)  # dabceabcf
print(n)  # dabceabcf
           

順便建議大家學下os.path.join()方法,拼接路徑經常用到

41、舉例說明異常子產品中try except else finally的相關意義?

try..except..else沒有捕獲到異常,執行else語句。

try..except..finally不管是否捕獲到異常,都執行finally語句。

a = 1
b = int(input("請輸入一個數字:"))
try:
    x = a / b
except Exception as e:
    print("産生錯誤:", e)
else:
    print("沒有捕獲到異常,執行該語句")
finally:
    print("不管是否捕獲異常,都執行該語句")
           
108 道 Python 面試筆試題超強彙總 - 上部
108 道 Python 面試筆試題超強彙總 - 上部

42、Python中交換兩個數值?

方法一:(最簡單) 

a, b = 1, 2
print("a =", a)  # a = 1
print("b =", b)  # b = 2
a, b = b, a
print("a =", a)  # a = 2
print("b =", b)  # b = 1
           

方法二:

a = a + b
b = a - b
a = a - b
           

 方法三:

a = 3  # 0011
b = 6  # 0110
a = a ^ b
"""
    0011
   ^0110
    0101    5
"""
b = b ^ a
"""
    0110
   ^0101
    0011    3
"""
a = a ^ b
"""
    0101
   ^0011
    0110    6
"""
print("a =", a)  # 6
print("b =", b)  # 3
           

43、舉例說明zip()函數用法?

zip()函數在運算時,會以一個或多個序列(可疊代對象)做為參數,傳回一個元組的清單。同時将這些序列中并排的元素配對。

zip()參數可以接受任何類型的序列,同時也可以有兩個以上的參數;當傳入參數的長度不同時,zip能自動以最短序列長度為準進行截取,獲得元組。

a = [1, 2]
b = [5, 6]
ret = [i for i in zip(a, b)]
print(ret)  # [(1, 5), (2, 6)]

a = (1, 2)
b = (5, 6)
ret = [i for i in zip(a, b)]
print(ret)  # [(1, 5), (2, 6)]

a = "ab"
b = "xyz"
ret = [i for i in zip(a, b)]
print(ret)  # [('a', 'x'), ('b', 'y')]
           

44、a="張明 98分",用re.sub,将98替換為100?

import re

a = "張明 98分"
ret = re.sub(r"\d+", "100", a)
print(ret)
           

45、寫5條常用sql語句?

show databases;

show tables;

desc 表名;

select * from 表名;

delete from 表名 where id=5;

update students set gender=0,hometown="北京" where id=5
           

46、a="hello"和b="你好"編碼成bytes類型?

a = "hello"
b = "你好"
a = a.encode()
b = b.encode()
print(a)  # b'hello'
print(b)  # b'\xe4\xbd\xa0\xe5\xa5\xbd'
           

47、[1,2,3]+[4,5,6]的結果是多少?

兩個清單相加,等價于extend。

a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)  # [1, 2, 3, 4, 5, 6]
a.extend(b)
print(a)  # [1, 2, 3, 4, 5, 6]
           

48、提高Python運作效率的方法?

1、使用生成器,因為可以節約大量記憶體;

2、循環代碼優化,避免過多重複代碼的執行;

3、核心子產品用Cython  PyPy等,提高效率;

4、多程序、多線程、協程;

5、多個if elif條件判斷,可以把最有可能先發生的條件放到前面寫,這樣可以減少程式判斷的次數,提高效率。

49、簡述mysql和redis差別?

redis: 記憶體型非關系資料庫,資料儲存在記憶體中,速度快。

mysql:關系型資料庫,資料儲存在磁盤中,檢索的話,會有一定的Io操作,通路速度相對慢。

50、遇到bug如何處理?

1、細節上的錯誤,通過print()列印,能執行到print()說明一般上面的代碼沒有問題,分段檢測程式是否有問題,如果是js的話可以alert或console.log。

2、如果涉及一些第三方架構,會去查官方文檔或者一些技術部落格。

3、對于bug的管理與歸類總結,一般測試将測試出的bug用teambin等bug管理工具進行記錄,然後一條一條進行修改,修改的過程也是了解業務邏輯和提高自己程式設計邏輯缜密性的方法,也都會收藏做一些筆記記錄。

4、導包問題、城市定位多音字造成的顯示錯誤問題。

繼續閱讀