Python技術(shù):基礎(chǔ)知識筆試面試全攻略_第1頁
Python技術(shù):基礎(chǔ)知識筆試面試全攻略_第2頁
Python技術(shù):基礎(chǔ)知識筆試面試全攻略_第3頁
Python技術(shù):基礎(chǔ)知識筆試面試全攻略_第4頁
Python技術(shù):基礎(chǔ)知識筆試面試全攻略_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1Python函數(shù)參數(shù)傳遞

看兩個例子:

Python

a=1

deffun(a):

a=2

:fun(a)

Sprinta#1

Python

la=[]

deffun(a):

a.append(1)

fun(a)

Sprinta#[1]

全部變量都能夠了解是內(nèi)存中一個對象"引用",或者,也能夠看似C中void*感覺。

這里記住是類型是屬于對象,而不是變量。而對象有兩種,"可更改"(mutable仔"不可更改"(immutable)

對象。在python中,strings,tuples,和numbers是不可更改對象,而list,diet等則是能夠修改對象。(這

就是這個問題重點)

當(dāng)一個引用傳遞給函數(shù)時候,函數(shù)自動復(fù)制一份引用,這個函數(shù)里引用和外邊引用沒有半毛關(guān)系了.所以第一

個例子里函數(shù)把引用指向了一個不可變對象,當(dāng)函數(shù)返回時候,外面引用沒半毛感覺.而第二個例子就不一樣

了,函數(shù)內(nèi)引用指向是可變對象,對它操作就和定位了指針地址一樣,在內(nèi)存里進(jìn)行修改.

假如還不明白話,這里有愈加好解釋:

2Python中元類(metadass)

這個非常不慣用,不過像ORM這種復(fù)雜結(jié)構(gòu)還是會需要,詳情請看太深刻了解Python中元類(metadass)》

3@staticmethodfn@classmethod

Python其實有3個方法,即靜態(tài)方法(staticmethod),類方法(dassmethod)和實例方法,以下:

Python

deffoo(x):

print"executingfoo(%s)"%(x)

classA(object):

deffoo(self,x):

print"executingfoo(&s,&s)叮(self,x)

Oclassmethod

defclass_foo(cis,x):

print"executingclass_f-?,)”(cis,x)

11

Gstaticmethod

defstatic_foo(x):

print"executingstatic_foo(%s)'1%x

:a=A()

這里先了解下函數(shù)參數(shù)里面self和cis.這個self和cis是對類或者實例綁定,對于通常函數(shù)來說我們能夠這

么調(diào)用foo(x),這個函數(shù)就是最慣用,它工作跟任何東西(類,實例)無關(guān).對于實例方法,我們知道在類里每次

定義方法時候都需要綁定這個實例,就是foo(self,x),為何要這么做呢?因為實例方法調(diào)用離不開實例,

我們需要把實例自己傳給函數(shù),調(diào)用時候是這么a.f。。(x)(其實是foo(a,x)).類方法一樣,只不過它傳遞

是類而不是實例,A.class_foo(x).注意這里self和cis能夠替換別參數(shù),不過python約定是這倆,還是不

要改好.

對于靜態(tài)方法其實和普通方法一樣,不需要對誰進(jìn)行綁定,唯一區(qū)分是調(diào)用時候需要使用a.static_foo(x)

或者A.staticfoo(x)來調(diào)用.

\實例方法類方法靜態(tài)方法

a=A()a.foo(x)a.class_foo(x)a.static_foo(x)

A不可用A.class_foo(x)A.static_foo(x)

更多關(guān)于這個問題:

4類變量和實例變量

Python

classPerson:

name="aaa"

pl=Person()

p2=Person()

pl.name=,,bbb"

print#bbb

printp2.name#aaa

printPerson.name-?aaa

類變量就是供類使用變量,實例變量就是供實例使用.

這里pl.name="bbb”是實例調(diào)用了類變量,這其實和上面第一個問題一樣就是函數(shù)傳參問題pl.name一

開始是指向類變量name="aaa”,不過在實例作用域里把類變量引用改變了就變成了一個實例變

量,不再弓|用Person類變量name了.

能夠看看下面例子:

Python

classPerson:

name=[]

?pl=Person()

p2=Person()

pl.name.append(1)

printpl.name#[1]

sprintp2.name#⑴

'printP/[1]

參考:

5Python自省

這個也是python彪悍特征.

自省就是面向?qū)ο笳Z言所寫程序在運行時,所能知道對象類型.簡單一句就是運行時能夠取得對象類型.比如

type(),dir(),getattr(),hasattr(),isinstance().

6字典推導(dǎo)式

可能你見過列表推導(dǎo)時,卻沒有見過字典推導(dǎo)式,在2.7中才加入:

Python

