python基礎面試題整理—從零開始 每天十題(03)
- 2019 年 10 月 5 日
- 筆記
一、Q:用Python輸出一個Fibonacci數列?(斐波那契額數列)
A:我們先來看下程式碼
#!/usr/bin/env python # -*- coding: utf-8 -*- def fib_recur(n): if n <= 1: return n return fib_recur(n - 1) + fib_recur(n - 2) for i in range(1, 20): print(fib_recur(i), end=" ")
我們來詳細的看一下程式碼,我們知道斐波那契數據為1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,由此我們可以得知,
F(0) = 0
F(1) = 1,
F(2) = F(1) + F(0),
F(3) = F(2) + F(1),
F(4) = F(3) + F(2),
F(5) = F(4) + F(3)
所以我們可以得知F(n) = F(n-1) + F(n-2)。
二、Q:介紹一下Python中webbrowser的用法?
A:webbrowser主要是用來驅動瀏覽器進行操作的,最簡單的實例。
#!/usr/bin/env python # -*- coding: utf-8 -*- import webbrowser as ws ws.open('https://www.cnblogs.com/cxiaocai/')
webbrowser.open_new(url)
webbrowser.open_new_tab(url)
webbrowser.get()方法可以獲取到系統瀏覽器的操作對象。
三、Q:請寫出一段Python程式碼實現刪除一個list裡面的重複元素
#!/usr/bin/env python # -*- coding: utf-8 -*- def main(li): new_li = list(set(li)) new_li.sort(key=li.index) return new_li li = [1, 2, 4, 5, 8, 3, 1, 3, 8, 4] nli = main(li) for k in nli: print(k)
四、Q:簡單說一說python 中 is 和 == 的區別
A:最簡單的來說is是比較記憶體地址的,==是來比較值是否一致的,當我們is返回為True是,==一定是True,反而==為真時,is不一定是真,我們來看一個實例
#!/usr/bin/env python # -*- coding: utf-8 -*- import copy def main(): a = [1, 2, 3] b = copy.deepcopy(a) print(a) print(b) print(a == b) print(id(a)) print(id(b)) print(a is b) main()
由此看出,值相等的,但是is返回False,因為其值相等,記憶體不一定一致的。
注意:只有數值型和字元串型的情況下,a==b時,a is b才為True,當a和b是tuple,list,dict或set型時,a==b時,a is b不一定為True,這時我們需要判斷記憶體地址。
還有我們的None類型,我們也來看一下。None是一個特殊的常量,「不同的」None的id是一樣的。所有我們使用si比較好一些,而且is函數比==要快一些,不用運行查找和比較函數
五、Q:其實我們第四題內有一個隱含的問題,就是什麼是可變對象,什麼是不可變對象。
A:Python中有可變對象和不可變對象之分。可變對象創建後可改變但地址不會改變,即變數指向的還是原來的變數;不可變對象創建之後便不能改變,如果改變則會指向一個新的對象。
Python中dict、list是可變對象,str、int、tuple、float是不可變對象。
六、Q:列表和元組有什麼區別?
A:列表是可變的,即可以編輯。元祖是不可編輯的,元祖比列表的運行速度要快,
七:Q:說一說你理解的迭代器和生成器
A:生成器:如果列表元素可以按照某種演算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間,在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。生成器是一個特殊的程式,可以被用作控制循環的迭代行為,python中生成器是迭代器的一種,使用yield返回值函數,每次調用yield會暫停,而可以使用next()函數和send()函數恢復生成器。那麼這樣就不佔記憶體了,這裡說一下generator和函數的執行流程,函數是順序執行的,遇到return語句或者最後一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次被next()調用時候從上次的返回yield語句處急需執行,也就是用多少,取多少,不佔記憶體。
迭代器:迭代器包含有next方法的實現,在正確的範圍內返回期待的數據以及超出範圍後能夠拋出StopIteration的錯誤停止迭代。
我們已經知道,可以直接作用於for循環的數據類型有以下幾種:
一類是集合數據類型,如list,tuple,dict,set,str等
一類是generator,包括生成器和帶yield的generator function
這些可以直接作用於for 循環的對象統稱為可迭代對象:Iterable
可以使用isinstance()判斷一個對象是否為可Iterable對象
總結:凡是可作用於for
循環的對象都是Iterable
類型;
凡是可作用於next()
函數的對象都是Iterator
類型,它們表示一個惰性計算的序列;
集合數據類型如list
、dict
、str
等是Iterable
但不是Iterator
,不過可以通過iter()
函數獲得一個Iterator
對象。
八:Q:Python的解釋器種類和特點?
A:CPython,c語言開發的 使用最廣的解釋器(我們用的基本都是cpython);JPython,運行在Java上的解釋器 直接把python程式碼編譯成Java位元組碼執行
九:Q:如何實現 「1,2,3」 變成 [『1』,』2』,』3』] ?
A:
#!/usr/bin/env python # -*- coding: utf-8 -*- def main(): str = "1, 2, 3" return str.split(',') if __name__ == '__main__': li = main() print(li) print(type(li))
十:Q:如何實現[『1』,』2』,』3』]變成[1,2,3] ?
A:
#!/usr/bin/env python # -*- coding: utf-8 -*- def main(): li = ['1', '2', '3'] return [int(i) for i in li] if __name__ == '__main__': li = main() print(li) print(type(li))