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

下載本文檔

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

文檔簡介

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

看兩個(gè)例子:

Python

a=1

deffun(a):

a=2

:fun(a)

Sprinta#1

Python

la=[]

deffun(a):

a.append(1)

fun(a)

Sprinta#[1]

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

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

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

就是這個(gè)問題重點(diǎn))

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

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

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

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

2Python中元類(metadass)

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

3@staticmethodfn@classmethod

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

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.這個(gè)self和cis是對(duì)類或者實(shí)例綁定,對(duì)于通常函數(shù)來說我們能夠這

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

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

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

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

要改好.

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

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

\實(shí)例方法類方法靜態(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)于這個(gè)問題:

4類變量和實(shí)例變量

Python

classPerson:

name="aaa"

pl=Person()

p2=Person()

pl.name=,,bbb"

print#bbb

printp2.name#aaa

printPerson.name-?aaa

類變量就是供類使用變量,實(shí)例變量就是供實(shí)例使用.

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

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

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

能夠看看下面例子:

Python

classPerson:

name=[]

?pl=Person()

p2=Person()

pl.name.append(1)

printpl.name#[1]

sprintp2.name#⑴

'printP/[1]

參考:

5Python自省

這個(gè)也是python彪悍特征.

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

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

6字典推導(dǎo)式

可能你見過列表推導(dǎo)時(shí),卻沒有見過字典推導(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_:一個(gè)約定,Python內(nèi)部名字,用來區(qū)分其余用戶自定義命名,以防沖突.

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

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

詳情見:

或者:

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

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

會(huì)有什么問題:

Python

."hithere%sH%name

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

Python

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

不過有點(diǎn)丑“format就沒有這些問題.你給第二個(gè)問題也是這么,.format好看多了.

你為何不用它?

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

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

9迭代器和生成器

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

這是漢字版:

10*argsand**kwargs

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

當(dāng)你不確定你函數(shù)里將要傳遞多少參數(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í)在函數(shù)定義中,不過*args必須在**kwargs前面.

當(dāng)調(diào)用函數(shù)時(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

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

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

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

這個(gè)AOP一聽起來有點(diǎn)懵,同學(xué)面阿里時(shí)候就被問懵了…

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

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

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

這個(gè)問題比較大,推薦:

漢字:

12鴨子類型

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

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

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

它們看成文件使用。

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

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

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

13Python中第

引自知乎:

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

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

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

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

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

函數(shù)。

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

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

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

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

對(duì)那些缺乏參數(shù)設(shè)定為缺省參數(shù)即可處理問題。因?yàn)槟慵僭O(shè)函數(shù)功效相同,那么那些缺乏參數(shù)終究是需要

用。

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

14新式類和舊式類

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

stackoverflow

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

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

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

15__new和__init_—區(qū)分

這個(gè)new確實(shí)極少見到,先做了解吧.

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

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

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

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

stackoverflow

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

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

16單例模式

這個(gè)絕對(duì)常考啊.絕對(duì)要記住1~2個(gè)方法,當(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)建實(shí)例時(shí)把全部實(shí)例_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中,一個(gè)變量作用域總是由在代碼中被賦值地方所決定。

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

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

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

18GIL線程全局鎖

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

一個(gè)核只能在同一時(shí)間運(yùn)行一個(gè)線程.

見Python最難問題

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

19協(xié)程

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

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

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

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

20閉包

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

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

幾點(diǎn):

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

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

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

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

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

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

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

21lambda函數(shù)

其實(shí)就是一個(gè)匿名函數(shù),為何叫l(wèi)ambda?因?yàn)楹秃竺婧瘮?shù)式編程關(guān)于.

推薦:知乎

22Python函數(shù)式編程

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

推薦:酷殼

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

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

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ù)是對(duì)一個(gè)序列每個(gè)項(xiàng)依次執(zhí)行函數(shù),下面是對(duì)一個(gè)序列每個(gè)項(xiàng)都乘以2:

Python

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

>?list(a)

3[2,4,6]

reduce函數(shù)是對(duì)一個(gè)序列每個(gè)項(xiàng)迭代調(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)不/改對(duì)象a

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

: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主要使用引用計(jì)數(shù)(referencecounting)來跟蹤和回收垃圾。在引用計(jì)數(shù)基礎(chǔ)上,經(jīng)過"標(biāo)

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

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

1引用計(jì)數(shù)

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

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

結(jié)束了.

優(yōu)點(diǎn):

1.簡單

2.實(shí)時(shí)性

缺點(diǎn):

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

2.循環(huán)引用

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

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

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

3分代技術(shù)

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

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

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

舉例:

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

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

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

提升了.在這個(gè)過程中,集合B中一些內(nèi)存塊因?yàn)榇婊顣r(shí)間長而會(huì)被轉(zhuǎn)移到集合A中,當(dāng)然,集合A中實(shí)

際上也存在一些垃圾,這些垃圾回收會(huì)因?yàn)檫@種分代機(jī)制而被延遲。

25PythonList

推薦:

26Pythonis

is是對(duì)比地址,==是對(duì)比值

27read,readlinereadlines

?read讀取整個(gè)文件

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

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

28Python2和3區(qū)分

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

操作系統(tǒng)

1select,poll和epoll

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

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

是epoll.

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

基本上select有3個(gè)缺點(diǎn):