d-{key:valuefor(key,value)initerable!

7Python中單下劃線和雙下劃線

Python

1?>classMyClass():

...def_init_(self):

…self._superprivate-"Hello"

...self._semiprivate=",world!"

E...

■?>me=MyClass()

>>>printme._superprivate

cTraceback(mostrecentcalllast):

u

File'*<stdin>zline1,in<module>

1AttributeError:myClassinstancehasnoattribute*_superprivate,

1?>printme._semiprivate

,world!

?>printme._diet_

4{*_MyClass_superprivate1:*Hello','_semiprivate*:',world!')

_f°o_:一個約定,Python內(nèi)部名字,用來區(qū)分其余用戶自定義命名,以防沖突.

_f。。:一個約定,用來指定變量私有.程序員用來指定私有變量一個方式.

_f。。:這個有真正意義:解析器用_classname_f。。來代替這個名字,以區(qū)分和其余類相同命名.

詳情見:

或者:

8字符串格式化:%和.format

.format在許多方面看起來更便利.對于;最煩人是它無法同時傳遞一個變量^元組.你可能會想下面代碼不

會有什么問題:

Python

."hithere%sH%name

不過,假如name恰好是(1,2,3),它將會拋出一個TypeError異常為了確保它總是正確,你必須這么做:

Python

“hithere%sn%(name,)代提供一個單■兀案數(shù)組而不是一個參數(shù)

不過有點丑“format就沒有這些問題.你給第二個問題也是這么,.format好看多了.

你為何不用它?

不知道它(在讀這個之前)

為了和Python2.5兼容(譬如logging庫提議使用為(issue#4))

9迭代器和生成器

這個是stackoverflow里python排名第一問題,值得一看:

這是漢字版:

10*argsand**kwargs

用*args和**kwargs只是為了方便并沒有強(qiáng)制使用它們.

當(dāng)你不確定你函數(shù)里將要傳遞多少參數(shù)時你能夠用*args.比如,它能夠傳遞任意數(shù)量參數(shù):

Python

1>?defprint_everything(*args):

forcount,thinginenumerate(args):

...print1{0}.{111.format(count,thing)

...

?>print_everything(1apple',*banana','cabbage')

0.apple

1.banana

2.cabbage

相同,**kwargs允許你使用沒有事先定義參數(shù)名:

Python

1?>deft;able_things(**kwargs):

...forname,valueinkwargs.items():

...print*(0}={1}*.format(name,value)

4...

?>table_things(apple=*fruit*,cabbage=Vegetable*)

cabbage=vegetable

apple=fruit

你也能夠混著用.命名參數(shù)首先取得參數(shù)值然后全部其余參數(shù)都傳遞給*args和**kwargs.命名參數(shù)在列

表最前端.比如:

Python

deftable_"hings(titlestring,**kwargs)

*args和**kwargs能夠同時在函數(shù)定義中,不過*args必須在**kwargs前面.

當(dāng)調(diào)用函數(shù)時你也能夠用*和**語法.比如:

Python

?>defprint_three_things(a,b,c):

...print'a={0},b={1},c={2)*.format(a,b,c)

...

;?>mylist=[*aardvark*,1baboon*,*cat']

>?print~hree_things(*mylist)

a=aardvark,b=baboon,c=cat

就像你看到一樣,它能夠傳遞列表(或者元組)每一項并把它們解包.注意必須與它們在函數(shù)里參數(shù)相吻合.當(dāng)

然,你也能夠在函數(shù)定義或者函數(shù)調(diào)用時用*.

11面向切面編程AOP和裝飾器

這個AOP一聽起來有點懵,同學(xué)面阿里時候就被問懵了…

裝飾器是一個很著名設(shè)計模式,經(jīng)常被用于有切面需求場景,較為經(jīng)典有插入日志、性能測試、事務(wù)處理

等。裝飾器是處理這類問題絕佳設(shè)計,有了裝飾器,我們就能夠抽離出大量函數(shù)中與函數(shù)功效本身無關(guān)雷

同代碼并繼續(xù)重用。概括講,裝飾器作用就是為已經(jīng)存在對象添加額外功效。

這個問題比較大,推薦:

漢字:

12鴨子類型

"當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就能夠被稱為鴨子。"

我們并不關(guān)心對象是什么類型,到底是不是鴨子,只關(guān)心行為,

比如在python中,有很多file-like東西,比如StringIO,GzipFile,socket,它們有很多相同方法,我們把

它們看成文件使用。

又比如list.extend()方法中,我們并不關(guān)心它參數(shù)是不是list,只要它是可迭代,所以它參數(shù)能夠是

list/tuple/dict/^^串器等.

鴨子類型在動態(tài)語言中經(jīng)常使用,非常靈活,使得python不想java那樣專門去弄一大堆設(shè)計模式。

13Python中第

引自知乎:

函數(shù)重載主要是為了處理兩個問題。

1.可變參數(shù)類型。

2.可變參數(shù)個數(shù)。

另外,一個基本設(shè)計標(biāo)準(zhǔn)是,僅僅當(dāng)兩個函數(shù)除了參數(shù)類型和參數(shù)個數(shù)不一樣以外,其功效是完全相同,

此時才使用函數(shù)重載,假如兩個函數(shù)功效其實不一樣,那么不應(yīng)該使用重載,而應(yīng)該使用一個名字不一樣

函數(shù)。

好吧,那么對于情況1,函數(shù)功效相同,不過參數(shù)類型不一樣,python怎樣處理?答案是根本不需要處

理,因為python能夠接收件可類型參數(shù),假如函數(shù)功效相同,那么不一樣參數(shù)類型在python中很可

能是相同代碼,沒有必要做成兩個不一樣函數(shù)。

那么對于情況2,函數(shù)功效相同,但參數(shù)個數(shù)不一樣,python怎樣處理?大家知道,答案就是缺省參數(shù)。

對那些缺乏參數(shù)設(shè)定為缺省參數(shù)即可處理問題。因為你假設(shè)函數(shù)功效相同,那么那些缺乏參數(shù)終究是需要

用。

好了,鑒于情況1跟情況2都有了處理方案,python自然就不需要函數(shù)重載了。

14新式類和舊式類

這個面試官問了,我說了老半天,不知道他問真正意圖是什么.

stackoverflow

這篇文章很好介紹了新式類特征:

新式類很早在2.2就出現(xiàn)了,所以舊式類完全是兼容問題,Python3里類全部都是新式類.這里有一個MRO

問題能夠了解下(新式類是廣度優(yōu)先,舊式類是深度優(yōu)先),<Python關(guān)鍵編程》里講也很多.

15__new和__init_—區(qū)分

這個new確實極少見到,先做了解吧.

1._new_是一個靜態(tài)方法,而_init_是一個實例方法.

2._new_方法會返回一個創(chuàng)建實例,而_init_什么都不返回.

3.只有在_new_返回一個cis實例時后面_init_才能被調(diào)用.

4.當(dāng)創(chuàng)建一個新實例時調(diào)用_new_,初始化一個實例時用

stackoverflow

ps:_metaclass_是創(chuàng)建類時起作用.所以我們能夠分別使用_metaclass_,_newinit

來分別在類創(chuàng)建,實例創(chuàng)建和實例初始化時候做一些小手腳.

16單例模式

這個絕對常考啊.絕對要記住1~2個方法,當(dāng)初面試官是讓手寫.

1使用_new方法

Python

classSingleton(object):

def_new_(cis,*argsz**kw):

ifnothasattr(cis,[instance'):

orig=super(Singleton,cis)

cis._instance=orig.new_(cis,*args,**kw)

returncis._instance

classMyClass(Singleton):

9a=1

2共享屬性

創(chuàng)建實例時把全部實例_dict_指向同f字典,這么它們具備相同屬性和方法.

Python

classBorg(object):

_state={}

def_new_(cis,*args,**kw):

ob=super(Borg,cis)._new_(cis,*args,**kw)

ob._diet_=cls._state

returnob

classMyClass2(Borg):

9a=1

3裝飾器版本

Python

defsingleton(cis,*args,**kw):

instances={}

defgetinstance():

ifcisnotininstances:

instances[cis]=cis(*args,**kw)

returninstances[cis]

returngetinstance

'^singleton

classMyClass:

4import方法

作為python模塊是天然單例模式

Python

1#mysingleton.py

classMy_Singleton(object):

deffoo(self):

pass

1my_singleton=My_Singleton()

8#touse

frommysingletoninqportmy_singleton

10

:my_singleton.foo()

17Python中作用域

Python中,一個變量作用域總是由在代碼中被賦值地方所決定。

當(dāng)Python碰到一個變量話他會按照這么次序進(jìn)行搜索:

當(dāng)?shù)刈饔糜?Local)一當(dāng)前作用域被嵌入當(dāng)?shù)刈饔糜?Enclosinglocals)-全局/模塊作用域(Global)

一內(nèi)置作用域(Built-in)

18GIL線程全局鎖

線程全局鎖(GlobalInterpreterLock),即Python為了確保線程安全而采取獨立線程運行限制,說白了就是

一個核只能在同一時間運行一個線程.

見Python最難問題

處理方法就是多進(jìn)程和下面協(xié)程(協(xié)程也只是單CPU,不過能減小切換代價提升性能).

19協(xié)程

知乎被問到了,呵呵噠,跪了

簡單點說協(xié)程是進(jìn)程和線程升級版,進(jìn)程和線程都面臨著內(nèi)核態(tài)和用戶態(tài)切換問題而花費許多切換時間,而

協(xié)程就是用戶自己控制切換時機(jī),不再需要陷入系統(tǒng)內(nèi)核態(tài).

Python里最常見yield就是協(xié)程思想!能夠查看第九個問題.

20閉包

閉包(closure)是函數(shù)式編程主要語法結(jié)構(gòu)。閉包也是一個組織代碼結(jié)構(gòu),它一樣提升了代碼可重復(fù)使用性。

當(dāng)一個內(nèi)嵌函數(shù)引用其外部作作用域變量,我們就會得到一個閉包.總結(jié)一下,創(chuàng)建一個閉包必須滿足以下

幾點:

1.必須有一個內(nèi)嵌函數(shù)

2.內(nèi)嵌函數(shù)必須引用外部函數(shù)中變量

3.外部函數(shù)返回值必須是內(nèi)嵌函數(shù)

感覺閉包還是有難度,幾句話是說不明白,還是查查相關(guān)資料.

重點是函數(shù)運行后并不會被撤消,就像16題instance字典一樣,當(dāng)函數(shù)運行完后,instance并不被銷毀,而是

繼續(xù)留在內(nèi)存空間里.這個功效類似類里類變量,只不過遷移到了函數(shù)上.

閉包就像個空心球一樣,你知道外面和里面,但你不知道中間是什么樣.

21lambda函數(shù)

其實就是一個匿名函數(shù),為何叫l(wèi)ambda?因為和后面函數(shù)式編程關(guān)于.

推薦:知乎

22Python函數(shù)式編程

這個需要適當(dāng)了解一下吧,畢竟函數(shù)式編程在Python中也做了引用.

推薦:酷殼

python中函數(shù)式編程支持:

filter函數(shù)功效相當(dāng)于過濾器。調(diào)用一個布爾函數(shù)bool_func來迭代遍歷每個seq中元素;返回一個使

bool_seq返回值為true元素序列。

Python

?>a=[1,2,3,4,5,6,7]

>>>b=filter(lambdax:x>5,a)

3>?printb

4?>[6,7]

map函數(shù)是對一個序列每個項依次執(zhí)行函數(shù),下面是對一個序列每個項都乘以2:

Python

_?>a-maj(lambdax:x*2,[1,2,3])

>?list(a)

3[2,4,6]

reduce函數(shù)是對一個序列每個項迭代調(diào)用函數(shù),下面是求3階乘:

Python

1>?reduce(lambdaxzy:x*y,range(1,4))

26

23Python里拷貝

弓I用和copy(),deepcopy()區(qū)分

Python

importcopy

(1,2,3,4,〔'a','b'H

4b=a

5c=copy.copy(a)KE軟注g.淺拷貝

6d=copy.deepcopy(a)

a.append(5)不/改對象a

9a[4].appendCc*)¥海廊的象a中數(shù)組對象

:print'a=*,a

'.'print'b=b

iJprint*c=*/c

..print'd=''d

輸出結(jié)果:

[1,2,3,4,?b\S],5]

[Ta?,'b\'c」,5]

[*a,,,b*,'c1]]

[,a','b1]]

24Python垃圾回收機(jī)制

PythonGC主要使用引用計數(shù)(referencecounting)來跟蹤和回收垃圾。在引用計數(shù)基礎(chǔ)上,經(jīng)過"標(biāo)

識-去除"(markandsweep)處理容器對象可能產(chǎn)生循環(huán)引用問題,經(jīng)過"分代回收"(generation

collection)以空間換時間方;施升垃圾回收效率。

1引用計數(shù)

PyObject是每個對象必有內(nèi)容,其中Ob_refcnt就是做為引用計數(shù)。當(dāng)一個對象有新引用時,它

ob_refcnt就會增加,當(dāng)引用它對象被刪除,它ob_refcnt就會降低.引用計數(shù)為0時,該對象生命就

結(jié)束了.

優(yōu)點:

1.簡單

2.實時性

缺點:

1.維護(hù)引用計數(shù)消耗資源

2.循環(huán)引用

2標(biāo)識-去除機(jī)制

基本思緒是先按需分配,等到?jīng)]有空閑內(nèi)存時候從存放器和程序棧上引用出發(fā),遍歷以對象為節(jié)點、以引

