python模擬面試技術題答案

 

目錄javascript

Python4期模擬面試技術面試題答案................................................................................................................ 3html

1、 python語法................................................................................................................................................... 3前端

1. 請說一下你對迭代器和生成器的區別?.......................................................................................... 3java

2. 什麼是線程安全?.................................................................................................................................. 4python

3. 你所遵循的代碼規範是什麼?請舉例說明其要求?.................................................................... 4mysql

4. Python中數組有哪些類型?字典能夠是有序的嗎??.............................................................. 5react

5. python 中 yield 的用法?................................................................................................................ 5linux

6. Python中pass語句的做用是什麼?............................................................................................... 5ios

7. python2和python3的區別?............................................................................................................... 6nginx

8. 談談你對GIL鎖對python多線程的影響?................................................................................... 8

9. python是如何進行內存管理的?...................................................................................................... 8

10. Python裏面如何拷貝一個對象?(賦值,淺拷貝,深拷貝的區別)................................. 9

11. 如何用Python來進行查詢和替換一個文本字符串?............................................................... 9

12. 遞歸函數中止的條件........................................................................................................................... 9

13. Python經常使用的設計模式有哪些?.................................................................................................... 9

14. 單例的應用場景有哪些?................................................................................................................ 11

15. 解釋一下什麼是閉包......................................................................................................................... 11

2、 Linux基礎和數據結構與算法................................................................................................................ 11

1. 10個經常使用的Linux命令?................................................................................................................. 11

2. find和grep的區別?........................................................................................................................ 11

3. 什麼是阻塞?什麼是非阻塞?......................................................................................................... 11

4. linux重定向命令有哪些?有什麼區別??................................................................................ 11

5.軟硬連接區別?........................................................................................................................................ 12

6.linux關機命令有哪些?..................................................................................................................... 12

7.linux下管道的做用?.......................................................................................................................... 12

3、 Web框架..................................................................................................................................................... 12

1.django 中當一個用戶登陸 A 應用服務器(進入登陸狀態),而後下次請求被 nginx 代理到 B 應用服務器會出現什麼影響?................................................................................................................................................... 12

2.跨域請求問題django怎麼解決的(原理)................................................................................... 12

3.請解釋或描述一下Django的架構..................................................................................................... 12

4.django對數據查詢結果排序怎麼作,降序怎麼作,查詢大於某個字段怎麼作................. 13

5.說一下Django,MIDDLEWARES中間件的做用?............................................................................ 13

6.你對Django的認識?........................................................................................................................... 13

7. Django重定向你是如何實現的?用的什麼狀態碼?................................................................ 13

8.ngnix的正向代理與反向代理?........................................................................................................ 13

9. Tornado 的核是什麼?....................................................................................................................... 14

10.Django 自己提供了 runserver,爲何不能用來部署?...................................................... 14

11.建立項目,建立應用的命令?......................................................................................................... 14

12. 生成遷移文件?執行遷移?........................................................................................................... 14

13. 關係型數據庫的關係包括那些類型?.......................................................................................... 14

14. 查詢集返回列表的過濾器有哪些?.............................................................................................. 14

15. 判斷查詢集中是否有數據?........................................................................................................... 14

16.查詢集兩大特性?惰性執行?......................................................................................................... 14

4、 網絡編程和前端......................................................................................................................................... 15

1.AJAX是什麼,如何使用AJAX?......................................................................................................... 15

2. 常見的HTTP狀態碼有哪些?........................................................................................................... 15

3. Post和get區別?.............................................................................................................................. 15

1.socket建立一個套接字........................................................................................................................ 16

2.bind綁定ip和port............................................................................................................................. 16

3.listen使套接字變爲能夠被動連接................................................................................................. 16

4.accept等待客戶端的連接................................................................................................................... 16

5.recv/send接收發送數據..................................................................................................................... 16

6.請簡單說一下三次握手和四次揮手?什麼是2msl?爲何要這樣作?............................... 16

7.七層模型?IP ,TCP/UDP, HTTP、RTSP、FTP分別在哪層?................................................. 17

5、 爬蟲和數據庫............................................................................................................................................. 18

1.scrapy和scrapy-redis有什麼區別?爲何選擇redis數據庫?..................................... 18

2. 你用過的爬蟲框架或者模塊有哪些?談談他們的區別或者優缺點?.................................. 18

3.你經常使用的mysql引擎有哪些?各引擎間有什麼區別?............................................................... 19

4.描述下scrapy框架運行的機制?..................................................................................................... 19

5.什麼是關聯查詢,有哪些?................................................................................................................ 20

6.寫爬蟲是用多進程好?仍是多線程好? 爲何?...................................................................... 20

7.數據庫的優化?...................................................................................................................................... 20

8.常見的反爬蟲和應對方法?................................................................................................................ 20

9.分佈式爬蟲主要解決什麼問題?....................................................................................................... 21

10.爬蟲過程當中驗證碼怎麼處理?......................................................................................................... 21

11.redis數據結構有哪些?................................................................................................................... 21

12. redis中list底層實現有哪幾種?有什麼區別?.................................................................. 21

13. QPS?...................................................................................................................................................... 22

6、 數據結構與算法......................................................................................................................................... 22

1.基礎的數據結構有哪些?.................................................................................................................... 22

2.怎麼評價一個算法的好壞?................................................................................................................ 22

3.算法的特性?........................................................................................................................................... 22

4.有沒有了解過桶排序?......................................................................................................................... 22

5.快排/冒泡的思想?............................................................................................................................... 23

 

 

 

 

 

Python4期模擬面試技術面試題答案

1、python語法

1. 請說一下你對迭代器和生成器的區別?

 答:(1)迭代器是一個更抽象的概念,任何對象,若是它的類有next方法和iter方法返回本身自己。對於string、list、dict、tuple等這類容器對象,使用for循環遍歷是很方便的。在後臺for語句對容器對象調用iter()函數,iter()是python的內置函數。iter()會返回一個定義了next()方法的迭代器對象,它在容器中逐個訪問容器內元素,next()也是python的內置函數。在沒有後續元素時,next()會拋出一個StopIteration異常

