Python開發的面試準備

1.is和==的區別:python

is比較的是id,對象的內存地址
= =比較的是值web

2.按字典中的value值進行排序數據庫

sorted(dict.items(), key = lambda x: x[1])編程

3.字典和json的區別json

字典是python的數據結構,字典中的key值能hash
json是一種數據的表現形式,是字符串設計模式

4.可變、不可變類型:服務器

指的是內存中的值是否能夠被改變
不可變:數值、字符串、元組
可變:列表、字典、集合網絡

5.經常使用的字符串格式化數據結構

佔位符 s1 = 「%s DSB 你好」%name
format s2 = 「{} DSB 你好」.format(name)
f-string s3 = f"{name} DSB 你好"多線程

6.字符串駐留機制

對短字符串,賦值給多個不一樣對象時,內存中只有一個副本
駐留適用範圍:由數字,字符和下劃線組成的python標識符及整數[-5,256]

7.刪除list中重複元素

經過set內置的去重實現: l2 = list(set(l1))
#保持原來順序
經過內置sort方法:l2.sort(key=l1.index)
l2 = sorted(set(l1), key=l1.index)
遍歷:if not in l2 -> append

8.統計函數的執行效率

import cProfil #引入程序分析包,分析代碼性能
cProfile.run(‘func(paras)’) #把函數以字符串形式傳入模塊的run方法

9.列舉字符串、列表、元組、字典的5個經常使用方法

str1 = ‘’ : replace, strip, split, reverse, upper, lower…
list1 =[]: append, pop, insert, remove,sort, count, index…
tuple1 = (): index, count, len(), dir()…
dict1 = {}: get, keys, values, items, pop, popitems, clear, update…

10.什麼是反射,以及應用場景

