python 面試題 1.1(簡答類)

1、python和其他語言的區別

  • python是一種解釋性語言與C語言和C的衍生語言不同,Python代碼在運行之前不需要編譯。其他解釋型語言還包括PHP和Ruby。

  • Python是動態類型語言,指的是你在聲明變量時,不需要說明變量的類型。你可以直接編寫類似x=111和x="I’m a string"這樣的代碼,程序不會報錯。

2、解釋性語言和編譯性語言

  • 解釋性語言:源代碼—>中間代碼—>機器語言,源代碼不能直接翻譯成機器語言,而是先翻譯成中間代碼,再由解釋器對中間代碼進行解釋運行。

  • 編譯性語言:只須編譯一次就可以把源代碼編譯成機器語言,後面的執行無須重新編譯,直接使用之前的編譯結果就可以;因此其執行的效率比較高;

解釋性語言 編譯性語言
Python、JavaScript、Shell、Ruby、MATLAB C、C++、Pascal/Object Pascal(Delphi)
每執行一次都要翻譯一次 只須編譯一次
執行效率一般 執行效率比較高
依賴解釋器,跨平臺性好 依賴編譯器,跨平臺性差

其中java比較獨特,它是先編譯成.class文件再通過 jvm解釋運行

在這裏插入圖片描述

3、python幾種解釋器的特點

解釋器 特點
cpython C語言編寫、標準python、垃圾回收利用引用計數
jpython java編寫、編譯從jvm字節碼由jvm執行、利用JVM的垃圾回收和JIT
IronPython c#編寫、在CLR上實現了Python、面向.NET平臺、可以利用.NET框架的JIT、垃圾回收等功能
PyPy 使用RPython實現,利用Tracing JIT技術實現的Python、PyPy可以選擇多種垃圾回收方式,如標記清除、標記壓縮、分代等、pypy性能提升非常明顯但第三方庫支持不夠

4、位和字節的關係

1=2字節 (1 word = 2 byte) 
1字節=8(1 byte = 8bit 或簡寫爲:1B=8b) 
術語 區別
位 bit 計算機基本儲存單元、只能容納0或1
字節 byte 常用的計算機存儲單位、一個字節均爲8位,每個位是0或1
字 word 自然儲存單元、計算機進行數據處理時,一次存取、加工和傳送的數據長度稱爲字

一個英文字符和英文標點佔一個字節,一箇中文字符和中文標點佔用2個字節

一個字通常由一個或多個(一般是字節的整數位)字節構成。例如 286 微機的字由 2 個字節組成,它的字長爲 16;486 微機的字由 4 個字節組成,它的字長爲 32 位。

計算機的字長決定了其 CPU 一次操作處理實際位數的多少,由此可見計算機的字長越大,其性能越優越。

5、PEP8(python代碼規範)

縮進 每一級縮進使用4個空格
每行長度 每行最大長度79
import 按照以下順序分組導入:標準庫、相關第三方庫、本地應用/庫特定
類名 首字母大寫
函數名 小寫
函數方法和參數 始終要將 self 作爲實例方法的的第一個參數、cls 作爲類靜態方法的第一個參數

6、列舉布爾值爲false的常見值

print("1. ", bool(0))     # 零
print("2. ", bool(-0))   
print("3. ", bool(None))  # None
print("4. ", bool())      # 空
print("5. ", bool(False)) # false
print("6. ", bool([]))    # 空列表
print("7. ", bool(()))    # 空元組
print("8. ", bool({}))    # 空字典
print("9. ", bool(0j))    # 複數0       在Python中,複數的虛部以j或者J作爲後綴
print("10. ", bool(0.0))  # 浮點0

7、python遞歸的最大層數

默認的在window上的最大遞歸層數是998

# 驗證
def foo(n):
    print(n)
    n += 1
    foo(n)
 
if __name__ == '__main__':
    foo(1)