(2)生成器(Generator)是建立迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,只是在須要返回數據的時候使用yield語句。每次next()被調用時,生成器會返回它脫離的位置(它記憶語句最後一次執行的位置和全部的數據值)

區別:生成器能作到迭代器能作的全部事,並且由於自動建立了__iter__()和next()方法,生成器顯得特別簡潔,並且生成器也是高效的,使用生成器表達式取代列表解析能夠同時節省內存。除了建立和保存程序狀態的自動方法,當發生器終結時,還會自動拋出StopIteration異常

2. 什麼是線程安全?

線程安全是在多線程的環境下,可以保證多個線程同時執行時程序依舊運行正確, 並且要保證對於共享的數據能夠由多個線程存取,可是同一時刻只能有一個線程進行存取。多線程環境下解決資源競爭問題的辦法是加鎖來保證存取操做的惟一性。

3. 你所遵循的代碼規範是什麼?請舉例說明其要求?

PEP8

1變量

常量:大寫加下劃線 USER_CONSTANT

私有變量 : 小寫和一個前導下劃線 _private_value

Python 中不存在私有變量一說,如果遇到須要保護的變量,使用小寫和一個前導下劃線。但這只是程序員之間的一個約定,用於警告說明這是一個私有變量,外部類不要去訪問它。但實際上,外部類仍是能夠訪問到這個變量。

內置變量 : 小寫,兩個前導下劃線和兩個後置下劃線 __class__

兩個前導下劃線會致使變量在解釋期間被改名。這是爲了不內置變量和其餘變量產生衝突。用戶定義的變量要嚴格避免這種風格。以避免致使混亂。

函數和方法

整體而言應該使用,小寫和下劃線。但有些比較老的庫使用的是混合大小寫,即首單詞小寫,以後每一個單詞第一個字母大寫,其他小寫。但如今,小寫和下劃線已成爲規範。

私有方法 :小寫和一個前導下劃線

 

這裏和私有變量同樣,並非真正的私有訪問權限。同時也應該注意通常函數不要使用兩個前導下劃線(當遇到兩個前導下劃線時,Python 的名稱改編特性將發揮做用)。

特殊方法 :小寫和兩個前導下劃線,兩個後置下劃線

這種風格只應用於特殊函數,好比操做符重載等。

函數參數 : 小寫和下劃線,缺省值等號兩邊無空格

3

類老是使用駝峯格式命名,即全部單詞首字母大寫其他字母小寫。類名應該簡明,精確,並足以從中理解類所完成的工做。常見的一個方法是使用表示其類型或者特性的後綴,例如:

SQLEngine,MimeTypes對於基類而言,可使用一個 Base 或者 Abstract 前綴BaseCookie,AbstractGroup

4 模塊和包

除特殊模塊 __init__ 以外,模塊名稱都使用不帶下劃線的小寫字母。

如果它們實現一個協議,那麼一般使用lib爲後綴,例如:

import smtplib

import os

import sys

關於參數

5.1 不要用斷言來實現靜態類型檢測。斷言能夠用於檢查參數,但不該僅僅是進行靜態類型檢測。 Python 是動態類型語言,靜態類型檢測違背了其設計思想。斷言應該用於避免函數不被毫無心義的調用。

5.2 不要濫用 *args 和 **kwargs。*args 和 **kwargs 參數可能會破壞函數的健壯性。它們使簽名變得模糊,並且代碼經常開始在不該該的地方構建小的參數解析器。

6 其餘

6.1 使用 has 或 is 前綴命名布爾元素

is_connect = True

    has_member = False

6.2 用複數形式命名序列

members = ['user_1', 'user_2']

6.3 用顯式名稱命名字典

person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}

6.4 避免通用名稱

諸如 list, dict, sequence 或者 element 這樣的名稱應該避免。

6.5 避免現有名稱

諸如 os, sys 這種系統已經存在的名稱應該避免。

7 一些數字

一行列數 : PEP 8 規定爲 79 列。根據本身的狀況,好比不要超過滿屏時編輯器的顯示列數。

一個函數 : 不要超過 30 行代碼, 便可顯示在一個屏幕類,能夠不使用垂直遊標便可看到整個函數。

一個類 : 不要超過 200 行代碼,不要有超過 10 個方法。一個模塊 不要超過 500 行。

8 驗證腳本

能夠安裝一個 pep8 腳本用於驗證你的代碼風格是否符合 PEP8。

4. Python中數組有哪些類型?字典能夠是有序的嗎??

List Tuple Dictionary 

from collections import OrderedDict

dic=OrderedDict()#聲明有序字典

 

5. python 中 yield 的用法?

答: yield 簡單說來就是一個生成器,這樣函數它記住上次返 簡單說來就是一個生成器,這樣函數它記住上次返 簡單說來就是一個生成器,這樣函數它記住上次返 簡單說來就是一個生成器,這樣函數它記住上次返 回時在函數體中的位置。對生成器第 二次(或n 次)調用跳轉至該函 次)調用跳轉至該函 數。

6. Python中pass語句的做用是什麼?

pass語句什麼也不作,通常做爲佔位符或者建立佔位程序,pass語句不會執行任何操做。

7. python2和python3的區別?

1.性能 
Py3.0運行 pystone benchmark的速度比Py2.5慢30%。Guido認爲Py3.0有極大的優化空間,在字符串和整形操做上可
以取得很好的優化結果。 
Py3.1性能比Py2.5慢15%,還有很大的提高空間。 
2.編碼 
Py3.X源碼文件默認使用utf-8編碼
3. 語法 
1)去除了<>,所有改用!= 
2)去除``,所有改用repr() 
3)關鍵詞加入as 和with,還有True,False,None 
4)整型除法返回浮點數,要獲得整型結果,請使用// 
5)加入nonlocal語句。使用noclocal x能夠直接指派外圍(非全局)變量 
6)去除print語句,加入print()函數實現相同的功能。一樣的還有 exec語句,已經改成exec()函數 
7)改變了順序操做符的行爲,例如x<y,當x和y類型不匹配時拋出TypeError而不是返回隨即的 bool值  
8)輸入函數改變了,刪除了raw_input,用input代替: 
   2.X:guess = int(raw_input('Enter an integer : ')) # 讀取鍵盤輸入的方法 
   3.X:guess = int(input('Enter an integer : '))