經過字符串的形式去訪問對象的屬性,調用對象的方法(可是不能去訪問方法)
好比原本能夠經過if elif判斷字符串而後調用函數,但在大規模系統中不可取。
核心主題是如何利用字符串驅動不一樣的事件,好比導入模塊、調用函數等等,這些都是python的反射機制,是一種編程方法、設計模式的體現,凝聚了高內聚、鬆耦合的編程思想,不能簡單的用執行字符串來代替。
能夠經過__import__函數,咱們實現了基於字符串的動態的模塊導入。obj = import(modules)
#對於lib.xxx.xxx.xxx這一類的模塊導入路徑,__import__默認只會導入最開頭的圓點左邊的目錄,也就是「lib」
=> obj = import(「lib.」 + modules, fromlist=True) # 注意fromlist參數
class Foo:
pass
foo = Foo()
foo.x = 1
#getattr
getattr(foo,‘x’)) # 1 ## getattr 函數讓程序去foo模塊了,尋找一個叫x的成員
# 至關於把字符串變成函數名的過程,而後把結果複製給變量func,變量指向foo裏某個函數
#setattr
setattr(foo, ‘y’, 2))
getattr(foo,‘y’)) # 2
#hasattr
hasattr(foo, ‘z’)) #False # 一般經過hasattr的判斷,防止非法輸入錯誤
#delattr
delattr(foo, 'x))

11.淺copy和深copy的區別:

首先深拷貝和淺拷貝都是對象的拷貝,都會生成一個看起來相同的對象,他們本質的區別是拷貝出來的對象的地址是否和原對象同樣,淺拷貝是地址的複製,深拷貝是值的複製,就是徹底跟之前就沒有任何關係了,原來的對象怎麼改都不會影響當前對象。

12.Python中的self關鍵字:

python的類中定義函數時的self關鍵字跟python的方法函數有關,方法函數由類的實例化對象調用,須要把調用它的實例化對象傳入方法函數中,self表明調用時的類的實例,而非類。
在Python的解釋器內部,當咱們調用t.prt()時,實際上Python解釋成Test.prt(t),也就是說把self替換成類的實例。

13.Yield關鍵字和生成器:

yield是一種特殊的return,執行遇到yield時,當即返回,這一點與return類似,不一樣之處在於,下次進入函數時直接到yield的下一個語句,而return後再進入函數,仍是從函數體的第一行代碼開始執行。帶yield的函數生成器,一般與next函數結合用。g=f()執行f,只獲得一個生成器對象g,使用next函數進入到函數體內(執行next(g))。優勢-節省內存,佔用內存空間爲O(1)。

生成器:在須要返回數據的時候使用 yield 語句。每次 next()被調用時,生成器會返回它脫離的位置,自動建立iter()和 next()方法
簡潔、高效,節省內存

14.列表和迭代器的區別

列表通過內置函數iter包裝,成爲迭代器 a_iter = iter(a)
列表不論遍歷多少次,表頭位置始終是第一個元素
迭代器遍歷結束後,再也不指向原來的表頭位置,而是最後元素的下一個位置
(迭代到最後一個元素,再執行next,會觸發stopiteratio異常,
經過捕獲此異常,求迭代器指向列表a的長度;生成器也是一種迭代器)

15.python垃圾回收機制
在這裏插入圖片描述
16. try except用法和做用

try用於檢測異常,except用於捕獲全部異常,保證程序的正常運行
Exception:捕獲萬能異常
finally:不管是否錯誤,都會執行此處代碼
raise:觸發異常

17.enumerate的做用

將一個可迭代對象中的元素,按元素順序每一個增長一個索引值,組成索引序列,利用它能夠同時得到索引和值,方便後續操做。

18.lambda匿名函數表達式及應用場景

與函數有相同的做用域,可是匿名意味着引用計數爲0, 使用一次就釋放,除非給其命名
做爲內置函數的參數,與內置函數配合一塊兒使用

19.python的遞歸最大層數
998
20.常見的內置函數
在這裏插入圖片描述
在這裏插入圖片描述
17. filter,map,reduce的做用

filter(lambda x: x == 2, [1,2,3]) #經過判斷函數func,篩選符合條件的元素
map(lambda x: x + ‘xxx’, [‘1’,‘2’]) #將func用於每一個iterable對象
reduce(lambda x, y: x + y, [1,2,3,4,5]) # 函數會對參數序列中的元素進行累積

18.什麼是閉包

定義在一個函數內部的函數,被外層函數包裹着,特色是能夠訪問到外層函數中的名字
閉包函數時名稱空間與做用域、函數對象、函數嵌套的結合體

19.裝飾器

裝飾器其實就是一個以函數做爲參數並返回一個替換函數的可執行函數,即裝飾器是一個函數,它以函數做爲參數,返回另外一個函數。
使用 @函數名字,放在某些函數上面,起到加強它們功能的做用。
裝飾器使得代碼更簡潔,代碼的複用性大大提高。在Java中裝飾器被稱爲註解。
python支持異步編程,從中也能看到裝飾器的身影

20.函數式編程:面向過程的程序設計
21.Python LEGB規則

Python的命名空間是一個字典,字典內保存了變量名稱與對象之間的映射關係
查找變量名就是在命名空間字典中查找鍵-值對, LEGB就是用來規定命名空間查找順序的規則 LEGB含義解釋: L-Local(function);函數內的名字空間 E-Enclosing function locals;外部嵌套函數的名字空間(例如closure) G-Global(module);函數定義所在模塊(文件)的名字空間 B-Builtin(Python);Python內置模塊的名字空間 Python在肯定一個變量的核心規則是LEGB,只有熟悉LEGB規則,才能清楚在程序執行過程當中調用的變量到底是什麼 

22.@property的用法

若是在一個類中要設置和獲取一個成員變量的話, 通常是定義get和set的方法,但咱們但願get/set一個值時有更簡單的方法,像設置成員變量同樣去設置一個變量,又能夠檢查類型參數。 在方法定義前,加 @property 裝飾器,能夠像操做成員變量同樣進行操做。 新式類中的屬性有三種訪問方式,以下: @property對應讀取 @方法名.setter修改 @方法名.deleter刪除屬性 

23.多線程threading和多進程multiprocessing的應用場景
每個應用程序都有一個本身的進程。操做系統會爲這些進程分配一些執行資源,例如內存空間等。
在進程中,又能夠建立一些線程,他們共享這些內存空間,並由操做系統調用,以便並行計算。

線程的狀態
建立線程以後,線程並非始終保持一個狀態。其狀態大概以下:

  • New 建立。
  • Runnable 就緒。等待調度
  • Running 運行。
  • Blocked 阻塞。阻塞可能在 Wait Locked Sleeping
  • Dead 消亡
    線程的類型
    線程有着不一樣的狀態,也有不一樣的類型。大體可分爲:
  • 主線程
  • 子線程
  • 守護線程(後臺線程)
  • 前臺線程

io 操做不佔用CPU(從硬盤、從網絡、從內存讀數據都算io)
計算佔用CPU(如1+1計算)

python中的線程是假線程,不一樣線程之間的切換是須要耗費資源的,由於須要存儲線程的上下文,不斷的切換就會耗費資源。

python多線程適合io操做密集型的任務(如socket server 網絡併發這一類的);
python多線程不適合cpu密集操做型的任務,主要使用cpu來計算,如大量的數學計算。

那麼若是有cpu密集型的任務怎麼辦,能夠經過多進程來操做(不是多線程)。

24.異步和多線程的區別
異步是單線程的,它能更優雅處理了io密集型的應用場景

25.__new__和__init__的區別
建立時初始化實例
__new__是在實例建立以前被調用的,由於它的任務就是建立實例而後返回該實例對象,是個靜態方法。
__init__是當實例對象建立完成後被調用的,而後設置對象屬性的一些初始值,一般用在初始化一個類實例的時候。是一個實例方法。
也就是: __new__先被調用,__init__後被調用,__new__的返回值(實例)將傳遞給__init__方法的第一個參數,而後__init__給這個實例設置一些參數。

26.如何實現一個單例
只初始化一次,在數據庫鏈接中很經常使用

單例模式是一個軟件的設計模式,爲了保證一個類,不管調用多少次產生的實例對象,都是指向同一個內存地址,僅僅只有一個實例(只有一個對象)。

實現單例模式的手段有不少種,但總的原則是保證一個類只要實例化一個對象,下一次再實例的時候就直接返回這個對象,再也不作實例化的操做。

方式:https://www.jb51.net/article/202178.htm

  • 經過模塊導入的方式
  • 經過類的綁定方法
  • 經過魔法方法__new__
  • 經過元類**
  • 函數裝飾器
  • 類裝飾器

27.python查找對象屬性的順序

_getattribute_() 類屬性 數據描述符 實例屬性 非數據描述符 __getattr__()方法 

28.SQL注入
SQL注入便是指web應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者能夠在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,在管理員不知情的狀況下實現非法操做,以此來實現欺騙數據庫服務器執行非受權的任意查詢,從而進一步獲得相應的數據信息。

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,若有問題請及時聯繫咱們以做處理

想要獲取更多Python學習資料能夠加
QQ:2955637827私聊
或加Q羣630390733
你們一塊兒來學習討論吧!

相關文章
相關標籤/搜索