版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備類貨物運輸合同
- 私家車租車合同范本
- 木門購買安裝合同范本
- 會展服務(wù)協(xié)議合同正規(guī)范本
- 《教師嗓音保健》課件
- 企業(yè)人員借調(diào)合同
- 建筑工程施工總承包合同補(bǔ)充協(xié)議
- 光之教堂調(diào)研報告
- 基于非鉛鈣鈦礦單晶的高性能X射線探測器研究
- 基于雙氰基新型熒光染料生物硫醇熒光探針的構(gòu)建及其性能研究
- 教育環(huán)境分析報告
- 人力資源服務(wù)公司章程
- (正式版)CB∕T 4552-2024 船舶行業(yè)企業(yè)安全生產(chǎn)文件編制和管理規(guī)定
- 病案管理質(zhì)量控制指標(biāo)檢查要點
- 2024年西藏中考物理模擬試題及參考答案
- 九型人格與領(lǐng)導(dǎo)力講義
- 人教版五年級上冊數(shù)學(xué)脫式計算練習(xí)200題及答案
- 廉潔應(yīng)征承諾書
- 卵巢黃體囊腫破裂教學(xué)查房
- 醫(yī)院定崗定編
- 2023年大學(xué)物理化學(xué)實驗報告化學(xué)電池溫度系數(shù)的測定
評論
0/150
提交評論