1.連接數(shù)受限

2.查找配對(duì)速度慢

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

poll改進(jìn)了第一個(gè)缺點(diǎn)

epoll改了三個(gè)缺點(diǎn).

關(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.時(shí)間片輪轉(zhuǎn)(RR,RoundRobin)

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

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

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

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

3死鎖

原因:

1.競爭資源

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

必要條件:

互斥條件

2.請(qǐng)求和保持條件

3.不剝奪條件

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

處理死鎖基本方法:

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

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

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

4.解除死鎖

1.剝奪資源

2.撤消進(jìn)程

4程序編譯與鏈接

推薦:

Bulid過程能夠分解為4個(gè)步驟:預(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.添加行號(hào)和文件名標(biāo)識(shí),方便于編譯時(shí)編譯器產(chǎn)生調(diào)試用行號(hào)信息以及用于編譯時(shí)產(chǎn)生編譯錯(cuò)誤

或警告時(shí)可顯示俏

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

2編譯

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

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

3匯編

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

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

4鏈接

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

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

和重定位(Relocation)等步驟。

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

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

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

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

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

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

靜態(tài)鏈接程序

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

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

7分頁和分段

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

頁和塊大小相等。可將用戶程序任一頁放在內(nèi)存任一塊中,實(shí)現(xiàn)了離散分配。

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

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

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

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

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

需要.

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

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

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

8頁面置換算法

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

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

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

4.clock算法

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

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

數(shù)據(jù)庫

1事務(wù)

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

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

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

推薦:

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

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

3Redis原理

4樂觀鎖和消極鎖

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

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

5MVCC

6MylSAM和InnoDB

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

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

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

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

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

網(wǎng)絡(luò)

1三次握手

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

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

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

身又有一個(gè)隨機(jī)序號(hào)B。

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

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

2四次揮手

3ARP協(xié)議

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

4urllibfQurllib2區(qū)分

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

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

一起使用原因。

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

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

5Post和Get

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

get:RFC2616-HypertextTransferProtocol—HTTP/1.1

post:RFC2616-HypertextTransferProtocol—HTTP/1.1

6Cookie和Session

CookieSession

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

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

安全性不安全安全

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

7apache和nginx區(qū)分

nginx相對(duì)apache優(yōu)點(diǎn):

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

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

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

?配置簡練

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

?小區(qū)活躍

apache相對(duì)nginx優(yōu)點(diǎn):

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

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

?少bug,nginxbug相對(duì)較多

?超穩(wěn)定

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

明文保留

2.明文hash后保留,如md5

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

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

9HTTP和HTTPS

狀態(tài)碼定義

1XX匯報(bào)接收到請(qǐng)求,繼續(xù)進(jìn)程

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

3xx重定向?yàn)榱送瓿烧?qǐng)求,必須采取深入方法

4xx客戶端犯錯(cuò)請(qǐng)求包含錯(cuò)次序或不能完成

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

403:Forbidden

404:NotFound

HTTPS握手,對(duì)稱加密,非對(duì)稱加密,TLS/SSLRSA

10XSRF和XSS

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

?XSS(CrossSiteScripting)跨站腳本攻擊

CSRF重點(diǎn)在請(qǐng)求,XSS重點(diǎn)在腳本

11鬲等Idempotence

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

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

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

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

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

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

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

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

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

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

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

推薦:

13SOAP

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

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

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

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

14RPC

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

上請(qǐng)求服務(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)時(shí)代,臃腫SOA被簡化為http+xml/json不過簡化

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

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

15CGI和WSGI

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

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

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

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

官方說明:PEP-3333

16中間人攻擊

在GFW里屢見不鮮,呵呵.

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

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

被攻擊者完全控制。

17clOk問題

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

也是clOk這個(gè)名字由來).

推薦:

18socket

推薦:

Socket=Ipaddress+TCP/UDP+port

19瀏覽器緩存

推薦:

304NotModified

20HTTP1.0和HTTP1.1

推薦:

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

2.長鏈接

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

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

21Ajax

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

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

*NIX

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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é)點(diǎn)時(shí)候,依照不一樣情況,旋轉(zhuǎn)次數(shù)比紅黑樹要多;

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

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

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

編程題

1臺(tái)階問題/斐波納挈

一只青蛙一次能夠跳上1級(jí)臺(tái)階,也能夠跳上2級(jí)。求該青蛙跳上一個(gè)n級(jí)臺(tái)階總共有多少種跳法。

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)臺(tái)階問題

一只青蛙一次能夠跳上1級(jí)臺(tái)階,也能夠跳上2級(jí)……它也能夠跳上n級(jí)。求該青蛙跳上一個(gè)n級(jí)臺(tái)階總

共有多少種跳法。

Python

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

3矩形覆蓋

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

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

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

Python

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

4楊氏矩陣查找

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

請(qǐng)完成一個(gè)函數(shù),輸入這么一個(gè)二維數(shù)組和一個(gè)整數(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鏈表成對(duì)調(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合并兩個(gè)有序列表

知乎遠(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交叉鏈表求交點(diǎn)

去哪兒面試,沒做出來.

Python

classListNode:

def_(self,x):

self.val=x

self.nextNone

defnode(11,12):

lengthl,lenth2=0,0

#求兩個(gè)鏈表長度

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

評(píng)論

0/150

提交評(píng)論