用為邊組成圖,把全部能夠訪問到對象打上標(biāo)識,然后清掃一遍內(nèi)存空間,把全部沒標(biāo)識對象釋放。

3分代技術(shù)

分代回收整體思想是:將系統(tǒng)中全部內(nèi)存塊依照其存活時間劃分為不一樣集合,每個集合就成為一個"代",

垃圾搜集頻率伴隨"代”存活時間增大而減小,存活時間通常利用經(jīng)過幾次垃圾回收來度量。

Python默認(rèn)定義了三代對象集合,索引數(shù)越大,對象存活時間越長。

舉例:

當(dāng)一些內(nèi)存塊M經(jīng)過了3次垃圾搜集清洗之后還存活時,我們就將內(nèi)存塊M劃到一個集合A中去,而新

分配內(nèi)存都劃分到集合B中去。當(dāng)垃圾搜集開始工作時,大多數(shù)情況都只對集合B進(jìn)行垃圾回收,而對集

合A進(jìn)行垃圾回收要隔相當(dāng)長一段時間后才進(jìn)行,這就使得垃圾搜集機(jī)制需要處理內(nèi)存少了,效率自然就

提升了.在這個過程中,集合B中一些內(nèi)存塊因為存活時間長而會被轉(zhuǎn)移到集合A中,當(dāng)然,集合A中實

