Python基礎筆試面試利器_第1頁
Python基礎筆試面試利器_第2頁
Python基礎筆試面試利器_第3頁
Python基礎筆試面試利器_第4頁
Python基礎筆試面試利器_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1 Python的函數(shù)參數(shù)傳遞看兩個例子:Python12345a = 1def fun(a):a = 2fun(a)print a# 1Python12345a = def fun(a):a.append(1)fun(a)print a# 1所有的變量都可以理解是內存中一種對象的“引用”,或者,也可以看似c中void*的感覺。這里記住的是類型是屬于對象的,而不是變量。而對象有兩種,“可更改”(mutable)與“不可更改”(immutable)對象。在python中,strings, tuples, 和numbers是不可更改的對象,而list,dict等則是可以修改的對象。(這就是這個問題

2、的重點)當一種引用傳遞給函數(shù)的時候,函數(shù)自動復制一份引用,這個函數(shù)里的引用和外邊的引用沒有半毛關系了.因此第一種例子里函數(shù)把引用指向了一種不可變對象,當函數(shù)返回的時候,外面的引用沒半毛感覺.而第二個例子就不同樣了,函數(shù)內的引用指向的是可變對象,對它的操作就和定位了指針地址同樣,在內存里進行修改.如果還不明白的話,這里有更好的解釋: 2 Python中的元類(metaclass)這個非常的不常用,但是像ORM這種復雜的構造還是會需要的,詳情請看: HYPERLINK t 深刻理解Python中的元類(metaclass)3 staticmethod和classmethodPython其實有3個措

3、施,即靜態(tài)措施(staticmethod),類措施(classmethod)和實例措施,如下:Python12345678910111213141516def foo(x):print executing foo(%s)%(x)class A(object):def foo(self,x):print executing foo(%s,%s)%(self,x)classmethoddef class_foo(cls,x):print executing class_foo(%s,%s)%(cls,x)staticmethoddef static_foo(x):print executing s

