今天的面試題
第1題:python2和python3的range(100)的區別
range()函式的含義
range函式是一個用來建立
算數級
數序列的通用函式,返回一個[start, start + step, start + 2 * step, ...]結構的整數序列
range()函式的特性
- 如果step引數預設,預設1;如果start引數預設,預設0。
- 如果step是正整數,則最後一個元素(start + i * step)小於stop。
- 如果step是負整數,則最後一個元素(start + i * step)大於stop。
- step引數必須是非零整數,否則丟擲VauleError異常。
注意:range函式返回一個左閉右開([left,right))的序列數
- python2中的range返回一個可迭代物件(型別是物件),而不是列表型別, 所以列印的時候不會列印列表
>>> list=range(10)
>>> print list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
複製程式碼
- python3中的range返回的是一個迭代器
>>> range(10)
range(0, 10)
>>> type(range(10))
<class 'range'>
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> type(list(range(10)))
<class 'list'>
複製程式碼
for i in range(1,10)在python2和python3中都可以使用,但是要生成1-10的列表,就需要用list(range(1,10))
第2題:在Python中讀取大檔案
- 利用生成器generator
def read_in_block(file_path):
BLOCK_SIZE = 1024
with open(file_path, "r") as f:
while True:
block = f.read(BLOCK_SIZE) # 每次讀取固定長度到記憶體緩衝區
if block:
yield block
else:
return # 如果讀取到檔案末尾,則退出
def test3():
file_path = "/tmp/test.log"
for block in read_in_block(file_path):
print block
複製程式碼
- 迭代器進行迭代遍歷:for line in file
def test4():
with open("/tmp/test.log") as f:
for line in f:
print line
複製程式碼
for line in f 這種用法是把檔案物件f
當作迭代物件, 系統將自動處理IO緩衝和記憶體管理, 這種方法是更加pythonic
的方法。 比較簡潔。
Pythonic追求的是對Python語法的充分發揮,寫出的程式碼帶Python味兒,而不是看著向C或JAVA
第3題:如何避免轉義,給字串加哪個字母表示原始字串?
這個就面試題的要點是幾個特殊Python3字串字首u、b、r
- 無字首 & u字首
字串預設建立即以Unicode編碼儲存,可以儲存中文。
string = 'a' 等效於 string = u'a'
Unicode中通常每個字元由2個位元組表示
u'a' 即 u'\u0061' 實際記憶體中為 [0000 0000] [0110 0001]
複製程式碼
- b字首
字串儲存為Ascll碼,無法儲存中文。
- r字首
與上述兩種不是一樣的東西了。 r字首就相當於三引號,主要解決的是 轉義字元,特殊字元 的問題,其中所有字元均視為普通字元。
所以這道題的正確答案是r
字首
第4題:python中斷言方法舉例?
assert 語句,在需要確保程式中的某個條件一定為真才能讓程式執行的話就非常有用
下面做一些assert用法的語句供參考:
assert 1==1
assert 2+2==2*2
assert len(['my boy',12])<10
assert range(4)==[0,1,2,3]
複製程式碼
這裡介紹幾個常用斷言的使用方法,可以一定程度上幫助大家對預期結果進行判斷。
- assertEqual
- assertNotEqual
- assertTrue
- assertFalse
- assertIsNone
- assertIsNotNone
assertEqual 和 assertNotEqual
- assertEqual:如兩個值相等,則pass
- assertNotEqual:如兩個值不相等,則pass
使用方法:
assertEqual(first,second,msg)
其中first
與second
進行比較,如果相等則通過;
msg為失敗時列印的資訊,選填;
斷言assertNotEqual反著用就可以了。
assertTrue和assertFalse
- assertTrue:判斷bool值為True,則pass
- assertFalse:判斷bool值為False,則Pass
使用方法:
assertTrue(expr,msg)其中express輸入相應表示式,如果表示式為真,則pass; msg選填; 斷言assertFalse如果表示式為假,則pass
assertIsNone和assertIsNotNone
- assertIsNone:不存在,則pass
- assertIsNotNone:存在,則pass
使用方法: assertIsNone(obj,msg)檢查某個元素是否存在
第5題:列出python中可變資料型別和不可變資料型別,並簡述原理
不可變資料型別:
數值型、字串型string和元組tuple
不允許變數的值發生變化,如果改變了變數的值,相當於是新建了一個物件,而對於相同的值的物件,在記憶體中則只有一個物件(一個地址),如下圖用id()方法可以列印物件的id.
可變資料型別:
列表list和字典dict
允許變數的值發生變化,即如果對變數進行append、+=等這種操作後,只是改變了變數的值,而不會新建一個物件,變數引用的物件的地址也不會變化
。
相同的值在記憶體中可能會存在不同的物件,即每個物件都有自己的地址,相當於記憶體中對於同值的物件儲存了多份,這裡不存在引用計數,是實實在在的物件。
寫在後面
好啦,今天的面試題分解又完畢了,是不是又學到新東西了呢,希望在你升職加薪的路上為你“點火”