際上也存在一些垃圾,這些垃圾回收會因為這種分代機(jī)制而被延遲。

25PythonList

推薦:

26Pythonis

is是對比地址,==是對比值

27read,readlinereadlines

?read讀取整個文件

?readline讀取下一行,使用生成器方法

?readlines讀取整個文件到一個迭代器以供我們遍歷

28Python2和3區(qū)分

推薦:<Python2.7.x和3.x版本主要區(qū)分》

操作系統(tǒng)

1select,poll和epoll

其實全部I/O都是輪詢方法,只不過實現(xiàn)層面不一樣罷了.

這個問題可能有點深入了,但相信能回答出這個問題是對I/O多路復(fù)用有很好了解了.其中tornado使用就

是epoll.

selec,poll和epoll區(qū)分總結(jié)

基本上select有3個缺點:

1.連接數(shù)受限

2.查找配對速度慢

3.數(shù)據(jù)由內(nèi)核拷貝到用戶態(tài)

poll改進(jìn)了第一個缺點

epoll改了三個缺點.

關(guān)于epoll:

2調(diào)度算法

1.先來先服務(wù)(FCFS,FirstComeFirstServe)

2,短作業(yè)優(yōu)先(SJF,ShortestJobFirst)

3.最高優(yōu)先權(quán)調(diào)度(PriorityScheduling)

4.時間片輪轉(zhuǎn)(RR,RoundRobin)

5.多級反饋隊歹11調(diào)度(multilevelfeedbackqueuescheduling)

實時調(diào)度算法:

1.最早截至?xí)r間優(yōu)先EDF

2.最低松弛度優(yōu)先LLF

3死鎖

原因:

1.競爭資源

2.程序推進(jìn)次序不妥

必要條件:

互斥條件

2.請求和保持條件

3.不剝奪條件

4.環(huán)路等候條件

處理死鎖基本方法:

1.預(yù)防死鎖(摒棄除1以外條件)

2.防止死鎖(銀行家算法)

3.檢測死鎖(資源分配圖)

4.解除死鎖

1.剝奪資源

2.撤消進(jìn)程

4程序編譯與鏈接

推薦:

Bulid過程能夠分解為4個步驟:預(yù)處理(Prepressing),編譯(Compigti。n)、匯編(Assembly)、鏈接

(Linking)

以c語言為例:

1預(yù)處理

預(yù)編譯過程主要處理那些源文件中以"鏟’開始預(yù)編譯指令,主要處理規(guī)則有:

將全部"#define"刪除,并展開所用宏定義

2.處理全部條件預(yù)編譯指令,比如"#if"、"#ifdef"、"#elif"、"#endif"

3.處理"#include”預(yù)編譯指令,將被包含文件插入到該編譯指令位置,注:此過程是遞歸進(jìn)行

4.刪除全部注釋