9)去除元組參數解包。不能def(a, (b, c)):pass這樣定義函數了 
10)新式的8進制字變量,相應地修改了oct()函數。 
11)增長了 2進制字面量和bin()函數 

12)擴展的可迭代解包。在Py3.X 裏,a, b, *rest = seq和 *rest, a = seq都是合法的,只要求兩點:rest是list 
對象和seq是可迭代的。 
13)新的super(),能夠再也不給super()傳參數, 

14)新的metaclass語法: 
    class Foo(*bases, **kwds): 
      pass 
15)支持class decorator。用法與函數decorator同樣: 
4. 字符串和字節串 
1)如今字符串只有str一種類型,但它跟2.x版本的unicode幾乎同樣。

2)關於字節串,請參閱「數據類型」的第2條目 
5.數據類型 
1)Py3.X去除了long類型,如今只有一種整型——int,但它的行爲就像2.X版本的long 
2)新增了bytes類型,對應於2.X版本的八位串,定義一個bytes字面量的方法以下: 
   str對象和bytes對象可使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互轉化。

 3)dict的.keys()、.items 和.values()方法返回迭代器,而以前的iterkeys()等函數都被廢棄。同時去掉的還有 
dict.has_key(),用 in替代它吧 
6.面向對象 
1)引入抽象基類(Abstraact Base Classes,ABCs)。 
2)容器類和迭代器類被ABCs化。
3)迭代器的next()方法更名爲__next__(),並增長內置函數next(),用以調用迭代器的__next__()方法 
4)增長了@abstractmethod和 @abstractproperty兩個 decorator,編寫抽象方法(屬性)更加方便。 
7.異常 
1)因此異常都從 BaseException繼承,並刪除了StardardError 
2)去除了異常類的序列行爲和.message屬性 
3)用 raise Exception(args)代替 raise Exception, args語法 
4)捕獲異常的語法改變,引入了as關鍵字來標識異常實例 

5)異常鏈,由於__context__在3.0a1版本中沒有實現 
8.模塊變更 
1)移除了cPickle模塊,可使用pickle模塊代替。最終咱們將會有一個透明高效的模塊。 
2)移除了imageop模塊 
3)移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2,  
rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模塊 
4)移除了bsddb模塊(單獨發佈,能夠從
http://www.jcea.es/programacion/pybsddb.htm獲取) 
5)移除了new模塊 
6)os.tmpnam()和os.tmpfile()函數被移動到tmpfile模塊下 
7)tokenize模塊如今使用bytes工做。主要的入口點再也不是generate_tokens,而是 tokenize.tokenize() 
9.其它 
1)xrange() 更名爲range(),要想使用range()得到一個list,必須顯式調用: 
    >>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

2)bytes對象不能hash,也不支持 b.lower()、b.strip()和b.split()方法,但對於後二者可使用 b.strip(b’  \n\t\r \f’)和b.split(b’ ‘)來達到相同目的 
3)zip()、map()和filter()都返回迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload ()函數都被去除了如今可使用hasattr()來替換 callable(). hasattr()的語法如:hasattr(string, '__name__')

4)string.letters和相關的.lowercase和.uppercase被去除,請改用string.ascii_letters 等 
5)若是x < y的不能比較,拋出TypeError異常。2.x版本是返回僞隨機布爾值的 
6)__getslice__系列成員被廢棄。a[i:j]根據上下文轉換爲a.__getitem__(slice(I, j))或 __setitem__和 __delitem__調用 
7)file類被廢棄

 

8. 談談你對GIL鎖對python多線程的影響?

GIL的全稱是Global Interpreter Lock(全局解釋器鎖),來源是python設計之初的考慮,爲了數據安全所作的決定。每一個CPU在同一時間只能執行一個線程(在單核CPU下的多線程其實都只是併發,不是並行,併發和並行從宏觀上來說都是同時處理多路請求的概念。但併發和並行又有區別,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。)

在Python多線程下,每一個線程的執行方式:

1、獲取GIL

2、執行代碼直到sleep或者是python虛擬機將其掛起。

3、釋放GIL       

可見,某個線程想要執行,必須先拿到GIL,咱們能夠把GIL看做是「通行證」,而且在一個python進程中,GIL只有一個。拿不到通行證的線程,就不容許進入CPU執行。

在Python2.x裏,GIL的釋放邏輯是當前線程碰見IO操做或者ticks計數達到100(ticks能夠看做是Python自身的一個計數器,專門作用於GIL,每次釋放後歸零,這個計數能夠經過 sys.setcheckinterval 來調整),進行釋放。而每次釋放GIL鎖,線程進行鎖競爭、切換線程,會消耗資源。而且因爲GIL鎖存在,python裏一個進程永遠只能同時執行一個線程(拿到GIL的線程才能執行)。

 IO密集型代碼(文件處理、網絡爬蟲等),多線程可以有效提高效率(單線程下有IO操做會進行IO等待,形成沒必要要的時間浪費,而開啓多線程能在線程A等待時,自動切換到線程B,能夠不浪費CPU的資源,從而能提高程序執行效率),因此多線程對IO密集型代碼比較友好。

9. python是如何進行內存管理的?

1、垃圾回收:python不像C++,Java等語言同樣,他們能夠不用事先聲明變量類型而直接對變量進行賦值。對Python語言來說,對象的類型和內存都是在運行時肯定的。這也是爲何咱們稱Python語言爲動態類型的緣由(這裏咱們把動態類型能夠簡單的歸結爲對變量內存地址的分配是在運行時自動判斷變量類型並對變量進行賦值)。

