python基礎面試常見題
阿新 • • 發佈:2018-08-09
字節碼 分享 而不是 中文編碼 is和== n) coder 序列 符號 7、b、B、KB、MB、GB的關系?
1、為什麽學習Python?
Python是目前市面上,我個人認為是最簡潔、最優雅、最有前途、最全能的編程語言,沒有之一。
2、通過什麽途徑學習的Python?
通過自學,包括網上查看一些視頻,購買一些相關專業的書籍。
3、Python和Java、PHP、C、C#、C++等其他語言相比?
Python:輕量級、易學、自由/開放源碼軟件、可移植性、支持面向對象、豐富的庫、規範的代碼。
Java:優點:開源性,功能強大,庫多
缺點:編譯速度 比較慢,不完全
PHP:優點:性能很強,配合簡單,穩定,容易部署。
缺點:函數命名不規範,駝峰法和下劃線,傳參位置不一。
C: 優點:能操縱底層,能細粒度優化性能。
缺點: 1、是面向過程的,2、運行時類型檢查不可用,3、不提供命名空間功能,4、構
造函數和析構函數不可用。
C#: 優點: 強大的.NET Framework托管代碼集合類,較簡單的語言特性。WEB應用程序
開發速度快。
缺點:底層和高性能不合適,Windows平臺以外支持有限。
C++: 優點:性能比較高,可進化型。
缺點: 難學,門檻高
4、簡述解釋型和編譯型編程語言?
解釋性語言編寫的程序不需要編譯,在執行的時候,專門有一個解釋器能夠將VB語言翻譯成機器語言,每個語句都是在執行的時候才能編譯,這樣解釋型語言每執行一次就要編譯一次,效率比較低。 編譯型語言:執行代碼之前,有一個專門的編譯過程。把源高級程序編譯成一個機器語言,只做一個翻譯,運行時不需要編譯,所以編譯型語言執行效率比較高。
5、Python解釋器種類以及特點?
1、Cpython:最常用的官方版本,使用C語言實現。使用最為廣泛。
2、Jpython:Python的Java實現,Jpython會將Python代碼動態編譯成Java字節碼,然後在JVM上運行。
3、IronPython:Python的C#實現,IronPython將Python代碼編譯成C#字節碼,然後再CLR運行(與Jpython類似)
4、PYPY(特殊): Python實現的Python,將Python的字節碼再編譯成機器碼。
6、位和字節的關系?
1byte等於8bit
7、b、B、KB、MB、GB的關系?
1bytes(B) = 8bits(b)字節
1KB = 1024Bytes = 2的10次方Bytes
1MB = 1024KB = 2的20次方Bytes
1GB = 1024MB = 2的30次方Bytes
8、請至少列舉5個PEP8規範(越多越好)
1、縮進,4個空格的縮進(編譯器都可以完成此功能),不適用Tab,更不能混合使用Tab和空格
2、每行最大長度為79,換行可以使用反斜杠。最好使用圓括號,換行點再操作符的後邊敲回車。
3、不要再一句import中多個庫。比如import os,sys(不推薦)
4、模塊命名盡量短小,使用全部小寫的方式,可以使用下劃線。
5、包命名盡量短小,使用全部小寫的方式。不可以使用下劃線
6、類的命名使用CapWords的方式,模塊內部使用的類采用--CapWords的方式。
7、函數命名使用全部小寫的方式,可以使用下劃線。
8、異常命名使用CapWords+Error後綴的方式。
9、常量命名使用全部大寫的方式,可以使用下劃線。
10、類的屬性(方法和變量)命名使用全部小寫的方式,可以使用下劃線。
11、類方法第一個參數必須是self,而靜態方法第一個參數必須是cls。
9、通過代碼實現如下轉換:
二進制轉換成十進制:v = “0b1111011”:
先將V變成字符串,然後print(int("0b1111011",2)),結果是123
十進制轉換為二進制:v = 18
Print(bin(v)):0b10010
八進制轉換為十進制:v = "011"
Print(int(v,8)) 結果是:9
十進制轉換成八進制:v = 30
Print(oct(v))結果是:0o36
十六進制轉換成十進制:v = ”0x12“
v = "0x12"
s = str(v)
print(int(s,16))
#18
十進制轉換成十六禁止:v = 87
v = 87
print(hex(v))
#0x57
10、請編寫一個函數實現將IP地址轉換成一個整數。
如 10.3.9.12 轉換規則為:
10 00001010
3 00000011
9 00001001
12 00001100
再將以上二進制拼接起來計算十進制結果:00001010 00000011 00001001 00001100 = ?
def bian(number):
a = str(bin(number))[2:]
if len(a) % 8:
b = [‘0‘ for _ in range(8 - len(a) % 8)]
b.append(a)
return ‘‘.join(b)
a = bian(10)
b = bian(10)
c = bian(10)
d = bian(10)
d = int(a + b + c + d, 2)
print(d)
#168430090
11、python遞歸的最大層數?
def fun(n):
print(n)
n += 1
fun(n)
print(fun(1))
998層,之後就報錯了,允許最大數字在3925 - 3929之間浮動 ,和計算機的性能有關系。
12、求結果:
v1 = 1 or 3 1
v2 = 1 and 3 3
v3 = 0 and 2 and 1 0
v4 = 0 and 2 or 1 1
v5 = 0 and 2 or 1 or 4 1
v6 = 0 or Flase and 1 Flase
13、ascii、unicode、utf-8、gbk區別?
Ascii:早期編碼,只支持英文字母和一些符號
Unicode:萬國碼,能表示多種符號,在PY2中可以指定4字節或2字節表示一個字符,PY3中默認4字節
UTF-8: 用最短的方式表示unicode,一個英文字符占一字節
Gbk:中文編碼。
14、字節碼和機器碼的區別?
機器碼:是電腦CPU直接讀取運行的機器指令,運行速度最快,但是非常難懂,比較難編寫, 一般人接觸不到。
字節碼:是一種中間狀態(中間碼)的二進制代碼(文件)。需要直譯器轉譯後才能成為機器碼。
15、三元運算規則以應用場景?
一行書中寫,代碼非常精煉,執行效率更高,可以代替if...else這樣的流行語句。
16、列舉Python2和Python3的區別?
print:
在PY2中,被視為一個語句,而不是一個函數
在PY3中,被顯示為一個函數。
整數的除法:
PY2中,整數是強類型的。比如5/2 結果是2
PY3中,5/2 結果是2.5
Unicode:
PY2中前綴加u代表Unicode。
PY3中默認使用Unicode,如果想讓3兼容2,可以通過字符串的前面保留‘u’來實現。
後續發展:
PY3和PY2之間最大的區別不是在語法上,而是事實上PY2在2020年後將失去支持,PY3將繼續開發更多的功能,和修復更多的錯誤。
17、用一行代碼實現數值交換:
a = 1
b = 2
a,b = b,a
18、Python3和Python2中int和long的區別?
long整數類型,被PY3廢棄,統一使用int。
19、xrange和range的區別?
PY2中的range返回的是列表,xrange返回的是生成器
PY3中的range返回的是叠代器(測試是class)
20、文件操作時:xreadlines和readlines的區別?
返回類型不同。xreadlines返回的是生成器,readlines返回的是列表
21、列舉布爾值為False的長簡值?
"" , 0, false, [], (), {}
22、字符串、列表、元祖、字典、每個常用的5個方法?
字符串:
.upper() #首字母大寫
.lower() #所有字母大寫
.strip() #去除首尾空格
.replace() #替換
.split() #分割
列表:
.append() #在列表尾部追加一個值
.inset() # 指定位置插入數據
.reverse() #反轉
.remove() #刪除制定元素
.pop() #刪除指定元素
元祖:
.index() #查看元素下標是多少
.len() #計算元祖元素個數
.min() #返回元祖中元素最小值
.max() #返回元祖元素最大值
.tuple() #將列表轉換為元祖
字典:
.clear() #刪除字典所有項
.get() #獲取字典中指定鍵的值
.keys() #以列表的形式返回字典中所有鍵
.values() #以列表的形式返回字典中所有值
.items() #以列表的形式返回字典中的鍵值
23、lambda表達式格式以及應用場景?
lambda x:x + 2
應用場景:函數式編程,閉包
24、pass的作用?
1、空格局。2、保證格式完整性。3、語義完整
25、*arg和**kwarg作用?
*arg:接受額外的位置參數
**kwarg:接受額外的關鍵字參數
26、is和==的區別?
is判斷的是ID的地址
==判斷的是數值
27、簡述Python的深淺拷貝以及應用場景?
淺拷貝:拷貝最外層容器
深拷貝:拷貝的最外層容器,還拷貝容器中的元素
對於不可變元素,使用淺拷貝
28、Python垃圾回收機制?
1、回收計數引用為0的對象,釋放其占用空間
2、循環垃圾回收器。釋放循環引用對象
29、Python的可變類型和不可變類型?
可變類型:list、dict、set、可變集合
不可變類型:string、int、float、tuple、不可變集合
30、求結果v = dict.fromkeys([‘k1‘,‘k2‘],[])v[‘k1’].append(666)print(v)v[‘k1’] = 777print(v)
1 、{‘k1‘: [666], ‘k2‘: [666]}
2、{‘k1‘: 777, ‘k2‘: [666]}
3、因為value是可變對象,並且使用append來添加元素,所有value的對象引用不變。
31、求結果
def num():
return[lambda x:i*x for i in range(4)]
print([m(2) for m in num()])
#[6,6,6,6]
#將return返回生成器表達式就返回[0,2,4,6]
32、列舉常見的內置函數?
len、bin、hex、oct、dir、max、min、type
33、filter、map、reduce的作用?
filter:清晰函數
map:對函數裏的每個內容,執行方法
reduce:累加函數
配合lambda函數來進行使用
34、一行代碼實現9*9乘法表
print(‘\n‘.join([‘ ‘.join([f‘{y} * {x} = {x * y}‘ for y in range(1, x+1)]) for x in range(1,10)]))
35、如何安裝第三方模塊?以及用過哪些第三方模塊?
使用官方推薦的setuptools的包管理工具,easy -- install和pip。
requests模塊
36、至少列舉8個常用模塊都有哪些?
1、sys:用於提供對解釋器相關的訪問以及維護,並有很強的交互功能
2、time: 時間模塊
3、os:用於提供操作系統模塊
4、ashlib:用於加密相關的操作
5、random:生成隨機變量
6、pickle:用於python特有的類和pthon的數據類型間進行轉換
7、datetime:date和time的結合體
8、re:正則表達式模塊
37、re的match和search區別?
match與search函數功能一樣,match匹配字符串開始的第一個位置,search是在字符串全局匹配第一個符合規則的。
38、什麽是正則的貪婪匹配?
盡可能的去匹配符合規則的字符,非貪婪模式後面加?(盡可能少的匹配)
39、求結果:a.[i % 2 for i in range(10)] b.(i % 2 for i in range(10))
1、a = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
2、b = 是生成器表達式(generator)
40、求結果:a. 1 or 2 b. 1 and 2 c. 1 < (2 == 2) d. 1< 2 == 2
a = 1 、 b = 2 、c = false 、d = True
41、def func(a,b=[])這種寫法有什麽坑?
因為b是可變類型,每次調用這個方法b不會每次都初始化[].而是調用相同的[].
42、如何實現”1,2,3“變成[‘1‘, ‘2‘, ‘3‘]?
a = "1 , 2 ,3"
a. split(",")
43、如何實現[‘1‘, ‘2‘ , ‘3‘]變成[1, 2,, 3]?
a = ["1", "2", "3"]
b = [int(x) for x in a]
print(list(map(lambda x: int(x), a)))
44、比較:a = [1, 2, 3]和b = [(1), (2), (3)] 以及b2 = [(1,), (2,), (3,)]的區別?
1、a和b相同,因為只有一個元素的元祖需要加,來表示(1,)
2、b1表示的列表元素為整數,b2表示的是列表元素是元祖
45、如何用一行代碼生成[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]?
print([x ** 2 for x in range(1, 11)])
46、一行代碼實現刪除列表中重復的值?
使用list(set())
47、如何在函數中設置一個全部變量?
Global變量名
48、logging模塊的作用?以及應用場景?
提供了通用的日誌系統。
應用場景,做項目的時候打印日誌,或者是異常
49、請用代碼簡答實現stack
# Stack():創建一個新的空棧
class Stack():
def __init__(self):
self.items = []
# 判斷棧是否為空
def is_empty(self):
return self.items == []
# 添加一個新的元素,item到棧頂
def push(self, item):
self.items.append(item)
# 彈出棧頂元素
def pop(self):
return self.items.pop()
# 返回棧頂元素
def peek(self):
return self.items[len(self.items) - 1]
# 返回棧的元素個數
def size(self):
return len(self.items)
50、常用字符串格式化有哪幾種?
%、format、f
51、簡述生成器、叠代器、可叠代對象、以及應用場景?
1、生成器是叠代器的一種,需要時yiled關鍵字
2、叠代器實現了__next__方法
3、可叠代對象實現了__iter__,__next__方法
4、可叠代對象調用__iter__方法後,返回一個叠代器。
52、用Python實現一個二分查找的函數。
def search(datset, find_num):
if len(datset) > 1:
mid = int(len(datset) / 2)
if datset[mid] == find_num:
print(datset[mid])
elif datset[mid] > find_num:
return search(datset[0: mid], find_num)
else:
return search(datset[mid + 1:], find_num)
else:
if datset[0] == find_num:
print(datset[0])
else:
print("不好意思,沒有這個數字:", find_num)
search(data, 20)
View Code
53、談談你對閉包的理解?
內層函數引用了外層函數的變量,然後返回內層函數的情況,成為閉包。
54、os和sys模塊的作用?
os:系統有關。
sys:解釋器有關。
55、如何生成一個隨機數?
使用random模塊裏的random.random。
56、如何使用python刪除一個文件?
os.remove(path),刪除文件path。如果path是一個目錄,拋出osError錯誤。如果要刪除目錄,請使用rmdir()方法。
57、談談你對面向對象的理解?
體現在三個方面: 封裝、繼承、多態
繼承有兩種方式:
1、將同一類的方法封裝到類中
2、將數據封裝到對象中
繼承:子類擁有父類的所有方法和屬性,
好處:抽取重復代碼,減少代碼冗余。
壞處:耦合性太強。
多態:對於不同的類可以有同名的方法,同名的方法應用到不同的類可以有不同行為。
58、Python面向對象中的繼承有什麽特點?
1、在繼承中基類的構造(__init__()方法)不會被調用,它需要在其派生類的構造親自調用,有別於C#.
2、在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量,區別於在類中調用普通函數不需要帶上self參數。
3、Python總是首先查找對應類型的方法,如果它不能再派生類中找到對應的方法,它才開始到基類中逐個查找。
4、Python裏邊可以繼承多個類,C#、 Java不可以多繼承(如果繼承多個類,繼承順序為從左到右)
59、面向對象深度優先和廣度優先是什麽?
深度優先:不全部保留節點,占用空間小,有回溯操作(即有入棧/出棧操作),運行速度慢。
廣度優先:保留全部節點,占用空間大;無回溯操作(既無入棧、出棧操作)、運行速度快。
60、面向對象中的super的作用?
super()函數是用於調用父類的一個方法。用來解決多重繼承問題的。
61、是否使用過functools中的函數?其作用是什麽?
用過。
作用:把一個函數的某些參數給固定住,返回一個新的函數,調用這個新函數會更簡單。
61、列舉面向對象中帶雙下劃線的特殊方法,如:__new__ 、 __init__
__new__:可以調用其它類的構造方法或者直接返回別的對象來作為本類的實例。
__init__: 負責類的實例化
__call__:對象後邊加括號,出發執行
__str__:print打印一個對象時。
__doc__:類的註釋,該屬性是無法繼承的。
__getattr__:在使用調用屬性(方式、屬性)不存在的時候觸發
__setattr__:添加/修改屬性會觸發它的執行
__dellattr__:刪除屬性的時候會觸發
__delete__:采用del刪除屬性時,觸發
View Code
62、如何判斷是函數還是方法?
函數:是封裝了一些獨立的功能。可以直接調用,python內置了許多函數,同時可以自建函數來使用。
方法:和函數類似,同樣封裝了獨立的功能,但是方法是需要通過對象來調用的,表示針對這個對象要做的操作。
63、靜態方法和類方法區別?
1、靜態方法:相當於普通函數
2、類方法:通過類調用,第一個參數默認是類本身。
64、列舉面向對象中的特殊成員以及應用場景
__new__ : 可以調用其他類的構造方法或者直接返回別的對象來作為本類的實例。
__init__ : 負責類的實例化
__call__對象後邊加括號,觸發執行
__str__ : print打印一個對象時。
__doc__ : 類的註釋,該屬性是無法繼承的。
__getattr__ : 在使用調用屬性(方式,屬性)不存在的時候觸發
__setattr__ : 添加/修改屬性會觸發它的執行
__dellattr__ : 刪除屬性的時候會觸發
__delete__ : 采用del刪除屬性時,觸發
View Code
65、1、2、3、4、5能組成多少個互不相同且無重復的三位數
5*4*3
66、什麽是反射?以及應用場景?
利用字符串獲取對象的屬性或方法。
web框架的CBV配置文件獲取類
67、metaclass作用?以及應用場景?
metaclass是類的產生類,而並非繼承類,
通過它來控制類的產生,以及類實例化的操作。Wtform中實例化自定義form類是執行了其元類的__call__方法。
68、用盡量多的方法實現單例模式。
#使用類
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
# 使用裝飾器
from functools import wraps
def singleton(cls):
instances = {}
@wraps(cls)
def getinstance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return getinstance
@singleton
class MyClass(object):
a = 1
#使用元類
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class MyClass(metaclass=Singleton)
pass
View Code
69、裝飾器的寫法以及應用場景
from functools import wraps
def outer(func):
@wraps(func)
def inner(*args, **kwargs):
"""我就是裝飾器裏的函數"""
func(*args, **kwargs)
return inner
#應用場景:Django的csrf,緩存,Falsk中的許多裝飾器
70、異常處理寫法以及如何主動跑出異常(應用場景)
try:
"""執行語句"""
except: #異常類型
"""觸發異常後執行的語句"""
finally:
"""有沒有異常都執行的語句"""
# 主動拋出異常
raise #異常類實例
71、什麽是面向對象的mro
方法查找的順序
72、isinstance作用以及應用場景?
判斷一個對象是不是某個類的實例
73、寫代碼實現:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice.Example: Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]、
nums = [2, 7, 11, 15]
class Solution(object):
def twoSum(self, nums, target):
"""
:param nums: list[int]
:param target: int
:return: List[int]
"""
if len(nums) <= 1:
return False
buff_dict = {}
for i in range(len(nums)):
if nums[i] in buff_dict:
return [buff_dict[nums[i]], i]
else:
buff_dict[target - nums[i]] = i
View Code
74、json序列化時,可以處理的數據類型有哪些?如何定制支持datetime類型?
#字符串、字典、列表、數字、布爾值、None、、自定義class類
import json
import datetime
class MyEncoder(json.JSONEncoder):
def default(self, o): # o是數據類型
if isinstance(o, datetime.datetime)
return o.strftime(‘%Y-%m-%d‘)
else:
return super(MyEncoder, self).default(o)
75、什麽是斷言?應用場景?
斷言條件為真時,代碼繼續執行,負責拋出異常,這個異常通常不會去捕獲他,我們設置一個斷言目的就是要求必須實現某個條件。
76、有用過with statement嗎?它的好處是什麽?
文件操作時使用過,with語句下代碼完成後調用求值語句返回對象的__exit__方法,可以實現一些操作,比如關閉文件。
77、使用代碼實現查看列舉目錄下的所有文件。
# 遞歸方法
def print_directory_contents(sPath):
import os
for sChild in os.listdir(sPath):
sChildPath = os.path.join(sPath,sChild)
if os.path.isdir(sChildPath):
print_directory_contents(sChildPath)
else:
print(sChildPath)
78、簡述yield和yield from關鍵字。
yield:生成器函數關鍵字
yield from:相當於 for i in obj : yield i
python基礎面試常見題