4、tatic_foo(%s)%xa=A()這里先理解下函數(shù)參數(shù)里面的self和cls.這個self和cls是對類或者實例的綁定,對于一般的函數(shù)來說我們可以這樣調用foo(x),這個函數(shù)就是最常用的,它的工作跟任何東西(類,實例)無關.對于實例措施,我們懂得在類里每次定義措施的時候都需要綁定這個實例,就是foo(self, x),為什么要這樣做呢?由于實例措施的調用離不開實例,我們需要把實例自己傳給函數(shù),調用的時候是這樣的a.foo(x)(其實是foo(a, x).類措施同樣,只但是它傳遞的是類而不是實例,A.class_foo(x).注意這里的self和cls可以替代別的參數(shù),但是python的

5、商定是這倆,還是不要改的好.對于靜態(tài)措施其實和一般的措施同樣,不需要對誰進行綁定,唯一的區(qū)別是調用的時候需要使用a.static_foo(x)或者A.static_foo(x)來調用.實例措施類措施靜態(tài)措施a = A()a.foo(x)a.class_foo(x)a.static_foo(x)A不可用A.class_foo(x)A.static_foo(x)更多有關這個問題:4 類變量和實例變量Python123456789class Person:name=aaap1=Person()p2=Person()=bbbprint # bbbprint # aaaprint P# aaa類變量就是

6、供類使用的變量,實例變量就是供實例使用的.這里=bbb是實例調用了類變量,這其實和上面第一種問題同樣,就是函數(shù)傳參的問題,一開始是指向的類變量name=aaa,但是在實例的作用域里把類變量的引用變化了,就變成了一種實例變量,不再引用Person的類變量name了.可以看看下面的例子:Python123456789class Person:name=p1=Person()p2=Person().append(1)print # 1print # 1print P# 1參照:5 Python自省這個也是python彪悍的特性.自省就是面向對象的語言所寫的程序在運營時,所能懂得對象的類型.簡樸一句就

7、是運營時可以獲得對象的類型.例如type(),dir(),getattr(),hasattr(),isinstance().6 字典推導式也許你見過列表推導時,卻沒有見過字典推導式,在2.7中才加入的:Python1d = key: value for (key, value) in iterable7 Python中單下劃線和雙下劃線Python1234567891011121314 class MyClass():. def _init_(self):. self._superprivate = Hello. self._semiprivate = , world!. mc = MyCla

8、ss() print mc._superprivateTraceback (most recent call last):File , line 1, in AttributeError: myClass instance has no attribute _superprivate print mc._semiprivate, world! print mc._dict_MyClass_superprivate: Hello, _semiprivate: , world!_foo_:一種商定,Python內部的名字,用來區(qū)別其她顧客自定義的命名,以防沖突._foo:一種商定,用來指定變量私有

9、.程序員用來指定私有變量的一種方式._foo:這個有真正的意義:解析器用_classname_foo來替代這個名字,以區(qū)別和其她類相似的命名.詳情見:或者: 8 字符串格式化:%和.format.format在許多方面看起來更便利.對于%最煩人的是它無法同步傳遞一種變量和元組.你也許會想下面的代碼不會有什么問題:Python1hi there %s % name但是,如果name正好是(1,2,3),它將會拋出一種TypeError異常.為了保證它總是對的的,你必須這樣做:Python1hi there %s % (name,) # 提供一種單元素的數(shù)組而不是一種參數(shù)但是有點丑.format就

10、沒有這些問題.你給的第二個問題也是這樣,.format好看多了.你為什么不用它?不懂得它(在讀這個之前)為了和Python2.5兼容(譬如logging庫建議使用%( HYPERLINK issue #4)9 迭代器和生成器這個是stackoverflow里python排名第一的問題,值得一看: 這是中文版: 10*argsand*kwargs用*args和*kwargs只是為了以便并沒有強制使用它們.當你不擬定你的函數(shù)里將要傳遞多少參數(shù)時你可以用*args.例如,它可以傳遞任意數(shù)量的參數(shù):Python12345678 def print_everything(*args):for count

11、, thing in enumerate(args):. print 0. 1.format(count, thing). print_everything(apple, banana, cabbage)0. apple1. banana2. cabbage相似的,*kwargs容許你使用沒有事先定義的參數(shù)名:Python1234567 def table_things(*kwargs):. for name, value in kwargs.items():. print 0 = 1.format(name, value). table_things(apple = fruit, cabba

12、ge = vegetable)cabbage = vegetableapple = fruit你也可以混著用.命名參數(shù)一方面獲得參數(shù)值然后所有的其她參數(shù)都傳遞給*args和*kwargs.命名參數(shù)在列表的最前端.例如:Python1def table_things(titlestring, *kwargs)*args和*kwargs可以同步在函數(shù)的定義中,但是*args必須在*kwargs前面.當調用函數(shù)時你也可以用*和*語法.例如:Python1234567 def print_three_things(a, b, c):. print a = 0, b = 1, c = 2.format(

13、a,b,c). mylist = aardvark, baboon, cat print_three_things(*mylist)a = aardvark, b = baboon, c = cat就像你看到的同樣,它可以傳遞列表(或者元組)的每一項并把它們解包.注意必須與它們在函數(shù)里的參數(shù)相吻合.固然,你也可以在函數(shù)定義或者函數(shù)調用時用*.11 面向切面編程AOP和裝飾器這個AOP一聽起來有點懵,同窗面阿里的時候就被問懵了裝飾器是一種很出名的設計模式,常常被用于有切面需求的場景,較為典型的有插入日記、性能測試、事務解決等。裝飾器是解決此類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函數(shù)中

14、與函數(shù)功能自身無關的雷同代碼并繼續(xù)重用。概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。這個問題比較大,推薦: 中文: 12 鴨子類型“當看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子?!蔽覀儾⒉魂P懷對象是什么類型,究竟是不是鴨子,只關懷行為。例如在python中,有諸多file-like的東西,例如StringIO,GzipFile,socket。它們有諸多相似的措施,我們把它們當作文獻使用。又例如list.extend()措施中,我們并不關懷它的參數(shù)是不是list,只要它是可迭代的,因此它的參數(shù)可以是list/tuple/dict/字符串/生成

15、器等.鴨子類型在動態(tài)語言中常常使用,非常靈活,使得python不想java那樣專門去弄一大堆的設計模式。13 Python中重載引自知乎:函數(shù)重載重要是為理解決兩個問題??勺儏?shù)類型??勺儏?shù)個數(shù)。此外,一種基本的設計原則是,僅僅當兩個函數(shù)除了參數(shù)類型和參數(shù)個數(shù)不同以外,其功能是完全相似的,此時才使用函數(shù)重載,如果兩個函數(shù)的功能其實不同,那么不應當使用重載,而應當使用一種名字不同的函數(shù)。好吧,那么對于狀況 1 ,函數(shù)功能相似,但是參數(shù)類型不同,python 如何解決?答案是主線不需要解決,由于 python 可以接受任何類型的參數(shù),如果函數(shù)的功能相似,那么不同的參數(shù)類型在 python 中很也

16、許是相似的代碼,沒有必要做成兩個不同函數(shù)。那么對于狀況 2 ,函數(shù)功能相似,但參數(shù)個數(shù)不同,python 如何解決?人們懂得,答案就是缺省參數(shù)。對那些缺少的參數(shù)設定為缺省參數(shù)即可解決問題。由于你假設函數(shù)功能相似,那么那些缺少的參數(shù)終歸是需要用的。好了,鑒于狀況 1 跟 狀況 2 均有理解決方案,python 自然就不需要函數(shù)重載了。14 新式類和舊式類這個面試官問了,我說了老半天,不懂得她問的真正意圖是什么. HYPERLINK stackoverflow這篇文章較好的簡介了新式類的特性: 新式類很早在2.2就浮現(xiàn)了,因此舊式類完全是兼容的問題,Python3里的類所有都是新式類.這里有一種M

17、RO問題可以理解下(新式類是廣度優(yōu)先,舊式類是深度優(yōu)先),里講的也諸多.15_new_和_init_的區(qū)別這個_new_的確很少見到,先做理解吧._new_是一種靜態(tài)措施,而_init_是一種實例措施._new_措施會返回一種創(chuàng)立的實例,而_init_什么都不返回.只有在_new_返回一種cls的實例時背面的_init_才干被調用.當創(chuàng)立一種新實例時調用_new_,初始化一種實例時用_init_. HYPERLINK stackoverflowps:_metaclass_是創(chuàng)立類時起作用.因此我們可以分別使用_metaclass_,_new_和_init_來分別在類創(chuàng)立,實例創(chuàng)立和實例初始化的

18、時候做某些小手腳.16 單例模式這個絕對??及?絕對要記住12個措施,當時面試官是讓手寫的.1 使用_new_措施Python123456789class Singleton(object):def _new_(cls, *args, *kw):if not hasattr(cls, _instance):orig = super(Singleton, cls)cls._instance = orig._new_(cls, *args, *kw)return cls._instanceclass MyClass(Singleton):a = 12 共享屬性創(chuàng)立實例時把所有實例的_dict_指向

19、同一種字典,這樣它們具有相似的屬性和措施.Python123456789class Borg(object):_state = def _new_(cls, *args, *kw):ob = super(Borg, cls)._new_(cls, *args, *kw)ob._dict_ = cls._statereturn obclass MyClass2(Borg):a = 13 裝飾器版本Python1234567891011def singleton(cls, *args, *kw):instances = def getinstance():if cls not in instanc

20、es:instancescls = cls(*args, *kw)return instancesclsreturn getinstancesingletonclass MyClass:.4 import措施作為python的模塊是天然的單例模式Python1234567891011# mysingleton.pyclass My_Singleton(object):def foo(self):passmy_singleton = My_Singleton()# to usefrom mysingleton import my_singletonmy_singleton.foo()17 Pyt

21、hon中的作用域Python 中,一種變量的作用域總是由在代碼中被賦值的地方所決定的。當 Python 遇到一種變量的話她會按照這樣的順序進行搜索:本地作用域(Local)目前作用域被嵌入的本地作用域(Enclosing locals)全局/模塊作用域(Global)內置作用域(Built-in)18 GIL線程全局鎖線程全局鎖(Global Interpreter Lock),即Python為了保證線程安全而采用的獨立線程運營的限制,說白了就是一種核只能在同一時間運營一種線程.見 HYPERLINK Python 最難的問題解決措施就是多進程和下面的協(xié)程(協(xié)程也只是單CPU,但是能減小切換代

22、價提高性能).19 協(xié)程知乎被問到了,呵呵噠,跪了簡樸點說協(xié)程是進程和線程的升級版,進程和線程都面臨著內核態(tài)和顧客態(tài)的切換問題而耗費許多切換時間,而協(xié)程就是顧客自己控制切換的時機,不再需要陷入系統(tǒng)的內核態(tài).Python里最常用的yield就是協(xié)程的思想!可以查看第九個問題.20 閉包閉包(closure)是函數(shù)式編程的重要的語法構造。閉包也是一種組織代碼的構造,它同樣提高了代碼的可反復使用性。當一種內嵌函數(shù)引用其外部作作用域的變量,我們就會得到一種閉包. 總結一下,創(chuàng)立一種閉包必須滿足如下幾點:必須有一種內嵌函數(shù)內嵌函數(shù)必須引用外部函數(shù)中的變量外部函數(shù)的返回值必須是內嵌函數(shù)感覺閉包還是有難度的

23、,幾句話是說不明白的,還是查查有關資料.重點是函數(shù)運營后并不會被撤銷,就像16題的instance字典同樣,當函數(shù)運營完后,instance并不被銷毀,而是繼續(xù)留在內存空間里.這個功能類似類里的類變量,只但是遷移到了函數(shù)上.閉包就像個空心球同樣,你懂得外面和里面,但你不懂得中間是什么樣.21 lambda函數(shù)其實就是一種匿名函數(shù),為什么叫l(wèi)ambda?由于和背面的函數(shù)式編程有關.推薦: HYPERLINK 知乎22 Python函數(shù)式編程這個需要合適的理解一下吧,畢竟函數(shù)式編程在Python中也做了引用.推薦: HYPERLINK 酷殼python中函數(shù)式編程支持:filter 函數(shù)的功能相稱

24、于過濾器。調用一種布爾函數(shù)bool_func來迭代遍歷每個seq中的元素;返回一種使bool_seq返回值為true的元素的序列。Python1234a = 1,2,3,4,5,6,7b = filter(lambda x: x 5, a)print b6,7map函數(shù)是對一種序列的每個項依次執(zhí)行函數(shù),下面是對一種序列每個項都乘以2:Python123 a = map(lambda x:x*2,1,2,3) list(a)2, 4, 6reduce函數(shù)是對一種序列的每個項迭代調用函數(shù),下面是求3的階乘:Python12 reduce(lambda x,y:x*y,range(1,4)623 P

25、ython里的拷貝引用和copy(),deepcopy()的區(qū)別Python1234567891011121314151617181920import copya = 1, 2, 3, 4, a, b#原始對象b = a#賦值,傳對象的引用c = copy.copy(a)#對象拷貝,淺拷貝d = copy.deepcopy(a)#對象拷貝,深拷貝a.append(5)#修改對象aa4.append(c)#修改對象a中的a, b數(shù)組對象print a = , aprint b = , bprint c = , cprint d = , d輸出成果:a =1, 2, 3, 4, a, b, c,

26、5b =1, 2, 3, 4, a, b, c, 5c =1, 2, 3, 4, a, b, cd =1, 2, 3, 4, a, b24 Python垃圾回收機制Python GC重要使用引用計數(shù)(reference counting)來跟蹤和回收垃圾。在引用計數(shù)的基本上,通過“標記-清除”(mark and sweep)解決容器對象也許產生的循環(huán)引用問題,通過“分代回收”(generation collection)以空間換時間的措施提高垃圾回收效率。1 引用計數(shù)PyObject是每個對象必有的內容,其中ob_refcnt就是做為引用計數(shù)。當一種對象有新的引用時,它的ob_refcnt就會

27、增長,當引用它的對象被刪除,它的ob_refcnt就會減少.引用計數(shù)為0時,該對象生命就結束了。長處:簡樸實時性缺陷:維護引用計數(shù)消耗資源循環(huán)引用2 標記-清除機制基本思路是先按需分派,等到沒有空閑內存的時候從寄存器和程序棧上的引用出發(fā),遍歷以對象為節(jié)點、以引用為邊構成的圖,把所有可以訪問到的對象打上標記,然后打掃一遍內存空間,把所有沒標記的對象釋放。3 分代技術分代回收的整體思想是:將系統(tǒng)中的所有內存塊根據其存活時間劃分為不同的集合,每個集合就成為一種“代”,垃圾收集頻率隨著“代”的存活時間的增大而減小,存活時間一般運用通過幾次垃圾回收來度量。Python默認定義了三代對象集合,索引數(shù)越大,

28、對象存活時間越長。舉例:當某些內存塊M通過了3次垃圾收集的清洗之后還存活時,我們就將內存塊M劃到一種集合A中去,而新分派的內存都劃分到集合B中去。當垃圾收集開始工作時,大多數(shù)狀況都只對集合B進行垃圾回收,而對集合A進行垃圾回收要隔相稱長一段時間后才進行,這就使得垃圾收集機制需要解決的內存少了,效率自然就提高了。在這個過程中,集合B中的某些內存塊由于存活時間長而會被轉移到集合A中,固然,集合A中事實上也存在某些垃圾,這些垃圾的回收會由于這種分代的機制而被延遲。25 Python的List推薦: 26 Python的isis是對比地址,=是對比值27 read,readline和readlines

29、read 讀取整個文獻readline 讀取下一行,使用生成器措施readlines 讀取整個文獻到一種迭代器以供我們遍歷28 Python2和3的區(qū)別推薦: HYPERLINK t Python 2.7.x 和 3.x 版本的重要區(qū)別操作系統(tǒng)1 select,poll和epoll其實所有的I/O都是輪詢的措施,只但是實現(xiàn)的層面不同罷了.這個問題也許有點進一步了,但相信能回答出這個問題是對I/O多路復用有較好的理解了.其中tornado使用的就是epoll的. HYPERLINK selec,poll和epoll區(qū)別總結基本上select有3個缺陷:連接數(shù)受限查找配對速度慢數(shù)據由內核拷貝到顧客

30、態(tài)poll改善了第一種缺陷epoll改了三個缺陷.有關epoll的: 2 調度算法先來先服務(FCFS, First Come First Serve)短作業(yè)優(yōu)先(SJF, Shortest Job First)最高優(yōu)先權調度(Priority Scheduling)時間片輪轉(RR, Round Robin)多級反饋隊列調度(multilevel feedback queue scheduling)實時調度算法:最早截至時間優(yōu)先 EDF最低松弛度優(yōu)先 LLF3 死鎖因素:競爭資源程序推動順序不當必要條件:互斥條件祈求和保持條件不剝奪條件環(huán)路等待條件解決死鎖基本措施:避免死鎖(摒棄除1以外的條

31、件)避免死鎖(銀行家算法)檢測死鎖(資源分派圖)解除死鎖剝奪資源撤銷進程4 程序編譯與鏈接推薦: Bulid過程可以分解為4個環(huán)節(jié):預解決(Prepressing), 編譯(Compilation)、匯編(Assembly)、鏈接(Linking)以c語言為例:1 預解決預編譯過程重要解決那些源文獻中的以“#”開始的預編譯指令,重要解決規(guī)則有:將所有的“#define”刪除,并展開所用的宏定義解決所有條件預編譯指令,例如“#if”、“#ifdef”、 “#elif”、“#endif”解決“#include”預編譯指令,將被涉及的文獻插入到該編譯指令的位置,注:此過程是遞歸進行的刪除所有注釋添加

32、行號和文獻名標記,以便于編譯時編譯器產生調試用的行號信息以及用于編譯時產生編譯錯誤或警告時可顯示行號保存所有的#pragma編譯器指令。2 編譯編譯過程就是把預解決完的文獻進行一系列的詞法分析、語法分析、語義分析及優(yōu)化后生成相應的匯編代碼文獻。這個過程是整個程序構建的核心部分。3 匯編匯編器是將匯編代碼轉化成機器可以執(zhí)行的指令,每一條匯編語句幾乎都是一條機器指令。通過編譯、鏈接、匯編輸出的文獻成為目的文獻(Object File)4 鏈接鏈接的重要內容就是把各個模塊之間互相引用的部分解決好,使各個模塊可以對的的拼接。鏈接的重要過程包塊 地址和空間的分派(Address and Storage

33、Allocation)、符號決策(Symbol Resolution)和重定位(Relocation)等環(huán)節(jié)。5 靜態(tài)鏈接和動態(tài)鏈接靜態(tài)鏈接措施:靜態(tài)鏈接的時候,載入代碼就會把程序會用到的動態(tài)代碼或動態(tài)代碼的地址擬定下來靜態(tài)庫的鏈接可以使用靜態(tài)鏈接,動態(tài)鏈接庫也可以使用這種措施鏈接導入庫動態(tài)鏈接措施:使用這種方式的程序并不在一開始就完畢動態(tài)鏈接,而是直到真正調用動態(tài)庫代碼時,載入程序才計算(被調用的那部分)動態(tài)代碼的邏輯地址,然后等到某個時候,程序又需要調用此外某塊動態(tài)代碼時,載入程序又去計算這部分代碼的邏輯地址,因此,這種方式使程序初始化時間較短,但運營期間的性能比不上靜態(tài)鏈接的程序6 虛擬

34、內存技術虛擬存儲器是值具有祈求調入功能和置換功能,能從邏輯上對內存容量加以擴大的一種存儲系統(tǒng).7 分頁和分段分頁: 顧客程序的地址空間被劃提成若干固定大小的區(qū)域,稱為“頁”,相應地,內存空間提成若干個物理塊,頁和塊的大小相等??蓪㈩櫩统绦虻娜我豁摲旁趦却娴娜我粔K中,實現(xiàn)了離散分派。分段: 將顧客程序地址空間提成若干個大小不等的段,每段可以定義一組相對完整的邏輯信息。存儲分派時,以段為單位,段與段在內存中可以不相鄰接,也實現(xiàn)了離散分派。分頁與分段的重要區(qū)別頁是信息的物理單位,分頁是為了實現(xiàn)非持續(xù)分派,以便解決內存碎片問題,或者說分頁是由于系統(tǒng)管理的需要.段是信息的邏輯單位,它具有一組意義相對完整

35、的信息,分段的目的是為了更好地實現(xiàn)共享,滿足顧客的需要.頁的大小固定,由系統(tǒng)擬定,將邏輯地址劃分為頁號和頁內地址是由機器硬件實現(xiàn)的.而段的長度卻不固定,決定于顧客所編寫的程序,一般由編譯程序在對源程序進行編譯時根據信息的性質來劃分.分頁的作業(yè)地址空間是一維的.分段的地址空間是二維的.8 頁面置換算法最佳置換算法OPT:不也許實現(xiàn)先進先出FIFO近來最久未使用算法LRU:近來一段時間里最久沒有使用過的頁面予以置換.clock算法9 邊沿觸發(fā)和水平觸發(fā)邊沿觸發(fā)是指每當狀態(tài)變化時發(fā)生一種 io 事件,條件觸發(fā)是只要滿足條件就發(fā)生一種 io 事件數(shù)據庫1 事務數(shù)據庫事務(Database Transa

36、ction) ,是指作為單個邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。2 數(shù)據庫索引推薦: HYPERLINK t MySQL索引背后的數(shù)據構造及算法原理匯集索引,非匯集索引,B-Tree,B+Tree,最左前綴原理3 Redis原理4 樂觀鎖和悲觀鎖悲觀鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切也許違背數(shù)據完整性的操作樂觀鎖:假設不會發(fā)生并發(fā)沖突,只在提交操作時檢查與否違背數(shù)據完整性。5 MVCC6 MyISAM和InnoDBMyISAM 適合于某些需要大量查詢的應用,但其對于有大量寫操作并不是較好。甚至你只是需要update一種字段,整個表都會被鎖起來,而別的進程,就算是讀進程

37、都無法操作直到讀操作完畢。此外,MyISAM 對于 SELECT COUNT(*) 此類的計算是超快無比的。InnoDB 的趨勢會是一種非常復雜的存儲引擎,對于某些小的應用,它會比 MyISAM 還慢。她是它支持“行鎖” ,于是在寫操作比較多的時候,會更優(yōu)秀。并且,她還支持更多的高檔應用,例如:事務。網絡1 三次握手客戶端通過向服務器端發(fā)送一種SYN來創(chuàng)立一種積極打開,作為三路握手的一部分??蛻舳税堰@段連接的序號設定為隨機數(shù) A。服務器端應當為一種合法的SYN回送一種SYN/ACK。ACK 的確認碼應為 A+1,SYN/ACK 包自身又有一種隨機序號 B。最后,客戶端再發(fā)送一種ACK。當服務端

38、受到這個ACK的時候,就完畢了三路握手,并進入了連接創(chuàng)立狀態(tài)。此時包序號被設定為收到的確認號 A+1,而響應則為 B+1。2 四次揮手3 ARP合同地址解析合同(Address Resolution Protocol): 根據IP地址獲取物理地址的一種TCP/IP合同4 urllib和urllib2的區(qū)別這個面試官的確問過,當時答的urllib2可以Post而urllib不可以.urllib提供urlencode措施用來GET查詢字符串的產生,而urllib2沒有。這是為什么urllib常和urllib2一起使用的因素。urllib2可以接受一種Request類的實例來設立URL祈求的head

39、ers,urllib僅可以接受URL。這意味著,你不可以偽裝你的User Agent字符串等。5 Post和Get HYPERLINK GET和POST有什么區(qū)別?及為什么網上的多數(shù)答案都是錯的get: HYPERLINK l section-9.3 RFC 2616 Hypertext Transfer Protocol HTTP/1.1post: HYPERLINK l section-9.5 RFC 2616 Hypertext Transfer Protocol HTTP/1.16 Cookie和SessionCookieSession儲存位置客戶端服務器端目的跟蹤會話,也可以保存顧客

40、偏好設立或者保存顧客名密碼等跟蹤會話安全性不安全安全session技術是要使用到cookie的,之因此浮現(xiàn)session技術,重要是為了安全。7 apache和nginx的區(qū)別nginx 相對 apache 的長處:輕量級,同樣起web 服務,比apache 占用更少的內存及資源抗并發(fā),nginx 解決祈求是異步非阻塞的,支持更多的并發(fā)連接,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能配備簡潔高度模塊化的設計,編寫模塊相對簡樸社區(qū)活躍apache 相對nginx 的長處:rewrite ,比nginx 的rewrite 強大模塊超多,基本想到的都可以找到少bug

41、 ,nginx 的bug 相對較多超穩(wěn)定8 網站顧客密碼保存明文保存明文hash后保存,如md5MD5+Salt方式,這個salt可以隨機知乎使用了Bcrypy(仿佛)加密9 HTTP和HTTPS狀態(tài)碼定義1xx 報告接受到祈求,繼續(xù)進程2xx 成功環(huán)節(jié)成功接受,被理解,并被接受3xx 重定向為了完畢祈求,必須采用進一步措施4xx 客戶端出錯祈求涉及錯的順序或不能完畢5xx 服務器出錯服務器無法完畢顯然有效的祈求403: Forbidden404: Not FoundHTTPS握手,對稱加密,非對稱加密,TLS/SSL,RSA10 XSRF和XSSCSRF(Cross-site request

42、 forgery)跨站祈求偽造XSS(Cross Site Scripting)跨站腳本襲擊CSRF重點在祈求,XSS重點在腳本11 冪等 IdempotenceHTTP措施的冪等性是指一次和多次祈求某一種資源應當具有同樣的副作用。(注意是副作用)GET ,不會變化資源的狀態(tài),不管調用一次還是N次都沒有副作用。請注意,這里強調的是一次和N次具有相似的副作用,而不是每次GET的成果相似。GET ,但它自身并沒有產生任何副作用,因而是滿足冪等性的。DELETE措施用于刪除資源,有副作用,但它應當滿足冪等性。例如:DELETE ,調用一次和N次對系統(tǒng)產生的副作用是相似的,即刪掉id為4231的帖子;

43、因此,調用者可以多次調用或刷新頁面而不必緊張引起錯誤。POST所相應的URI并非創(chuàng)立的資源自身,而是資源的接受者。例如:POST :/.com/articles下創(chuàng)立一篇帖子,HTTP響應中應涉及帖子的創(chuàng)立狀態(tài)以及帖子的URI。兩次相似的POST祈求會在服務器端創(chuàng)立兩份資源,它們具有不同的URI;因此,POST措施不具有冪等性。PUT所相應的URI是要創(chuàng)立或更新的資源自身。例如:PUT 。對同一URI進行多次PUT的副作用和一次PUT是相似的;因此,PUT措施具有冪等性。12 RESTful架構(SOAP,RPC)推薦: 13 SOAPSOAP(原為Simple Object Access P

44、rotocol的首字母縮寫,即簡樸對象訪問合同)是互換數(shù)據的一種合同規(guī)范,使用在計算機網絡Web服務(web service)中,互換帶構造信息。SOAP為了簡化網頁服務器(Web Server)從XML數(shù)據庫中提取數(shù)據時,節(jié)省去格式化頁面時間,以及不同應用程序之間按照HTTP通信合同,遵從XML格式執(zhí)行資料互換,使其抽象于語言實現(xiàn)、平臺和硬件。14 RPCRPC(Remote Procedure Call Protocol)遠程過程調用合同,它是一種通過網絡從遠程計算機程序上祈求服務,而不需要理解底層網絡技術的合同。RPC合同假定某些傳播合同的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)