2、引用計數:Python採用了相似Windows內核對象同樣的方式來對內存進行管理。每個對象,都維護這一個對指向該對對象的引用的計數。當變量被綁定在一個對象上的時候,該變量的引用計數就是1,(還有另一些狀況也會致使變量引用計數的增長),系統會自動維護這些標籤,並定時掃描,當某標籤的引用計數變爲0的時候,該對就會被回收。

3、內存池機制Python的內存機制以金字塔行,-1,-2層主要有操做系統進行操做,

  第0層是C中的malloc,free等內存分配和釋放函數進行操做;

  第1層和第2層是內存池,有Python的接口函數PyMem_Malloc函數實現,當對象小於256K時有該層直接分配內存;

  第3層是最上層,也就是咱們對Python對象的直接操做;

在 C 中若是頻繁的調用 malloc 與 free 時,是會產生性能問題的.再加上頻繁的分配與釋放小塊的內存會產生內存碎片. Python 在這裏主要乾的工做有:

  若是請求分配的內存在1~256字節之間就使用本身的內存管理系統,不然直接使用 malloc.

  這裏仍是會調用 malloc 分配內存,但每次會分配一塊大小爲256k的大塊內存.

  經由內存池登記的內存到最後仍是會回收到內存池,並不會調用 C 的 free 釋放掉.以便下次使用.對於簡單的Python對象,例如數值、字符串,元組(tuple不容許被更改)採用的是複製的方式(深拷貝?),也就是說當將另外一個變量B賦值給變量A時,雖然A和B的內存空間仍然相同,但當A的值發生變化時,會從新給A分配空間,A和B的地址變得再也不相同

  1. 10.    Python裏面如何拷貝一個對象?(賦值,淺拷貝,深拷貝的區別)

答:賦值(=),就是建立了對象的一個新的引用,修改其中任意一個變量都會影響到另外一個。

淺拷貝:建立一個新的對象,但它包含的是對原始對象中包含項的引用(若是用引用的方式修改其中一個對象,另一個也會修改改變){1,徹底切片方法;2,工廠函數,如list();3,copy模塊的copy()函數}

深拷貝:建立一個新的對象,而且遞歸的複製它所包含的對象(修改其中一個,另一個不會改變){copy模塊的deep.deepcopy()函數}

 

  1. 11.    如何用Python來進行查詢和替換一個文本字符串?

可使用re模塊中的sub()函數或者subn()函數來進行查詢和替換,

格式:sub(replacement, string[,count=0])(replacement是被替換成的文本,string是須要被替換的文本,count是一個可選參數,指最大被替換的數量)

  1. 12.    遞歸函數中止的條件

遞歸的終止條件通常定義在遞歸函數內部,在遞歸調用前要作一個條件判斷,根據判斷的結果選擇是繼續調用自身,仍是return;返回終止遞歸。

終止的條件:1.判斷遞歸的次數是否達到某一限定值

  1. 2.   判斷運算的結果是否達到某個範圍等,根據設計的目的來選擇
  2. 13.    Python經常使用的設計模式有哪些?

1 建立型模式

前面講過,社會化的分工愈來愈細,天然在軟件設計方面也是如此,所以對象的建立和對象的使用分開也就成爲了必然趨勢。由於對象的建立會消耗掉系統的不少資源,因此單獨對對象的建立進行研究,從而可以高效地建立對象就是建立型模式要探討的問題。這裏有6個具體的建立型模式可供研究,它們分別是:

簡單工廠模式(Simple Factory);

工廠方法模式(Factory Method);

抽象工廠模式(Abstract Factory);

建立者模式(Builder);

原型模式(Prototype);

單例模式(Singleton)。

說明:嚴格來講,簡單工廠模式不是GoF總結出來的23種設計模式之一。

結構型模式

在解決了對象的建立問題以後,對象的組成以及對象之間的依賴關係就成了開發人員關注的焦點,由於如何設計對象的結構、繼承和依賴關係會影響到後續程序的維護性、代碼的健壯性、耦合性等。對象結構的設計很容易體現出設計人員水平的高低,這裏有7個具體的結構型模式可供研究,它們分別是:

外觀模式(Facade);

適配器模式(Adapter);

代理模式(Proxy);

裝飾模式(Decorator);

橋模式(Bridge);

組合模式(Composite);

享元模式(Flyweight)

 

3 行爲型模式

在對象的結構和對象的建立問題都解決了以後,就剩下對象的行爲問題了,若是對象的行爲設計的好,那麼對象的行爲就會更清晰,它們之間的協做效率就會提升,這裏有11個具體的行爲型模式可供研究,它們分別是:

模板方法模式(Template Method);

觀察者模式(Observer);

狀態模式(State);

策略模式(Strategy);

職責鏈模式(Chain of Responsibility);

命令模式(Command);

訪問者模式(Visitor);

調停者模式(Mediator);

備忘錄模式(Memento);

迭代器模式(Iterator);

解釋器模式(Interpreter)。

 

  1. 14.    單例的應用場景有哪些?

單例模式應用的場景通常發如今如下條件下:

  (1)資源共享的狀況下,避免因爲資源操做時致使的性能或損耗等。如日誌文件,應用配置。

  (2)控制資源的狀況下,方便資源之間的互相通訊。如線程池等。

1.網站的計數器

2.應用配置

3.多線程池

4.數據庫配置,數據庫鏈接池

5.應用程序的日誌應用....

  1. 15.    解釋一下什麼是閉包

內部函數可使用外部函數變量的行爲,就叫閉包

2、Linux基礎和數據結構與算法

1. 10個經常使用的Linux命令?

答案:略

2. find和grep的區別?

grep命令是一種強大的文本搜索工具,grep搜索內容串能夠是正則表達式,容許對文本文件進行模式查找。若是找到匹配模式, grep打印包含模式的全部行。

find一般用來在特定的目錄下搜索符合條件的文件,也能夠用來搜索特定用戶屬主的文件。