5.添加行號和文件名標(biāo)識,方便于編譯時編譯器產(chǎn)生調(diào)試用行號信息以及用于編譯時產(chǎn)生編譯錯誤

或警告時可顯示俏

6.保留全部#pragma編譯器指令。

2編譯

編譯過程就是把預(yù)處理完文件進(jìn)行一系列詞法分析、語法分析、語義分析及優(yōu)化后生成對應(yīng)匯編代碼文件。

這個過程是整個程序構(gòu)建關(guān)鍵部分。

3匯編

匯編器是將匯編代碼轉(zhuǎn)化成機(jī)器能夠執(zhí)行指令,每一條匯編語句幾乎都是一條機(jī)器指令。經(jīng)過編譯、鏈接、

匯編輸出文件成為目標(biāo)文件(ObjectFile)

4鏈接

鏈接主要內(nèi)容就是把各個模塊之間相互引用部分處理好,使各個模塊能夠正確拼接.

鏈接主要過程包塊地址和空間分配(AddressandStorageAllocation)、符號決議(SymbolResolution)

和重定位(Relocation)等步驟。

5靜態(tài)鏈接和動態(tài)鏈接

靜態(tài)鏈接方法:靜態(tài)鏈接時候,載入代碼就會把程序會用到動態(tài)代碼或動態(tài)代碼地址確定下來

靜態(tài)庫鏈接能夠使用靜態(tài)鏈接,動態(tài)鏈接庫也能夠使用這種方法鏈接導(dǎo)入庫

動態(tài)鏈接方法:使用這種方式程序并不在一開始就完成動態(tài)鏈接,而是直到真正調(diào)用動態(tài)庫代碼時,載入

程序才計算(被調(diào)用那部分)動態(tài)代碼邏輯地址,然后等到某個時候,程序又需要調(diào)用另外某塊動態(tài)代碼時,

載入程序又去計算這部分代碼邏輯地址,所以,這種方式使程序初始化時間較短,但運行期間性能比不上

靜態(tài)鏈接程序

6虛擬內(nèi)存技術(shù)

虛擬存放器是值具備請求調(diào)入功效和置換功效,能從邏輯上對內(nèi)存容量加以擴(kuò)充一個存放系統(tǒng).

7分頁和分段

分頁:用戶程序地址空間被劃分成若干固定大小區(qū)域,稱為"頁",對應(yīng)地,內(nèi)存空間分成若干個物理塊,

頁和塊大小相等??蓪⒂脩舫绦蛉我豁摲旁趦?nèi)存任一塊中,實現(xiàn)了離散分配。

分段:將用戶程序地址空間分成若干個大小不等段,每段能夠定義一組相對完整邏輯信息。存放分配時,

以段為單位,段與段在內(nèi)存中能夠不相鄰接,也實現(xiàn)了離散分配.

分頁與分段主要區(qū)分

1.頁是信息物理單位,分頁是為了實現(xiàn)非連續(xù)分配,方便處理內(nèi)存碎片問題,或者說分頁是因為系統(tǒng)管

理需要.段是信息邏輯單位,它含有一組意義相對完整信息,分段目標(biāo)是為了愈加好地實現(xiàn)共享,滿足用戶

需要.

2,頁大小固定,由系統(tǒng)確定,將邏輯地址劃分為頁號和頁內(nèi)地址是由機(jī)器硬件實現(xiàn).而段長度卻不固定,

決定于用戶所編寫程序,通常由編譯程序在對源程序進(jìn)行編譯時依照信息性質(zhì)來劃分.

3.分頁作業(yè)地址空間是一維.分段地址空間是二維.

8頁面置換算法

1.最好置換算法OPT:不可能實現(xiàn)

2.先進(jìn)先出FIFO

3.最近最久未使用算法LRU:最近一段時間里最久沒有使用過頁面給予置換.

4.clock算法

9邊緣觸發(fā)和水平觸發(fā)

邊緣觸發(fā)是指每當(dāng)狀態(tài)改變時發(fā)生一個io事件,條件觸發(fā)是只要滿足條件就發(fā)生一個io事件

數(shù)據(jù)庫

1事務(wù)

數(shù)據(jù)庫事務(wù)(DatabaseTransaction),是指作為單個邏輯工作單元執(zhí)行一系列操作,要么完全地執(zhí)行,要

么完全地不執(zhí)行。

2數(shù)據(jù)庫索引

推薦:

MySQL索引背后您結(jié)構(gòu)及算法建

聚集索引,非聚集索引,B-Tree,B+Tree,最左前綴原理

3Redis原理

4樂觀鎖和消極鎖

消極鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性操作

樂觀鎖:假設(shè)不會發(fā)生并發(fā)沖突,只在提交操作時檢驗是否違反數(shù)據(jù)完整性。

5MVCC

6MylSAM和InnoDB

MylSAM適合于一些需要大量查詢應(yīng)用,但其對于有大量寫操作并不是很好。甚至你只是需要update一

個字段,整個表都會被鎖起來,而別進(jìn)程,就算是讀進(jìn)程都無法操作直到讀操作完成.另外,MylSAM對

于SELECTCOUNT(*)這類計算是超快無比。

InnoDB趨勢會是一個非常復(fù)雜存放引擎,對于一些小應(yīng)用,它會比MylSAM還慢。他是它支持“行鎖",

于是在寫操作比較多時候,會更優(yōu)異。而且,他還支持更多高級應(yīng)用,比如:事務(wù)。

網(wǎng)絡(luò)

1三次握手

1.客戶端經(jīng)過向服務(wù)器端發(fā)送一個SYN來創(chuàng)建一個主動打開,作為三路握手一部分.客戶端把這段

連接序號設(shè)定為隨機(jī)數(shù)A。