45、據。在OSI網絡通信模型中,RPC跨越了傳播層和應用層。RPC使得開發(fā)涉及網絡分布式多程序在內的應用程序更加容易。總結:服務提供的兩大流派.老式意義以措施調用為導向通稱RPC。為了公司SOA,若干廠商聯(lián)合推出webservice,制定了wsdl接口定義,傳播soap.當互聯(lián)網時代,臃腫SOA被簡化為http+xml/json.但是簡化浮現(xiàn)多種混亂。以資源為導向,任何操作無非是對資源的增刪改查,于是統(tǒng)一的REST浮現(xiàn)了.進化的順序: RPC - SOAP - RESTful15 CGI和WSGICGI是通用網關接口,是連接web服務器和應用程序的接口,顧客通過CGI來獲取動態(tài)數(shù)據或文獻等。CGI

46、程序是一種獨立的程序,它可以用幾乎所有語言來寫,涉及perl,c,lua,python等等。WSGI, Web Server Gateway Interface,是Python應用程序或框架和Web服務器之間的一種接口,WSGI的其中一種目的就是讓顧客可以用統(tǒng)一的語言(Python)編寫前后端。官方闡明: HYPERLINK PEP-333316 中間人襲擊在GFW里屢見不鮮的,呵呵.中間人襲擊(Man-in-the-middle attack,一般縮寫為MITM)是指襲擊者與通訊的兩端分別創(chuàng)立獨立的聯(lián)系,并互換其所收到的數(shù)據,使通訊的兩端覺得她們正在通過一種私密的連接與對方直接對話,但事實上