3. 什麼是阻塞?什麼是非阻塞?

阻塞調用是指調用結果返回以前,當前線程會被掛起。函數只有在獲得結果以後纔會返回。有人也許會把阻塞調用和同步調用等同起來,實際上他是不一樣的。對於同步調用來講,不少時候當前線程仍是激活的,只是從邏輯上當前函數沒有返回而已。例如,咱們在CSocket中調用Receive函數,若是緩衝區中沒有數據,這個函數就會一直等待,直到有數據才返回。而此時,當前線程還會繼續處理各類各樣的消息。若是主窗口和調用函數在同一個線程中,除非你在特殊的界面操做函數中調用,其實主界面仍是應該能夠刷新。socket接收數據的另一個函數recv則是一個阻塞調用的例子。當socket工做在阻塞模式的時候,若是沒有數據的狀況下調用該函數,則當前線程就會被掛起,直到有數據爲止。

非阻塞和阻塞的概念相對應,指在不能馬上獲得結果以前,該函數不會阻塞當前線程,而會馬上返回。

4. linux重定向命令有哪些?有什麼區別??

重定向>

Linux容許將命令執行結果重定向到一個文件,本應顯示在終端上的內容保存到指定文件中。如:ls > test.txt ( test.txt 若是不存在,則建立,存在則覆蓋其內容 )

重定向>>

>>這個是將輸出內容追加到目標文件中。若是文件不存在,就建立文件;若是文件存在,則將新的內容追加到那個文件的末尾,該文件中的原有內容不受影響。

5.軟硬連接區別?

軟鏈接相似windows的快捷方式,當刪除源文件,那麼軟連接失效。硬連接能夠理解爲源文件的一個別名。多個別名所表明的是同一個文件。當rm一個文件的時候,那麼此文件的硬連接數減1,當硬連接數爲0的時候,文件刪除。

6.linux關機命令有哪些?

命令

含義

reboot

從新啓動操做系統

shutdown –r now

從新啓動操做系統,shutdown會給別的用戶提示

shutdown -h now

馬上關機,其中now至關於時間爲0的狀態

shutdown -h 20:25

系統在今天的20:25 會關機

shutdown -h +10

系統再過十分鐘後自動關機

init 0

關機

init 6

重啓

7.linux下管道的做用?

一個命令的輸出能夠經過管道作爲另外一個命令的輸入

 

 

 

 

 

3、Web框架

1.django 中當一個用戶登陸 A 應用服務器(進入登陸狀態),而後下次請求被 nginx 代理到 B 應用服務器會出現什麼影響?

若是用戶在A應用服務器登錄的session數據沒有共享到B應用服務器,納米以前的登陸狀態就沒有了。

2.跨域請求問題django怎麼解決的(原理)

啓用中間件

post請求

驗證碼

表單中添加{%csrf_token%}標籤

3.請解釋或描述一下Django的架構

對於Django框架遵循MVC設計,而且有一個專有名詞:MVT

M全拼爲Model,與MVC中的M功能相同,負責數據處理,內嵌了ORM框架

V全拼爲View,與MVC中的C功能相同,接收HttpRequest,業務處理,返回HttpResponse

T全拼爲Template,與MVC中的V功能相同,負責封裝構造要返回的html,內嵌了模板引擎

4.django對數據查詢結果排序怎麼作,降序怎麼作,查詢大於某個字段怎麼作

排序使用order_by()

降序須要在排序字段名前加-

查詢字段大於某個值:使用filter(字段名_gt=值)

5.說一下Django,MIDDLEWARES中間件的做用?

答:中間件是介於request與response處理之間的一道處理過程,相對比較輕量級,而且在全局上改變django的輸入與輸出。

 

6.你對Django的認識?

Django是走大而全的方向,它最出名的是其全自動化的管理後臺:只須要使用起ORM,作簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理後臺。

Django內置的ORM跟框架內的其餘模塊耦合程度高。

 

應用程序必須使用Django內置的ORM,不然就不能享受到框架內提供的種種基於其ORM的便利;理論上能夠切換掉其ORM模塊,但這就至關於要把裝修完畢的房子拆除從新裝修,倒不如一開始就去毛胚房作全新的裝修。

Django的賣點是超高的開發效率,其性能擴展有限;採用Django的項目,在流量達到必定規模後,都須要對其進行重構,才能知足性能的要求。

Django適用的是中小型的網站,或者是做爲大型網站快速實現產品雛形的工具。

Django模板的設計哲學是完全的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數據的可能。

7. Django重定向你是如何實現的?用的什麼狀態碼?

使用HttpResponseRedirect

redirect和reverse

狀態碼:302,301

8.ngnix的正向代理與反向代理?

答:正向代理 是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。客戶端必需要進行一些特別的設置才能使用正向代理。

反向代理正好相反,對於客戶端而言它就像是原始服務器,而且客戶端不須要進行任何特別的設置。客戶端向反向代理的命名空間中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將得到的內容返回給客戶端,就像這些內容本來就是它本身的同樣。

9. Tornado 的核是什麼?

Tornado 的核心是 ioloop 和 iostream 這兩個模塊,前者提供了一個高效的 I/O 事件循環,後者則封裝了 一個無阻塞的 socket 。經過向 ioloop 中添加網絡 I/O 事件,利用無阻塞的 socket ,再搭配相應的回調 函數,即可達到求之不得的高效異步執行。

10.Django 自己提供了 runserver,爲何不能用來部署?

runserver 方法是調試 Django 時常常用到的運行方式,它使用 Django 自帶的

WSGI Server 運行,主要在測試和開發中使用,而且 runserver 開啓的方式也是單進程 。

 uWSGI 是一個 Web 服務器,它實現了 WSGI 協議、uwsgi、http 等協議。注意 uwsgi 是一種通訊協議,而 uWSGI 是實現 uwsgi 協議和 WSGI 協議的 Web 服務器。uWSGI 具備超快的性能、低內存佔用和多 app 管理等優勢,而且搭配着 Nginx