2.服務(wù)器端應(yīng)該為一個正當(dāng)SYN回送一個SYN/ACK。ACK確實認(rèn)碼應(yīng)為A+l,SYN/ACK包本

身又有一個隨機(jī)序號B。

3.最終,客戶端再發(fā)送一個ACK。當(dāng)服務(wù)端受到這個ACK時候,就完成了三路握手,并進(jìn)入了連

接創(chuàng)建狀態(tài)。此時包序號被設(shè)定為收到確實認(rèn)號A+1,而響應(yīng)則為B+L

2四次揮手

3ARP協(xié)議

地址解析協(xié)議(AddressResolutionProtocol):依照IP地址獲取物理地址一個TCP/IP協(xié)議

4urllibfQurllib2區(qū)分

這個面試官確實問過,當(dāng)初答urllib2能夠Post而urllib不能夠.

1.urllib提供urlencode方法用來GET查詢字符串產(chǎn)生而urllib2沒有。這是為何urllib常和urllib2

一起使用原因。

2.urllib2能夠接收一個Request類實例來設(shè)置URL請求headers,urllib僅能夠接收URL。這意

味著,你不能夠偽裝你UserAgent字符串等。

5Post和Get

GET和POST有什么區(qū)分?及為何網(wǎng)上多數(shù)答案都是錯

get:RFC2616-HypertextTransferProtocol—HTTP/1.1

post:RFC2616-HypertextTransferProtocol—HTTP/1.1

6Cookie和Session

CookieSession

儲存位置客戶端服務(wù)器端

目標(biāo)跟蹤會話,也能夠保留用戶偏好設(shè)置或者保留用戶名密碼等跟蹤會話

安全性不安全安全

session技術(shù)是要使用到cookie,之所以出現(xiàn)session技術(shù),主要是為了安全。

7apache和nginx區(qū)分

nginx相對apache優(yōu)點:

?輕量級,一樣起web服務(wù),比叩ache占用更少內(nèi)存及資源

?抗并發(fā),nginx處理請求是異步非阻塞,支持更多并發(fā)連接,而apache則是阻塞型,在高并發(fā)

下nginx能保持低資源低消耗高性能

?配置簡練

?高度模塊化設(shè)計,編寫模塊相對簡單

?小區(qū)活躍

apache相對nginx優(yōu)點:

?rewrite,比nginxrewrite強(qiáng)大

?模塊超多,基本想到都能夠找到

?少bug,nginxbug相對較多

?超穩(wěn)定

8網(wǎng)站用戶密碼保留

明文保留

2.明文hash后保留,如md5

3.MD5+Salt方式,這個salt能夠隨機(jī)

4.知醒用了Bcrypy(好像)加密

9HTTP和HTTPS

狀態(tài)碼定義

1XX匯報接收到請求,繼續(xù)進(jìn)程

2xx成功步驟成功接收,被了解,并被接收

3xx重定向為了完成請求,必須采取深入方法

4xx客戶端犯錯請求包含錯次序或不能完成

5xx服務(wù)器犯錯服務(wù)器無法完成顯然有效請求

403:Forbidden

404:NotFound

HTTPS握手,對稱加密,非對稱加密,TLS/SSLRSA

10XSRF和XSS

?CSRF(Cross-siterequestforgery)跨站請求偽造

?XSS(CrossSiteScripting)跨站腳本攻擊

CSRF重點在請求,XSS重點在腳本

11鬲等Idempotence

HTTP方法鬲等性是指一次和數(shù)次請求某一個資源應(yīng)該具備一樣副作用。(注意是副作用)

GET,不會改變資源狀態(tài),不論調(diào)用一次還是N次都沒有副作用。請注意,這里強(qiáng)調(diào)是一次和N次具備

相同副作用,而不是每次GET結(jié)果相同。GET,但它本身并沒有產(chǎn)生任何副作用,因而是滿足鬲等性。

DELETE方法用于刪除資源,有副作用,但它應(yīng)該滿足嘉等性。比如:DELETE,調(diào)用一次和N次對系統(tǒng)

產(chǎn)生副作用是相同,即刪掉id為4231帖子;所以,調(diào)用者能夠數(shù)次調(diào)用或刷新頁面而無須擔(dān)心引發(fā)錯誤。

POST所對應(yīng)URI并非創(chuàng)建資源本身,而是資源接收者。比如:POST://.com/articles下創(chuàng)建一篇

帖子,HTTP響應(yīng)中應(yīng)包含帖子創(chuàng)建狀態(tài)以及帖子URL兩次相同POST請求會在服務(wù)器端創(chuàng)建兩份資源,

它們具備不一樣URI;所以,POST方法不具備幕等性。

PUT所對應(yīng)URI是要創(chuàng)建或更新資源本身。比如:PUT。對同一URI進(jìn)行數(shù)次PUT副作用和一次PUT

是相同;所以,PUT方法具備鬲等性。

12RESTful架構(gòu)(SOAP,RPC)

推薦:

13SOAP

SOAP(原為SimpleObjectAccessProtocol首字母縮寫,即簡單對象訪問協(xié)議)是交換數(shù)據(jù)一個協(xié)議

規(guī)范,使用在計算機(jī)網(wǎng)絡(luò)Web服務(wù)(webservice)中,交換帶結(jié)構(gòu)信息。SOAP為了簡化網(wǎng)頁服務(wù)器(Web

Server)從XML數(shù)據(jù)庫中提取數(shù)據(jù)時,節(jié)約去格式化頁面時間,以及不一樣應(yīng)用程序之間按照HTTP通

信協(xié)議,遵從XML格式執(zhí)行資料交換,使其抽象于語言實現(xiàn)、平臺和硬件。

14RPC

