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類型,它們表示一個惰性計算的序列;

       集合數據類型如listdictstr等是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))