就是一個生產環境了,可以將用戶訪問請求與應用 app 隔離開,實現真正的部署 。相比來說,支持的併發量更高,方便管理多進程,發揮多核的優點,提高性能。

11.建立項目,建立應用的命令?

django-admin startproject ** 
python manage.py startapp **

  1. 12.  生成遷移文件?執行遷移?

python manage.py makemigrations

python manage.py migrate

 

  1. 13.  關係型數據庫的關係包括那些類型?

ForeignKey:一對多,將字段定義在多的一端中

ManyToManyField:多對多,將字段定義在兩端中

OneToOneField:一對一,將字段定義在任意一端中

  1. 14.  查詢集返回列表的過濾器有哪些?

all():返回全部數據

filter():返回知足條件的數據

exclude():返回知足條件以外的數據,至關於sql語句中where部分的not關鍵字

order_by():排序

 

  1. 15.  判斷查詢集中是否有數據?

exists():判斷查詢集中是否有數據,若是有則返回True,沒有則返回False

 

16.查詢集兩大特性?惰性執行?

惰性執行、緩存 。

建立查詢集不會訪問數據庫,直到調用數據時,纔會訪問數據庫,調用數據的狀況包括迭代、序列化、與if合用

4、網絡編程和前端

1.AJAX是什麼,如何使用AJAX?

ajax(異步的javascript 和xml) 可以刷新局部網頁數據而不是從新加載整個網頁。

第一步,建立xmlhttprequest對象,var xmlhttp =new XMLHttpRequest();XMLHttpRequest對象用來和服務器交換數據。

第二步,使用xmlhttprequest對象的open()和send()方法發送資源請求給服務器。

第三步,使用xmlhttprequest對象的responseText或responseXML屬性得到服務器的響應。

第四步,onreadystatechange函數,當發送請求到服務器,咱們想要服務器響應執行一些功能就須要使用onreadystatechange函數,每次xmlhttprequest對象的readyState發生改變都會觸發onreadystatechange函數。

2. 常見的HTTP狀態碼有哪些?

200 OK

301 Moved Permanently

302 Found

304 Not Modified

307 Temporary Redirect

400 Bad Request

401 Unauthorized

403 Forbidden

404 Not Found

410 Gone

500 Internal Server Error

501 Not Implemented

3. Post和get區別?

1、GET請求,請求的數據會附加在URL以後,以?分割URL和傳輸數據,多個參數用&鏈接。URL的編碼格式採用的是ASCII編碼,而不是uniclde,便是說全部的非ASCII字符都要編碼以後再傳輸。

POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。

所以,GET請求的數據會暴露在地址欄中,而POST請求則不會。

2、傳輸數據的大小

在HTTP規範中,沒有對URL的長度和傳輸的數據大小進行限制。可是在實際開發過程當中,對於GET,特定的瀏覽器和服務器對URL的長度有限制。所以,在使用GET請求時,傳輸數據會受到URL長度的限制。

對於POST,因爲不是URL傳值,理論上是不會受限制的,可是實際上各個服務器會規定對POST提交數據大小進行限制,Apache、IIS都有各自的配置。

3、安全性

POST的安全性比GET的高。這裏的安全是指真正的安全,而不一樣於上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改服務器的數據。好比,在進行登陸操做,經過GET請求,用戶名和密碼都會暴露再URL上,由於登陸頁面有可能被瀏覽器緩存以及其餘人查看瀏覽器的歷史記錄的緣由,此時的用戶名和密碼就很容易被他人拿到了。除此以外,GET請求提交的數據還可能會形成Cross-site request frogery攻擊。

4.cookie 和session 的區別?

1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

2、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。

3、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。

4、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。

5、建議:
   將登錄信息等重要信息存放爲SESSION
   其餘信息若是須要保留,能夠放在COOKIE中

 

5.建立一個簡單tcp服務器須要的流程

1.socket建立一個套接字

2.bind綁定ip和port

3.listen使套接字變爲能夠被動連接

4.accept等待客戶端的連接

5.recv/send接收發送數據

6.請簡單說一下三次握手和四次揮手?什麼是2msl?爲何要這樣作?

 

2MSL即兩倍的MSL,TCP的TIME_WAIT狀態也稱爲2MSL等待狀態,

 

當TCP的一端發起主動關閉,在發出最後一個ACK包後,

即第3次握 手完成後發送了第四次握手的ACK包後就進入了TIME_WAIT狀態,

必須在此狀態上停留兩倍的MSL時間,

等待2MSL時間主要目的是怕最後一個 ACK包對方沒收到,

那麼對方在超時後將重發第三次握手的FIN包,

主動關閉端接到重發的FIN包後能夠再發一個ACK應答包。

在TIME_WAIT狀態 時兩端的端口不能使用,要等到2MSL時間結束纔可繼續使用。

當鏈接處於2MSL等待階段時任何遲到的報文段都將被丟棄。

不過在實際應用中能夠經過設置 SO_REUSEADDR選項達到沒必要等待2MSL時間結束再使用此端口。

 

7.七層模型?IP ,TCP/UDP, HTTP、RTSP、FTP分別在哪層?

 

IP          網絡層

TCP/UDP    傳輸層

HTTP、RTSP、FTP 應用層協議(

5、爬蟲和數據庫

1.scrapy和scrapy-redis有什麼區別?爲何選擇redis數據庫?

1) scrapy是一個Python爬蟲框架,爬取效率極高,具備高度定製性,可是不支持分佈式。而scrapy-redis一套基於redis數據庫、運行在scrapy框架之上的組件,可讓scrapy支持分佈式策略,Slaver端共享Master端redis數據庫裏的item隊列、請求隊列和請求指紋集合。

2) 爲何選擇redis數據庫,由於redis支持主從同步,並且數據都是緩存在內存中的,因此基於redis的分佈式爬蟲,對請求和數據的高頻讀取效率很是高。