#得到的最大數爲998,以後就是報錯了:RecursionError: maximum recursion depth exceeded while calling a Python object

8、ascii、unicode、utf-8、gbk 區別

編碼 區別
ascii 美標、僅字母和符號等、1個字節
unicode 國際通用、所有文字、python默認字符編碼(二進制)
utf-8 unicode的一種實現方式、1~4字節、第一個字節和ascii兼容
gbk 國標、字母和中文、2個字節

需要注意的是,Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。
比如,漢字“嚴”的unicode是十六進制數4E25,轉換成二進制數足足有15位(100111000100101),也就是說這個符號的表示至少需要2個字節。表示其他更大的符號,可能需要3個字節或者4個字節,甚至更多。

9、字節碼和機器碼的區別

機器碼 字節碼
學名機器語言指令 相當於2進制代碼
由cpu直接執行 直譯器轉譯後成爲機器碼

10、三元運算規則以及應用場景

三元運算:https://blog.csdn.net/a__int__/article/details/104981310?utm_source=po_vip

規則
在這裏插入圖片描述
應用場景

在賦值變量的時候,可以直接加判斷

11、Python2和3的區別

來源1:https://www.runoob.com/python/python-2x-3x.html
來源2:https://www.cnblogs.com/kendrick/p/7478304.html

python2 python3
print語句 print()函數
ASCII str() 類型,unicode() 是單獨的,不是 byte 類型 Unicode (utf-8) 字符串,以及一個字節類:byte 和 bytearrays。
除法:整數相除的結果是一個整數 除法:整數之間的相除,結果也會是浮點數
異常: except e, var 異常:except e as var
range()和xrange() 只有range(),用法同之前的xrange()
八進制數可以寫成0o777或0777 只能寫成0o777
不等運算符: != 和 <> 不等運算符:!=
整型:int、long 整型:只有int(但它的行爲就像2.X版本的long),新增了bytes類型,對應於2.X版本的八位串
打開文件:file( … )或 open(…) 打開文件:open(…)
鍵盤錄入:raw_input( “提示信息” )、input( “提示信息” ) 鍵盤錄入:僅保留input( “提示信息” )
老式類和新式類 統一採用新式類

新式類和老式類的區別:https://www.jianshu.com/p/eaa4d2371e2e

需要注意的是python2.6、2.7兼容部分python3語言

在這裏插入圖片描述

django1.5開始支持python3,django2.0以後僅支持python3

django2 django3
路由: url() path()
{% load staticfiles %} {% load static %}

lxml的使用:

python2
在這裏插入圖片描述
python3
在這裏插入圖片描述

12、is和==

  • ==是python標準操作符中的比較操作符,用來比較判斷兩個對象的value(值)是否相等
  • is也被叫做同一性運算符,這個運算符比較判斷的是對象間的唯一身份標識,也就是id是否相同

13、python裏有哪些數據類型(可變、不可變)

可變對象:當有需要改變對象內部的值的時候,這個對象的id不發生變化。

不可變對象:當有需要改變對象內部的值的時候,這個對象的id會發生變化。

數據類型
可變 字典(dict), 集合(set), 列表(list)
不可變 整型(int), 字符串(string), 浮點型(float), 元組(tuple)

14、賦值、深淺拷貝

導入模塊:import copy

淺拷貝:copy.copy

深拷貝:copy.deepcopy

賦值 指向同一內存
淺拷貝 僅拷貝數據集合的第一層數據
深拷貝 指拷貝數據集合的所有層

在這裏插入圖片描述
在這裏插入圖片描述
淺拷貝的時候,python僅僅將最外層的內容在內存中新建了一份出來,字典第二層的列表並沒有在內存中新建,所以你修改了新模版,默認模版也被修改了。
在這裏插入圖片描述
深拷貝的時候python將字典的所有數據在內存中新建了一份,所以如果你修改新的模版的時候老模版不會變。

15、python垃圾回收機制(cpython)