RPC(RemoteProcedureCallProtocol)遠(yuǎn)程過程調(diào)用協(xié)議,它是一個經(jīng)過網(wǎng)絡(luò)從遠(yuǎn)程計算機(jī)程序

上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)協(xié)議.RPC協(xié)議假定一些傳輸協(xié)議存在,如TCP或UDP,為通

信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包含網(wǎng)絡(luò)

分布式多程序在內(nèi)應(yīng)用程序愈加輕易。

總結(jié)服務(wù)提供兩大流派.傳統(tǒng)意義以方法調(diào)用為導(dǎo)向通稱RPC。為了企業(yè)SOA,若干廠商聯(lián)合推出

webservice,制訂了wsdl接口定義,傳輸so叩.當(dāng)互聯(lián)網(wǎng)時代,臃腫SOA被簡化為http+xml/json不過簡化

出現(xiàn)各種混亂。以資源為導(dǎo)向,任何操作無非是對資源增刪改查,于是統(tǒng)一REST出現(xiàn)了.

進(jìn)化次序:RPC->SOAP->RESTful

15CGI和WSGI

CGI是通用網(wǎng)關(guān)接口,是連接web服務(wù)器和應(yīng)用程序接口,用戶經(jīng)過CGI來獲取動態(tài)數(shù)據(jù)或文件等。

CGI程序是一個獨立程序,它能夠用幾乎全部語言來寫,包含perl,c,lua,python等等。

WSGI,WebServerGatewayInterface,是Python應(yīng)用程序或框架和Web服務(wù)器之間一個接口,WSGI

其中一個目標(biāo)就是讓用戶能夠用統(tǒng)一語言(Python)編寫前后端。

官方說明:PEP-3333

16中間人攻擊

在GFW里屢見不鮮,呵呵.

中間人攻擊(Man-in-the-middleattack,通常縮寫為MITM)是指攻擊者與通訊兩端分別創(chuàng)建獨立聯(lián)絡(luò),

并交換其所收到數(shù)據(jù),使通訊兩端認(rèn)為他們正在經(jīng)過一個私密連接與對方直接對話,但實際上整個會話都

被攻擊者完全控制。

17clOk問題

所謂clOk問題,指是服務(wù)器同時支持成千上萬個客戶端問題也就是concurrent10000connection(這

也是clOk這個名字由來).

推薦:

18socket

推薦:

Socket=Ipaddress+TCP/UDP+port

19瀏覽器緩存

推薦:

304NotModified

20HTTP1.0和HTTP1.1

推薦:

1.請求頭Host字段,一個服務(wù)器多個網(wǎng)站

2.長鏈接

3.文件斷點續(xù)傳

4.身份認(rèn)證,狀態(tài)管理,Cache緩存

21Ajax

AJAX,AsynchronousJavaScriptandXML(異步JavaScript和XML),是與在不重新加載整個頁面情

況下,與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁技術(shù)。

*NIX

unix進(jìn)程間通信方式(IPC)

1.管道(Pipe):管道可用于具備親緣關(guān)系進(jìn)程間通信,允許一個進(jìn)程和另一個與它有共同祖先進(jìn)

程之間進(jìn)行通信。

2.命名管道(namedpipe):命名管道克服了管道沒有名字限制,所以,除具備管道所具備功效

外,它還允許無親緣關(guān)系進(jìn)程間通信。命名管道在文件系統(tǒng)中有對應(yīng)文件名。命名管道經(jīng)過命令mkfifo

或系統(tǒng)調(diào)用mkfifo來創(chuàng)建。

3.信號(Signal):信號是比較復(fù)雜通信方式,用于通知接收進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程

間通信外,進(jìn)程還能夠發(fā)送信號給進(jìn)程本身;linux除了支持Unix早期信號語義函數(shù)sigal外,還支

持語義符合Posix.l標(biāo)準(zhǔn)信號函數(shù)sigaction(實際上,該函數(shù)是基于BSD,BSD為了實現(xiàn)可靠信號

機(jī)制,又能夠統(tǒng)一對外接口,用sigaction函數(shù)重新實現(xiàn)了signal函數(shù))。

4.消息(Message)隊列:消息隊歹?。┦窍㈡溄颖?,包含Posix消息隊列systemV消息隊列。有

足夠權(quán)限進(jìn)程能夠向隊列中添加消息,被賦予讀權(quán)限進(jìn)程則能夠讀走隊列中消息。消息隊列克服了信

號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺

5.共享內(nèi)存:使得多個進(jìn)程能夠訪問同一塊內(nèi)存空間,是最快可用IPC形式。是針對其余通信機(jī)制

運行效率較低而設(shè)計。往往與其它通信機(jī)制,如信號量結(jié)合使用,來達(dá)成進(jìn)程間同時及互斥。

6.內(nèi)存映射(mappedmemory):內(nèi)存映射允許任何多個進(jìn)程間通信,每一個使用該機(jī)制進(jìn)程經(jīng)

過把一個共享文件映射到自己進(jìn)程地址空間來實現(xiàn)它。

7.信號量(sem叩hore):主要作為進(jìn)程間以及同一進(jìn)程不一樣線程之間同時伎倆。

8.套接口(Socket):更為通常進(jìn)程間通信機(jī)制,可用于不一樣機(jī)器之間進(jìn)程間通信.起初是由

Unix系統(tǒng)BSD分支開發(fā)出來,但現(xiàn)在通常能夠移植到其它類Unix系統(tǒng)上:Linux和SystemV變種

都支持套接字.

數(shù)據(jù)結(jié)構(gòu)

1紅黑樹

紅黑樹與AVL比較:

AVL是嚴(yán)格平衡樹,所以在增加或者刪除節(jié)點時候,依照不一樣情況,旋轉(zhuǎn)次數(shù)比紅黑樹要多;

紅黑是用非嚴(yán)格平衡來換取增刪節(jié)點時候旋轉(zhuǎn)次數(shù)降低;

所以簡單說,假如你應(yīng)用中,搜索次數(shù)遠(yuǎn)遠(yuǎn)大于插入和刪除,那么選擇AVL,假如搜索,插入刪除次數(shù)幾

乎差不多,應(yīng)該選擇RB.

編程題

1臺階問題/斐波納挈

一只青蛙一次能夠跳上1級臺階,也能夠跳上2級。求該青蛙跳上一個n級臺階總共有多少種跳法。

Python

1fib-lambdan:nifn<=2elsefib(n-1)+fib(n-2)

第二種記憶方法

Python

defmemo(func):

cache={}

defwrap(*args):

ifargsnotincache:

cachetargs]=func(*args)

returncache(args]

returnwrap

!:@memo

deffib(i):

ifi<2:

return1

returnfib(i-1)+fib(i-2)

第三種方法

Python

deffib(n):

a,b=0/1

for_inxrange(n):

a,b=b,a+b

returnb

2變態(tài)臺階問題

一只青蛙一次能夠跳上1級臺階,也能夠跳上2級……它也能夠跳上n級。求該青蛙跳上一個n級臺階總

共有多少種跳法。

Python

fiblambdan:nifn<2else2*fib(n-1)

3矩形覆蓋

我們能夠用2*1小矩形橫著或者豎著去覆蓋更大矩形。請問用n個2*1小矩形無重合地覆蓋一個2*n大

矩形,總共有多少種方法?

第2*n個矩形覆蓋方法等于第2*(n-1)加上第2*(n-2)方法。

Python

f-lambdan:1ifn<2elsef(n-1)+f(n-2)

4楊氏矩陣查找

在一個m行n列二維數(shù)組中,每一行都按照從左到右遞增次序排序,每一列都按照從上到下遞增次序排序。

請完成一個函數(shù),輸入這么一個二維數(shù)組和一個整數(shù),判斷數(shù)組中是否含有該整數(shù)。

5去除列表中重復(fù)元素

用集合

Python

」list(set(1))

用字典

Python

_11=[*b',,*d',,b1,*c',,1a']

12={).fromkeys(11).keys()

Sprint12

用字典并保持次序

Python

11=fb','c'r'd','b',*c\?a']

12=list(set(ll))

12.sort(key=ll.index)

[print12

列表推導(dǎo)式

Python

,11=[廿,-d-b-ciaja']

-12=[]

[12.append(i)foriin11ifnotiin12)

面試官提到,先排序然后刪除.

6鏈表成對調(diào)換

1->2->3->4轉(zhuǎn)換成2->1->4->3.

Python

classListNode:

def_init_(selfzx):

self.val-x

self.next=None

classSolution:

#@paramaListNode

#0returnaListNode

defswapPairs(self,head):

ifhead!=Noneandhead.next!=None:

next=head.next

head.nextself.swapPairs(next.next)

next.next=head

returnnext

returnhead

7創(chuàng)建字典方法

1直接創(chuàng)建

Python

diet={'name*:'earth1,'port':*80*)

2工廠方法

Python

.items=[('name1,'earth*),(*port*,'80*)]

dict2=dict(items)

11

dictl=dict((['name,'earth*]z[port*z,80']))

3fromkeys。方法

Python

dictl={}.fromkeys(('x*,'y*),-l)

?dict=(*x':-lz'y*:-l)

dict2={}.fromkeys((*x*,*y'))

dict2={'x1:None,*y':None)

8合并兩個有序列表

知乎遠(yuǎn)程面試要求編程

尾遞歸

Python

def_recursion_merge_sort2(11,12,tmp):

iflen(11)==0orlen(12)==0:

tmp.extend(11)

tmp.extend(12)

returntmp

else:

if11[0]<12[0]:

tmp.append(11[0])

delll[O]

else:

tmp.append(12[0])

del12(0]

return_recursion_merge_sort2(11,12,tmp)

defrecursion_merge_sort2(11,12):

return_recursion_merge_sort2(11,12,[])

循環(huán)算法

Python

defloopmerge_sort(11,12):

tmp=[]

whilelen(11)>0andlen(12)>0:

if11[0]<12(0):

tmp.append(11[0])

del11[0]

else:

tmp.append(12[0])

del12[0]

tmp.extend(11)

tmp.extend(12)

returntmp

9交叉鏈表求交點

去哪兒面試,沒做出來.

Python

classListNode:

def_(self,x):

self.val=x

self.nextNone

defnode(11,12):

lengthl,lenth2=0,0

#求兩個鏈表長度

while11.next:

11=11.next

lengthl+=1

while12.next:

12=12.next

length2+=1

14#長鏈表先走

iflengthl>lenth2:

for_inrange(lengthl-length2):

1711=11.next

else:

for_inrange(length2-lengthl):

12=12.next

while11andL2:

if11.next==12.next:

return11.next

else:

11=11.next

12=12.next

10二分查找

Python

defbinarysearch(1,t):

low,high=0,len(1)-1

whilelow<high:

printlow,high

mid=(low+high)/2

if1[mid]>t:

high=mid

elif1[mid]<t:

low=mid+1

else:

returnmid

returnlowif1[low]==telseFalse

if_namemain*:

1=[1,4,12,45,66,99,120,444]

printbinarySearch(lz12)

printbinarysearch(1,1)

printbinarySearch(1,13)

i1printbinarySearch(1,444)

11快排

Python

defqsort(seq):

ifseq==[]:

return[]

el

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論