47、整個會話都被襲擊者完全控制。17 c10k問題所謂c10k問題,指的是服務器同步支持成千上萬個客戶端的問題,也就是concurrent 10 000 connection(這也是c10k這個名字的由來)。推薦: 18 socket推薦: Socket=Ip address+ TCP/UDP + port19 瀏覽器緩存推薦: HYPERLINK t 304 Not Modified20 HTTP1.0和HTTP1.1推薦: 祈求頭Host字段,一種服務器多種網站長鏈接文獻斷點續(xù)傳身份認證,狀態(tài)管理,Cache緩存21 AjaxAJAX,Asynchronous JavaScript and X

48、ML(異步的 JavaScript 和 XML), 是與在不重新加載整個頁面的狀況下,與服務器互換數(shù)據并更新部分網頁的技術。*NIXunix進程間通信方式(IPC)管道(Pipe):管道可用于具有親緣關系進程間的通信,容許一種進程和另一種與它有共同祖先的進程之間進行通信。命名管道(named pipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還容許無親緣關系進程間的通信。命名管道在文獻系統(tǒng)中有相應的文獻名。命名管道通過命令mkfifo或系統(tǒng)調用mkfifo來創(chuàng)立。信號(Signal):信號是比較復雜的通信方式,用于告知接受進程有某種事件發(fā)生,除了用于進程間通信外,

49、進程還可以發(fā)送信號給進程自身;linux除了支持Unix初期信號語義函數(shù)sigal外,還支持語義符合Posix.1原則的信號函數(shù)sigaction(事實上,該函數(shù)是基于BSD的,BSD為了實現(xiàn)可靠信號機制,又可以統(tǒng)一對外接口,用sigaction函數(shù)重新實現(xiàn)了signal函數(shù))。消息(Message)隊列:消息隊列是消息的鏈接表,涉及Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺共享內存:使得多種進程可以訪問同一塊內存空間,是最快的可用IP

50、C形式。是針對其她通信機制運營效率較低而設計的。往往與其他通信機制,如信號量結合使用,來達到進程間的同步及互斥。內存映射(mapped memory):內存映射容許任何多種進程間通信,每一種使用該機制的進程通過把一種共享的文獻映射到自己的進程地址空間來實現(xiàn)它。信號量(semaphore):重要作為進程間以及同一進程不同線程之間的同步手段。套接口(Socket):更為一般的進程間通信機制,可用于不同機器之間的進程間通信。起初是由Unix系統(tǒng)的BSD分支開發(fā)出來的,但目前一般可以移植到其他類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。數(shù)據構造1 紅黑樹紅黑樹與AVL的比較:AV

51、L是嚴格平衡樹,因此在增長或者刪除節(jié)點的時候,根據不同狀況,旋轉的次數(shù)比紅黑樹要多;紅黑是用非嚴格的平衡來換取增刪節(jié)點時候旋轉次數(shù)的減少;因此簡樸說,如果你的應用中,搜索的次數(shù)遠遠不小于插入和刪除,那么選擇AVL,如果搜索,插入刪除次數(shù)幾乎差不多,應當選擇RB。編程題1 臺階問題/斐波納挈一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一種n級的臺階總共有多少種跳法。Python1fib = lambda n: n if n = 2 else fib(n - 1) + fib(n - 2)第二種記憶措施Python1234567891011121314def memo(func):c

52、ache = def wrap(*args):if args not in cache:cacheargs = func(*args)return cacheargsreturn wrap memodef fib(i):if i 2:return 1return fib(i-1) + fib(i-2)第三種措施Python12345def fib(n):a, b = 0, 1for _ in xrange(n):a, b = b, a + breturn b2 變態(tài)臺階問題一只青蛙一次可以跳上1級臺階,也可以跳上2級它也可以跳上n級。求該青蛙跳上一種n級的臺階總共有多少種跳法。Python1f

53、ib = lambda n: n if n 2 else 2 * fib(n - 1)3 矩形覆蓋我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一種2*n的大矩形,總共有多少種措施?第2*n個矩形的覆蓋措施等于第2*(n-1)加上第2*(n-2)的措施。Python1f = lambda n: 1 if n 2-3-4轉換成2-1-4-3.Python123456789101112131415class ListNode:def _init_(self, x):self.val = xself.next = Noneclass Solution:#

54、param a ListNode# return a ListNodedef swapPairs(self, head):if head != None and head.next != None:next = head.nexthead.next = self.swapPairs(next.next)next.next = headreturn nextreturn head7 創(chuàng)立字典的措施1 直接創(chuàng)立Python1dict = name:earth, port:802 工廠措施Python123items=(name,earth),(port,80)dict2=dict(items)di

55、ct1=dict(name,earth,port,80)3 fromkeys()措施Python1234dict1=.fromkeys(x,y),-1)dict=x:-1,y:-1dict2=.fromkeys(x,y)dict2=x:None, y:None8 合并兩個有序列表知乎遠程面試規(guī)定編程尾遞歸Python12345678910111213141516def _recursion_merge_sort2(l1, l2, tmp):if len(l1) = 0 or len(l2) = 0:tmp.extend(l1)tmp.extend(l2)return tmpelse:if l1

