Python面試題(整理)

  1. 利用切片操作,實(shí)現(xiàn)一個(gè)trim()函數(shù),去除字符串首尾的空格,注意不要調(diào)用str的strip()方法.

正解1:

def trim(s):
    while s[:1] == ' ':
        s = s[1:]
    while s[-1:] == ' ':
        s = s[:-1]
    return s

正解2:

def trim(s):
    if s[:1] == ' ':
        s = trim(s[1:])
    if s[-1:] == ' ':
        s = trim(s[:-1])
    return s

容易寫錯(cuò)的方法:

 def trim(s):
    while s[0] == ' ':
        s = s[1:]
    while s[-1] == ' ':
        s = s[:-1]
    return s

解釋:當(dāng)s=''時(shí),s[0]和s[-1]會(huì)報(bào)IndexError: string index out of range,但是s[:1])和s[-1:]不會(huì)。

  1. 請(qǐng)?jiān)O(shè)計(jì)一個(gè)decorator,它可作用于任何函數(shù)上,并打印該函數(shù)的執(zhí)行時(shí)間.
# -*- coding: utf-8 -*-
import time, functools
def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kw):
        time0 = time.time()
        ret = fn(*args, **kw)
        time1 = time.time()
        print('%s executed in %s ms' % (fn.__name__, time1-time0))
        return ret
    return wrapper
  1. 裝飾器的實(shí)質(zhì)是什么?或者說為什么裝飾器要寫2層嵌套函數(shù),里層函數(shù)完全就已經(jīng)實(shí)現(xiàn)了裝飾的功能為什么不直接用里層函數(shù)名作為裝飾器名稱?

    答:裝飾器是要把原來的函數(shù)裝飾成新的函數(shù),并且返回這個(gè)函數(shù)本身的高階函數(shù)

  2. python下多線程的限制以及多進(jìn)程中傳遞參數(shù)的方式

    python多線程有個(gè)全局解釋器鎖(global interpreter lock),這個(gè)鎖的意思是任一時(shí)間只能有一個(gè)線程使用解釋器,跟單cpu跑多個(gè)程序一個(gè)意思,大家都是輪著用的,這叫“并發(fā)”,不是“并行”。

    多進(jìn)程間共享數(shù)據(jù),可以使用 multiprocessing.Value 和 multiprocessing.Array

  3. python多線程與多進(jìn)程的區(qū)別:

    在UNIX平臺(tái)上,當(dāng)某個(gè)進(jìn)程終結(jié)之后,該進(jìn)程需要被其父進(jìn)程調(diào)用wait,否則進(jìn)程成為僵尸進(jìn)程(Zombie)。所以,有必要對(duì)每個(gè)Process對(duì)象調(diào)用join()方法 (實(shí)際上等同于wait)。對(duì)于多線程來說,由于只有一個(gè)進(jìn)程,所以不存在此必要性。

    多進(jìn)程應(yīng)該避免共享資源。在多線程中,我們可以比較容易地共享資源,比如使用全局變量或者傳遞參數(shù)。在多進(jìn)程情況下,由于每個(gè)進(jìn)程有自己獨(dú)立的內(nèi)存空間,以上方法并不合適。此時(shí)我們可以通過共享內(nèi)存和Manager的方法來共享資源。但這樣做提高了程序的復(fù)雜度,并因?yàn)橥降男枰档土顺绦虻男省?/p>

  4. 請(qǐng)寫出一段Python代碼實(shí)現(xiàn)刪除一個(gè)list里面的重復(fù)元素

>>> l = [1,1,2,3,4,5,4]
>>> list(set(l))
[1, 2, 3, 4, 5]
或者
d = {}
for x in mylist:
    d[x] = 1
mylist = list(d.keys())
  1. 利用map()函數(shù),把用戶輸入的不規(guī)范的英文名字,變?yōu)槭鬃帜复髮?,其他小寫的?guī)范名字。輸入:['adam', 'LISA', 'barT'],輸出:['Adam', 'Lisa', 'Bart']:
def normalize(name):
    return name[0].upper()+name[1:].lower()

