Python 第一階段面試題答案
承接上一篇文章
此答案不是標準答案
1、
break 用在條件滿足即結束迴圈,跳出迴圈體,進行後面的程式
continue 結束本次迴圈,進行下次迴圈,需要把迴圈語句的每一個case都驗證一下,符合條件的case跳過,執行後面的迴圈中
return 跳出迴圈體所在的方法,相當於結束該方法。
2、
python的作用域
作用域也叫名字空間,是訪問變數時查詢變數的名範圍空間
python中的四個作用域 LEGB
作用域 英文解釋 英文縮寫
區域性作用域 Local(function) L
外部巢狀函式作用域 Enclosing Fucntion local E
函式定義所在模組(檔案)的作用域 Global(module) G
Python內建模組的作用域 Builtin(python) B
變數名的查詢規則
L —> E —> G ----> B
global函式 說明:
1. 全域性變數如果要在函式內部被賦值,則必須經過全域性宣告(否則會被認為是區域性變數)
2. 全域性變數在函式內部不經過宣告就可以直接訪問(取值)
3. 不能先建立區域性變數,再用global宣告為全域性變數,此種做法不符合規則
4. global變數列表裡的變數名不能出現在函式的形參列表裡
3、
閉包是指引用了此函式外部變數的函式
(外部變數指:外部巢狀函式作用域內的變數)
閉包必須滿足三個條件:
1. 必須有一個內嵌函式
2. 內嵌函式必須引用外部函式中的變數
3. 外部函式返回值必須是內嵌函式
注意點:
由於閉包會使得函式中的變數都被保留在記憶體中,記憶體消耗比較大,所以不能濫用閉包
4、
拷貝概念的引入就是針對:可變物件的共享引用潛在的副作用而提出的
深淺拷貝都是對源物件的複製,佔用不同的記憶體空間
如果源物件只有一級目錄的話,源做任何改動,不影響深淺拷貝物件
如果源物件不止一級目錄的話,如果是可變物件做任何改動,都要影響淺拷貝,如果是不可變物件做了改變,深淺拷貝都不影響
序列物件的切片其實是淺拷貝,即只拷貝頂級的物件
5、
Python垃圾回收主要以引用計數為主,分代回收為輔。引用計數法的原理是每個物件維護一個ob_ref,用來記錄當前物件被引用的次數,也就是來追蹤到底有多少引用指向了這個物件,詳解見這篇文章https://blog.csdn.net/xiongchengluo1129/article/details/80462651
6、
lambda 表示式(又稱匿名函式)
作用:
建立一個匿名函式物件
同def 類似,但不提供函式名
語法:
lambda [函式形參列表]: 表示式
說明:
1. lambda 表示式建立的函式只能包含一條表示式
2. lambda 比函式簡單,且可以隨時建立和銷燬,有利於降低程式的偶合度
9、
try-except語句的語法
try:
可能觸發異常的語句
except 錯誤型別1 [as 變數1]:
異常處理語句1
except 錯誤型別2 [as 變數2]:
異常處理語句2
except (錯誤型別3, 錯誤型別4) [as 變數3]:
異常處理語句3
…
except:
異常處理語句other
else:
末發生異常的語句
finally:
最終語句
作用:
償試捕獲錯誤,得到異常通知,將程式由異常狀態轉換為正常狀態並
繼續執行
說明:
as 子句是用於繫結錯誤物件的變數,可以省略
except 子句可以有一個或多個,但至少要有一個
else 子句最多隻能有一個.也可以省略
finally子句最多隻能有一個.也可以省略
10、
隨機模組 random
R.random() 返回一個[0, 1) 之間的隨機實數
R.uniform(a,b) 返回[a,b] 區間內的隨機實數
R.randin(a, b) 返回在[a, b] 範圍內的整數(包含a,b)
R.randrange([start,] stop[, step]) 返回range(start,stop,step)中的隨機數
R.choice(seq) 從序列中返回隨意元素
R.shuffle(seq[, random]) 隨機指定序列的順序(亂序序列)
R.sample(seq,n) 從序列中選擇n個隨機且不重複的元素
12、
單引號與雙引號是作用是一樣的,都是字串定界符
如果字串裡面包含的與邊界一樣的符號,需要轉義符來將該符號轉成普通字元,不然編譯器會將字串中的那個單引號或雙引號當成字串的邊界。
三引號
三個雙引號的作用是可以直接寫多行的字串 。
三重引號的內容,如果未賦值給變數,其在Python中相當於多行註釋!在函式中還相當於doc作用。
三重引號還有一個好處,三重引號在多行引號方便且是所見即所得的方式,直觀!
14、
python 函式的引數傳遞
位置傳參:
實際引數(實參) 的對應關係與形式引數(形參)的對應關係是按位置來依次對應的.
序列傳參
序列傳參是指在函式呼叫過程中,用*(星號) 將序列拆解後按位置進行傳遞的傳參方式
關鍵字傳參:
關鍵字傳參是指傳參時,按著形參名稱給形參賦值實參和形參按名稱進行匹配 字典關鍵字傳參: 是指實參為字典,將字典用** 拆解後進行關鍵字傳參的傳遞方式
16、
“函數語言程式設計”, 又稱泛函程式設計, 是一種”程式設計正規化”(programming paradigm),也就是如何編寫程式的方法論。
21、
什麼是裝飾器
裝飾器是一個函式,主要作用是用來包裝另一個函式或類
包裝的目的是在不改變原函式名(或類名) 的情況下改變或新增被包裝物件的行為
函式裝飾器
是指裝飾器是一個函式,傳入的是一個函式,返回的也是一個函式
語法:
def 裝飾器函式名(引數):
語句塊
return 函式物件
@裝飾器函式名<換行>
def 函式名(形參列表):
語句塊
25、
迭代器:
迭代器是訪問可迭代物件的工具
迭代器是指iter(obj) 函式返回的物件(例項)
迭代器可以用next(it) 函式獲取可迭代物件的資料
迭代器函式iter和next
iter(iterable) 從可迭代物件中獲取一個迭代器,iterable
必須是能提供一個迭代器的可迭代物件
next(Iterator) 從迭代器iterator中獲取下一個記錄,如
果無法獲取下一條記錄,則觸發StopIteration異常
說明:
迭代器只能往前取值,不會後退
用iter函式可以返回一個可迭代物件的迭代器
迭代器(高階)
什麼是迭代器
可以能過next(it) 函式取值的物件就是迭代器
迭代器協議:
迭代器協議是指物件能夠使用next函式獲取下一
項資料,在沒有下一項資料時觸發一個StopIteration
異常來終止迭代的約定
迭代器協議的實現方法:
next(self) 方法來實現迭代器協議
什麼是可迭代物件:
是指能用iter(obj) 函式返回迭代器的物件(例項)
可迭代物件的內部要定義 iter(self) 方法來返回
迭代器物件(例項)
生成器 Generator
什麼是生成器:
生成器是能夠動態提供資料的可迭代物件
生成器在程式執行時生成資料,與容器類不同,它通常不會在
記憶體中儲存大量的資料,而是現用現生成
好處:
不佔用計算機的記憶體
生成器有兩種:
生成器函式
生成器表示式
生成器函式的定義
含有yield語句的函式是生成器函式,此函式被呼叫將返回
一個生成器物件
yield 翻譯為(產生或生成)
yield 語句
語法:
yield 表示式
說明:
yield 只能用於def 函式中,目地是將此函式作為生成器
函式使用
yield 用來生成資料,供迭代器的next(it) 函式使用
說明:
- 生成器函式的呼叫將返回一個生成器物件,生成器物件是
一個可迭代物件 - 生成器函式用return會觸發一個StopIteration異常
(即生成結束)
26、
1、物件的引用計數機制
2、垃圾回收
3、記憶體池機制
python內部使用引用計數,來保持追蹤記憶體中的物件,Python內部記錄了物件有多少個引用,即引用計數,當物件被建立時就建立了一個引用計數,當物件不再需要時,這個物件的引用計數為0時,它被垃圾回收。所有這些都是自動完成,不需要像C一樣,人工干預,從而提高了程式設計師的效率和程式的健壯性