2. 你用過的爬蟲框架或者模塊有哪些?談談他們的區別或者優缺點?

Python自帶:urllib,urllib2

第 三 方:requests

框    架:Scrapy

urllib和urllib2模塊都作與請求URL相關的操做,但他們提供不一樣的功能。

urllib2.:urllib2.urlopen能夠接受一個Request對象或者url,(在接受Request對象時候,並以此能夠來設置一個URL 的headers),urllib.urlopen只接收一個url

urllib 有urlencode,urllib2沒有,所以老是urllib,urllib2常會一塊兒使用的緣由

scrapy是封裝起來的框架,他包含了下載器,解析器,日誌及異常處理,基於多線程, twisted的方式處理,對於固定單個網站的爬取開發,有優點,可是對於多網站爬取 100個網站,併發及分佈式處理方面,不夠靈活,不便調整與括展。

request 是一個HTTP庫, 它只是用來,進行請求,對於HTTP請求,他是一個強大的庫,下載,解析所有本身處理,靈活性更高,高併發與分佈式部署也很是靈活,對於功能能夠更好實現.

Scrapy優缺點:

優勢:scrapy 是異步的

採起可讀性更強的xpath代替正則

強大的統計和log系統

同時在不一樣的url上爬行

支持shell方式,方便獨立調試

寫middleware,方便寫一些統一的過濾器

經過管道的方式存入數據庫

缺點:基於python的爬蟲框架,擴展性比較差

基於twisted框架,運行中的exception是不會幹掉reactor,而且異步框架出錯後是不會停掉其餘任務的,數據出錯後難以察覺。

3.你經常使用的mysql引擎有哪些?各引擎間有什麼區別?

主要 MyISAM 與 InnoDB 兩個引擎,其主要區別以下:

1、InnoDB 支持事務,MyISAM 不支持,這一點是很是之重要。事務是一種高

級的處理方式,如在一些列增刪改中只要哪一個出錯還能夠回滾還原,而 MyISAM

就不能夠了;

2、MyISAM 適合查詢以及插入爲主的應用,InnoDB 適合頻繁修改以及涉及到

安全性較高的應用;

3、InnoDB 支持外鍵,MyISAM 不支持;

4、MyISAM 是默認引擎,InnoDB 須要指定;

5、InnoDB 不支持 FULLTEXT 類型的索引;

6、InnoDB 中不保存表的行數,如 select count(*) from table 時,InnoDB;須要

掃描一遍整個表來計算有多少行,可是 MyISAM 只要簡單的讀出保存好的行數即

可。注意的是,當 count(*)語句包含 where 條件時 MyISAM 也須要掃描整個表;

7、對於自增加的字段,InnoDB 中必須包含只有該字段的索引,可是在 MyISAM

表中能夠和其餘字段一塊兒創建聯合索引;

8、清空整個表時,InnoDB 是一行一行的刪除,效率很是慢。MyISAM 則會重

建表;

9、InnoDB 支持行鎖(某些狀況下仍是鎖整表,如 update table set a=1 where

user like '%lee%'

4.描述下scrapy框架運行的機制?

答:從start_urls裏獲取第一批url併發送請求,請求由引擎交給調度器入請求隊列,獲取完畢後,調度器將請求隊列裏的請求交給下載器去獲取請求對應的響應資源,並將響應交給本身編寫的解析方法作提取處理:1. 若是提取出須要的數據,則交給管道文件處理;2. 若是提取出url,則繼續執行以前的步驟(發送url請求,並由引擎將請求交給調度器入隊列...),直到請求隊列裏沒有請求,程序結束。

5.什麼是關聯查詢,有哪些?

答:將多個表聯合起來進行查詢,主要有內鏈接、左鏈接、右鏈接、全鏈接(外鏈接)

6.寫爬蟲是用多進程好?仍是多線程好? 爲何?

答:IO密集型代碼(文件處理、網絡爬蟲等),多線程可以有效提高效率(單線程下有IO操做會進行IO等待,形成沒必要要的時間浪費,而開啓多線程能在線程A等待時,自動切換到線程B,能夠不浪費CPU的資源,從而能提高程序執行效率)。在實際的數據採集過程當中,既考慮網速和響應的問題,也須要考慮自身機器的硬件狀況,來設置多進程或多線程

7.數據庫的優化?

1. 優化索引、SQL 語句、分析慢查詢;

2. 設計表的時候嚴格根據數據庫的設計範式來設計數據庫;

3. 使用緩存,把常常訪問到的數據並且不須要常常變化的數據放在緩存中,能

節約磁盤IO;

4. 優化硬件;採用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等;

5. 採用MySQL 內部自帶的表分區技術,把數據分層不一樣的文件,可以提升磁

盤的讀取效率;

6. 垂直分表;把一些不常常讀的數據放在一張表裏,節約磁盤I/O;

7. 主從分離讀寫;採用主從複製把數據庫的讀操做和寫入操做分離開來;

8. 分庫分表分機器(數據量特別大),主要的的原理就是數據路由;

9. 選擇合適的表引擎,參數上的優化;

10. 進行架構級別的緩存,靜態化和分佈式;

11. 不採用全文索引;

12. 採用更快的存儲方式,例如 NoSQL存儲常常訪問的數據

8.常見的反爬蟲和應對方法?

1).經過Headers反爬蟲

從用戶請求的Headers反爬蟲是最多見的反爬蟲策略。不少網站都會對Headers的User-Agent進行檢測,還有一部分網站會對Referer進行檢測(一些資源網站的防盜鏈就是檢測Referer)。若是遇到了這類反爬蟲機制,能夠直接在爬蟲中添加Headers,將瀏覽器的User-Agent複製到爬蟲的Headers中;或者將Referer值修改成目標網站域名。對於檢測Headers的反爬蟲,在爬蟲中修改或者添加Headers就能很好的繞過。

2).基於用戶行爲反爬蟲

還有一部分網站是經過檢測用戶行爲,例如同一IP短期內屢次訪問同一頁面,或者同一帳戶短期內屢次進行相同操做。