Python垃圾回收主要以引用計數爲主,分代回收爲輔。
在這裏插入圖片描述
在這裏插入圖片描述
原始的引用計數法也有明顯的缺點:
在這裏插入圖片描述
爲了解決這兩個致命弱點,Python又引入兩種GC機制:

gc的邏輯:(重點)

分配內存
-> 發現超過閾值了
-> 觸發垃圾回收
-> 將所有可收集對象鏈表放到一起
-> 遍歷, 計算有效引用計數
-> 分成 有效引用計數=0 和 有效引用計數 > 0 兩個集合
-> 大於0, 放入到更老一代
-> =0, 執行回收
-> 回收遍歷容器內的各個元素, 減掉對應元素引用計數(破掉循環引用)
-> 執行-1的邏輯, 若發現對象引用計數=0, 觸發內存回收
-> python底層內存管理機制回收內存

分代回收:Python將內存分爲了3“代”,分別爲年輕代(0代)、中年代(1代)、老年代(2代),對應的是3個鏈表,年輕代鏈表的總數達到上限時,垃圾收集機制被觸發,把可以被回收的對象回收掉,把不會回收移到中年代去,依此類推,老年代中的對象是存活時間最久的對象。

16、列舉常見內置函數

函數 作用
abs(a) 返回數字a的絕對值
all([0, 1,2]) 判斷給定的可迭代參數 iterable 中的所有元素是否都不爲 0,沒0返回True
any( [ ] ) 判斷給定的可迭代參數 iterable 是否全部爲空對象,全0或空返回False
bin(10) int變2進制
bool() 判斷爲True或false

type()、id()、int()、str()、long()。。。。

17、列舉常用模塊

os模塊,路徑

re模塊,正則表達式

sys模塊,標準輸入輸出

math模塊,數學公式

json模塊,字符串與其他數據類型轉換;pickle模塊,序列化

random模塊,生成隨機數

time模塊,時間模塊

datatime模塊,datetime 基於 time 進行了封裝

request模型,HTTP請求庫

lxml, 處理XML和HTML文件

18、生成器、迭代器、可迭代對象

在這裏插入圖片描述
可迭代對象:

  • 可迭代對象和容器一樣是一種通俗的叫法,並不是指某種具體的數據類型
  • 列表、元組、字典、set等都是可迭代對象,也可以自定義一個可迭代對象(類)
  • 可迭代對象實現了__iter__方法,該方法返回一個迭代器對象。

迭代器:

  • 用iter() 函數來生成迭代器。例:iter([1,2,3])。
  • 任何實現了__iter__和__next__()(python2中實現next())方法的對象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一個值,如果容器中沒有更多元素了,則拋出StopIteration異常

在這裏插入圖片描述
生成器:

  • 生成器是一種特殊的迭代器。
  • 它不需要再像上面的類一樣寫__iter__()和__next__()方法了,只需要一個yiled關鍵字。

yield就是return返回的一個值,並且記住這個返回的位置.下一次迭代就從整個位置開始

例:

# 一個普通的函數
def something():
    result = []
    for ... in ...:
        result.append(x)
    return result

# 生成器
def iter_something():
    for ... in ...:
        yield x

例:

# 用生成器來實現斐波那契數列
def fib():
    prev, curr = 0, 1
    while True:
        yield curr
        prev, curr = curr, curr + prev

>>> f = fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

生成器表達式例:

a = (x*x for x in range(10))
# 返回生成器對象

列表推導式例:

b = [x*x for x in range(10)]
# 返回列表對象

參考源:https://foofish.net/iterators-vs-generators.html

19、re的match和search區別

match()函數只檢測RE是不是在string的開始位置匹配,search()會掃描整個string查找匹配

20、什麼是正則的貪婪匹配

貪婪匹配:正則表達式一般趨向於最大長度匹配。

非貪婪匹配:匹配到結果就好。

默認是貪婪模式。在量詞後面直接加一個問號?就是非貪婪模式。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章