def normalizeList(inputlist):
    return list(map(normalize, inputlist))

  1. Python是如何進(jìn)行內(nèi)存管理的?
      http://developer.51cto.com/art/201007/213585.htm
      Python引用了一個(gè)內(nèi)存池(memory pool)機(jī)制,即Pymalloc機(jī)制(malloc:n.分配內(nèi)存),用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放
    內(nèi)存池(memory pool)的概念:
      當(dāng) 創(chuàng)建大量消耗小內(nèi)存的對(duì)象時(shí),頻繁調(diào)用new/malloc會(huì)導(dǎo)致大量的內(nèi)存碎片,致使效率降低。內(nèi)存池的概念就是預(yù)先在內(nèi)存中申請(qǐng)一定數(shù)量的,大小相等 的內(nèi)存塊留作備用,當(dāng)有新的內(nèi)存需求時(shí),就先從內(nèi)存池中分配內(nèi)存給這個(gè)需求,不夠了之后再申請(qǐng)新的內(nèi)存。這樣做最顯著的優(yōu)勢(shì)就是能夠減少內(nèi)存碎片,提升效率。
    內(nèi)存池的實(shí)現(xiàn)方式有很多,性能和適用范圍也不一樣。
    python中的內(nèi)存管理機(jī)制——Pymalloc:
      python中的內(nèi)存管理機(jī)制都有兩套實(shí)現(xiàn),一套是針對(duì)小對(duì)象,就是大小小于256bits時(shí),pymalloc會(huì)在內(nèi)存池中申請(qǐng)內(nèi)存空間;當(dāng)大于256bits,則會(huì)直接執(zhí)行new/malloc的行為來申請(qǐng)內(nèi)存空間。
      關(guān)于釋放內(nèi)存方面,當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)變?yōu)?時(shí),python就會(huì)調(diào)用它的析構(gòu)函數(shù)。在析構(gòu)時(shí),也采用了內(nèi)存池機(jī)制,從內(nèi)存池來的內(nèi)存會(huì)被歸還到內(nèi)存池中,以避免頻繁地釋放動(dòng)作。

  2. 解釋一下python的and-or語法
    http://www.kuqin.com/diveinto_python_document/apihelper_andor.html
    與C表達(dá)式 bool ? a : b類似,但是bool and a or b,當(dāng) a 為假時(shí),不會(huì)象C表達(dá)式 bool ? a : b 一樣工作
    應(yīng)該將 and-or 技巧封裝成一個(gè)函數(shù):

def choose(bool, a, b):
    return (bool and [a] or [b])[0]

因?yàn)?[a] 是一個(gè)非空列表,它永遠(yuǎn)不會(huì)為假。甚至 a 是 0 或 '' 或其它假值,列表[a]為真,因?yàn)樗幸粋€(gè)元素。

  1. how do I iterate over a sequence in reverse order
for x in reversed(sequence):
    ... # do something with x..

如果不是list, 最通用但是稍慢的解決方案是:

for i in range(len(sequence)-1, -1, -1):
    x = sequence[i]
    <do something with x>
  1. Python如何實(shí)現(xiàn)單例模式?其他23種設(shè)計(jì)模式python如何實(shí)現(xiàn)?

  2. Python里面如何拷貝一個(gè)對(duì)象?
    http://blog.csdn.net/sharkw/article/details/1934090
    標(biāo)準(zhǔn)庫中的copy模塊提供了兩個(gè)方法來實(shí)現(xiàn)拷貝.一個(gè)方法是copy,它返回和參數(shù)包含內(nèi)容一樣的對(duì)象.
    使用deepcopy方法,對(duì)象中的屬性也被復(fù)制

  3. Python里面search()和match()的區(qū)別?
    match()函數(shù)只檢測(cè)RE是不是在string的開始位置匹配,search()會(huì)掃描整個(gè)string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none

  4. 有兩個(gè)序列a,b,大小都為n,序列元素的值任意整形數(shù),無序;
    要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。

    1. 分別計(jì)算a,b序列的和;
    2. 求a序列和與b序列和的差值的一半,記為half;
    3. 在和值大的序列中找出一個(gè)與和值小的序列中的元素max的差值最接近half的元素,記為min;
    4. 將max與min互換即可。
  5. 描述元類的概念。Python有沒有接口?元類和Java的接口有什么異同?
    python里無接口類型,定義接口類(抽象類)只是一個(gè)人為規(guī)定,在編程過程自我約束。
    元類是類的模板,重在幫助創(chuàng)建類。接口是重在提供思路,后續(xù)進(jìn)行實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 3,237評(píng)論 0 9
  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進(jìn)行...
    月亮是我踢彎得閱讀 6,178評(píng)論 3 28
  • 高階函數(shù):將函數(shù)作為參數(shù) sortted()它還可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序,reversec參數(shù)可反...
    royal_47a2閱讀 848評(píng)論 0 0
  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進(jìn)程 之前我們已經(jīng)了解了操作系統(tǒng)中進(jìn)程的概念,程序并不能單獨(dú)運(yùn)行,只有...
    go以恒閱讀 1,800評(píng)論 0 6
  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口,提供良好的抽象接口。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對(duì)硬件...
    drfung閱讀 3,774評(píng)論 0 5

友情鏈接更多精彩內(nèi)容