56、0 0 and len(l2) 0:if l10 lenth2:for _ in range(length1 - length2):l1 = l1.nextelse:for _ in range(length2 - length1):l2 = l2.nextwhile l1 and l2:if l1.next = l2.next:return l1.nextelse:l1 = l1.nextl2 = l2.next10 二分查找Python12345678910111213141516171819def binarySearch(l, t):low, high = 0, len(l) - 1w

57、hile low t:high = midelif lmid t:low = mid + 1else:return midreturn low if llow = t else Falseif _name_ = _main_:l = 1, 4, 12, 45, 66, 99, 120, 444print binarySearch(l, 12)print binarySearch(l, 1)print binarySearch(l, 13)print binarySearch(l, 444)11 快排Python123456789101112def qsort(seq):if seq=:retu

58、rn else:pivot=seq0lesser=qsort(x for x in seq1: if x=pivot)return lesser+pivot+greaterif _name_=_main_:seq=5,6,78,9,0,-1,2,3,-65,12print(qsort(seq)12 找零問題Python1234567891011121314151617181920defcoinChange(values, money, coinsUsed):#valuesT1:n數(shù)組#valuesCounts 錢幣相應的種類數(shù)#money找出來的總錢數(shù)#coinsUsed 相應于目前錢幣總數(shù)i所使用的硬幣數(shù)目for cents in range(1, money+1):minCoins = cents #從第一種開始到money的所有狀況初始for val

溫馨提示

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

評論

0/150

提交評論