大多數網站都是前一種狀況,對於這種狀況,使用IP代理就能夠解決。能夠專門寫一個爬蟲,爬取網上公開的代理ip,檢測後所有保存起來。這樣的代理ip爬蟲常常會用到,最好本身準備一個。有了大量代理ip後能夠每請求幾回更換一個ip,這在requests或者urllib2中很容易作到,這樣就能很容易的繞過第一種反爬蟲。

對於第二種狀況,能夠在每次請求後隨機間隔幾秒再進行下一次請求。有些有邏輯漏洞的網站,能夠經過請求幾回,退出登陸,從新登陸,繼續請求來繞過同一帳號短期內不能屢次進行相同請求的限制。

3).動態頁面的反爬蟲

上述的幾種狀況大多都是出如今靜態頁面,還有一部分網站,咱們須要爬取的數據是經過ajax請求獲得,或者經過JavaScript生成的。首先用Fiddler對網絡請求進行分析。若是可以找到ajax請求,也能分析出具體的參數和響應的具體含義,咱們就能採用上面的方法,直接利用requests或者urllib2模擬ajax請求,對響應的json進行分析獲得須要的數據。

可以直接模擬ajax請求獲取數據當然是極好的,可是有些網站把ajax請求的全部參數所有加密了。咱們根本沒辦法構造本身所須要的數據的請求。這種狀況下就用selenium+phantomJS,調用瀏覽器內核,並利用phantomJS執行js來模擬人爲操做以及觸發頁面中的js腳本。從填寫表單到點擊按鈕再到滾動頁面,所有均可以模擬,不考慮具體的請求和響應過程,只是完完整整的把人瀏覽頁面獲取數據的過程模擬一遍。

用這套框架幾乎能繞過大多數的反爬蟲,由於它不是在假裝成瀏覽器來獲取數據(上述的經過添加 Headers必定程度上就是爲了假裝成瀏覽器),它自己就是瀏覽器,phantomJS就是一個沒有界面的瀏覽器,只是操控這個瀏覽器的不是人。利selenium+phantomJS能幹不少事情,例如識別點觸式(12306)或者滑動式的驗證碼,對頁面表單進行暴力破解等。

9.分佈式爬蟲主要解決什麼問題?

1)ip

2)帶寬

3)cpu

4)io

10.爬蟲過程當中驗證碼怎麼處理?

1.scrapy自帶(可是成功率不高)

2.付費接口(若快http://www.ruokuai.com/home/pricetype)

11.redis數據結構有哪些?

String——字符串
Hash——字典
List——列表
Set——集合
Sorted Set——有序集合

 

  1. 12.  redis中list底層實現有哪幾種?有什麼區別?

列表對象的編碼能夠是ziplist或者linkedlist。

ziplist是一種壓縮鏈表,它的好處是更能節省內存空間,由於它所存儲的內容都是在連續的內存區域當中的。當列表對象元素不大,每一個元素也不大的時候,就採用ziplist存儲。但當數據量過大時就ziplist就不是那麼好用了。由於爲了保證他存儲內容在內存中的連續性,插入的複雜度是O(N),即每次插入都會從新進行realloc。以下圖所示,對象結構中ptr所指向的就是一個ziplist。整個ziplist只須要malloc一次,它們在內存中是一塊連續的區域。

 

 

  1. 13.  QPS

每秒查詢率

QPS(TPS):每秒鐘request/事務 數量

6、數據結構與算法

1.基礎的數據結構有哪些?

集合、線性結構樹形結構、圖狀結構

集合結構:除了同屬於一種類型外,別無其它關係
線性結構:元素之間存在一對一關係常見類型有: 數組,鏈表,隊列,棧,它們之間在操做上有所區別.例如:鏈表可在任意位置插入或刪除元素,而隊列在隊尾插入元素,隊頭刪除元素,棧只能在棧頂進行插
入,刪除操做.
樹形結構:元素之間存在一對多關係,常見類型有:樹(有許多特例:二叉樹、平衡二叉樹、查找樹等)
圖形結構:元素之間存在多對多關係,圖形結構中每一個結點的前驅結點數和後續結點多個數能夠任意

 

2.怎麼評價一個算法的好壞?

時間複雜度:一樣的輸入規模(問題規模)花費多少時間
②空間複雜度:一樣的輸入規模花費多少空間(主要是內存)
以上兩點越小越好
③穩定性:不會由於輸入的不一樣而致使不穩定的狀況發生
④算法思路是否簡單:越簡單越容易實現越好

3.算法的特性?

數據結構算法具備五個基本特徵:輸入、輸出、有窮性、肯定性和可行性

 

4.有沒有了解過桶排序?

工做的原理是將數組分到有限數量的桶子裏。每一個桶子再個別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序)

1,桶排序是穩定的

2,桶排序是常見排序裏最快的一種,比快排還要快…大多數狀況下

3,桶排序很是快,可是同時也很是耗空間,基本上是最耗空間的一種排序算法

 

5.快排/冒泡的思想?

 

冒泡思想:經過無序區中相鄰記錄的關鍵字間的比較和位置的交換,使關鍵字最小的記錄像氣泡同樣逐漸向上漂至水面。整個算法是從最下面的記錄開始,對每兩個相鄰的關鍵字進行比較,把關鍵字較小的記錄放到關鍵字較大的記錄的上面,通過一趟排序後,關鍵字最小的記錄到達最上面,接着再在剩下的記錄中找關鍵字次小的記錄,把它放在第二個位置上,依次類推,一直到全部記錄有序爲止

複雜度:時間複雜度爲O(n2),空間複雜度爲O(1)

 

快排思想:

複雜度:快速排序是不穩定的排序算法,最壞的時間複雜度是O(n2),

最好的時間複雜度是(nlogn),空間複雜度爲O(logn)

快排的基本思想:經過一躺排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一不部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。

 

6.你知道幾種排序,講一講你最熟悉的一種?

 

相關文章
相關標籤/搜索