




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1.Python
線程池原理?
我理解為線程池是一個存放很多線程的單位,同時尚有一個相應(yīng)的任務(wù)隊列。整個執(zhí)行過程其實就是使用線程池中已有有限的線程把任務(wù)隊列中的任務(wù)做完。這樣做的好處就是你不需要為每個任務(wù)都創(chuàng)建一個線程,由于當(dāng)你創(chuàng)建第100個線程來執(zhí)行第100個任務(wù)的時候,也許前面已有50個線
程結(jié)束工作了。超過最大值的線程可以排隊,但他們要等到其他線程完畢后才啟動。因此反復(fù)運用線程來執(zhí)行任務(wù),減少系統(tǒng)資源的開銷。
2.Python合并字典,相同key的value如何相加?運用collections.Counter可輕松辦到>>>
x
=
{
'apple':
1,
'banana':
2
}>>>
y
=
{
'banana':
10,
'pear':
11
}>>>
from
collections
import
Counter>>>
X,Y
=
Counter(x),
Counter(y)>>>
z
=
dict(X+Y)>>>
z{'apple':
1,
'banana':
12,
'pear':
11}另一種寫法>>>from
collections
import
Counter>>>dict(Counter(x)+Counter(y))
(
合并兩個字典的方法方法1:dictMerged1=dict(dict1.items()+dict2.items())?方法2:dictMerged2=dict(dict1,
**dict2)?方法2等同于:dictMerged=dict1.copy()
dictMerged.update(dict2)或者dictMerged=dict(dict1)?dictMerged.updat(yī)e(dict2)3.解釋GUI和GPL?GUI圖形用戶HYPERLINK""界面(Graphical
User
Interface,簡稱
GUI,又稱圖形HYPERLINK""用戶接口)是指采用圖形方式顯示的計算機(jī)操作用戶HYPERLINK""界面。
GPL(HYPERLINK""GNU通用公共許可證)GPL同其它的自由軟件許可證同樣,許可社會公眾享有:運營、復(fù)制軟件的自由,發(fā)行傳播軟件的自由,獲得軟件源碼的自由,改善軟件并將自己作出的改善版本向社會發(fā)行傳播的自由。
4.簡述爬蟲的基本環(huán)節(jié)和流程?
網(wǎng)絡(luò)爬蟲的基本工作流程如下:
1.一方面選取一部分精心挑選的URL;
2.將這些URL放入待抓取URL隊列;
3.從待抓取URL隊列中取出待抓取在URL,(解析DNS,并且得到主機(jī)的ip,)并將URL相應(yīng)的網(wǎng)頁下載下來,存儲進(jìn)已下載網(wǎng)頁庫中。此外,將這些URL放進(jìn)已抓取URL隊列。4.分析已抓?。誖L隊列中的URL和其中的有價值的數(shù)據(jù),將新的URL,放入待抓取URL隊列,將數(shù)據(jù)存儲起來,從而進(jìn)入下一個循環(huán)。
5.你們公司的業(yè)務(wù)中,并發(fā)能達(dá)成多少?
6.如何循環(huán)抓取一個網(wǎng)站的1000張圖片?流程大約是這樣?找到所有頁數(shù)
----遍歷所有的頁數(shù)?----遍歷當(dāng)前頁的所有相冊(給每個相冊建立一個目錄)
遍歷當(dāng)前相冊的所有圖片(遍歷此相冊的所有頁(遍歷當(dāng)前頁的所有照片并找到圖片的url))
----獲得圖片url就存起來,然后通過圖片url下載圖片。-引用計數(shù)當(dāng)圖片下載量達(dá)成1000張時,停止爬取。
7.假如對方網(wǎng)站可以反爬取,封ip怎么辦?1、放慢抓取速度,減小對于目的網(wǎng)站導(dǎo)致的壓力。但是這樣會減少單位時間類的抓取量。?2、第二種方法是通過設(shè)立代理IP等手段,突破反爬蟲機(jī)制繼續(xù)高頻率抓取。但是這樣需要多個穩(wěn)定的代理IP。代理IP可以搜索到免費的,但是也許不太穩(wěn)定,也有收費的,但是不一定劃算,也也許不是長期之計。
普通的基于ADSL撥號的解決辦法
通常,在抓取過程中碰到嚴(yán)禁訪問,可以重新進(jìn)行ADSL撥號,獲取新的IP,從而可以繼續(xù)抓取。但是這樣在多網(wǎng)站多線程抓取的時候,假如某一個網(wǎng)站的抓取被嚴(yán)禁了,?同時也影響到了其他網(wǎng)站的抓取,整體來說也會減少抓取速度。
一種也許的解決辦法
同樣也是基于ADSL撥號,不同的是,需要兩臺可以進(jìn)行ADSL撥號的服務(wù)器,抓取過程中使用這兩臺服務(wù)器作為代理。
假設(shè)有A、B兩臺可以進(jìn)行ADSL撥號的服務(wù)器。爬蟲程序在C服務(wù)器上運營,使用A作為代理訪問外網(wǎng),假如在抓取過程中碰到嚴(yán)禁訪問的情況,立即將代理切換為B,然后將A進(jìn)行重新?lián)芴?。假如再碰到?yán)禁訪問就切換為A做代理,B再撥號,如此反復(fù)。如下圖:使用A為代理,B撥號:8.簡述
移動端app
數(shù)據(jù)的抓取流程1、例如:爬取手機(jī)淘寶,核心還是一個WEB頁面:HYPERLINK"//link.zhih/?target="
2、有很多資訊類的APP,核心都是一個WEB頁面。直接用爬蟲的方法抓就可以了。
3、非WEB頁面的APP,用APP自動化的一些東西試試4、不然就只有抓包了。
9.是否了解Python的函數(shù)參數(shù)傳遞的機(jī)制?python的參數(shù)傳遞機(jī)制具有值傳遞(int、float等值數(shù)據(jù)類型)和引用傳遞(以字典、列表等非值對象數(shù)據(jù)類型為代表)兩種基本機(jī)制以及方便的關(guān)鍵字傳遞特性(直接使用函數(shù)的形參名指定實參的傳遞目的,如函數(shù)定義為def
f(a,b,c),那么在調(diào)用時可以采用f(b=1,c=2,a=3)的指定形參目的的傳遞方式,而不必拘泥于c語言之類的形參和實參按位置相應(yīng))除此之外,python中還允許包裹方式的參數(shù)傳遞,這未不擬定參數(shù)個數(shù)和參數(shù)類型的函數(shù)調(diào)用提供了基礎(chǔ):def
f(*a,**b)包裹參數(shù)傳遞的實現(xiàn)是在定義函數(shù)時在形參前面加上*或**,*所相應(yīng)的形參(如上面的a)會被解釋為一個元組(tuple,而**所相應(yīng)的形參(如上面的b)會被解釋為一個字典。
10.是否了解*args和**kwargs的用法?當(dāng)函數(shù)的參數(shù)不擬定期,可以使用*args
和**kwargs,*args
沒有key值(列表),**kwargs有key值(字典)。
11.是否了解Python中的單例模式。有哪幾種實現(xiàn)?單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例并且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。假如希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最佳的解決方案。單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創(chuàng)建這個實例;三是它必須自行向整個系統(tǒng)提供這個實例。在Python中,單例模式有以下幾種實現(xiàn)方式。方法一、實現(xiàn)__new__(dá)方法,然后將類的一個實例綁定到類變量_instance上;假如cls._instance為None,則說明該類還沒有被實例化過,new一個該類的實例,并返回;假如cls._instance不為None,直接返回_instance,代碼如下:HYPERLINK""?12345678910111213141516171819class
Singleton(object):
def
__new__(cls,
*args,
**kwargs):
if
not
hasattr(cls,
'_instance'):
orig
=
super(Singleton,
cls)
cls._instance
=
orig.__new__(cls,
*args,
**kwargs)
return
cls._instance
class
MyClass(Singleton):
a
=
1
one
=
MyClass()two
=
MyClass()
#one和two完全相同,可以用id(),
==,
is檢測print
id(one)
#
29097904print
id(two)
#
29097904print
one
==
two
#
Trueprint
one
is
two
#
True方法二、本質(zhì)上是方法一的升級版,使用__metaclass__(元類)的高級python用法,具體代碼如下:HYPERLINK""?12345678910111213141516171819202122class
Singleton2(type):
def
__(dá)init__(cls,
name,
bases,
dict):
super(Singleton2,
cls).__init__(name,
bases,
dict)
cls._instance
=
None
def
__call__(cls,
*args,
**kwargs):
if
cls._instance
is
None:
cls._instance
=
super(Singleton2,
cls).__call__(*args,
**kwargs)
return
cls._instance
class
MyClass2(object):
__(dá)metaclass__
=
Singleton2
a
=
1
one
=
MyClass2()two
=
MyClass2()
print
id(one)
#
31495472print
id(two)
#
31495472print
one
==
two
#
Trueprint
one
is
two
#
True?方法三、使用Python的裝飾器(decorator)實現(xiàn)單例模式,這是一種更Pythonic的方法;單利類自身的代碼不是單例的,通裝飾器使其單例化,代碼如下:HYPERLINK""?12345678910111213141516171819def
singleton(cls,
*args,
**kwargs):
instances
=
{}
def
_singleton():
if
cls
not
in
instances:
instances[cls]
=
cls(*args,
**kwargs)
return
instances[cls]
return
_singleton
@singletonclass
MyClass3(object):
a
=
1
one
=
MyClass3()two
=
MyClass3()
print
id(one)
#
29660784print
id(two)
#
29660784print
one
==
two
#
Trueprint
one
is
two
#
True
12.是否了解Python垃圾回收機(jī)制?HYPERLINK""\o"Python知識庫"Python中的垃圾回收是以引用計數(shù)為主,標(biāo)記-清除和分代收集為輔。引用計數(shù)最大缺陷就是循環(huán)引用的問題,假如一個對象的引用數(shù)為0,Python虛擬機(jī)就會回收這個對象的內(nèi)存。所以Python采用了輔助方法。
13.是否了解read,readline和readlines三者的區(qū)別是什么?read
讀取整個文獻(xiàn)readline
讀取下一行readlines
讀取整個文獻(xiàn)到一個迭代器以供我們遍歷(讀取到一個list中,以供使用,比較方便)14.是否了解Post和Get的區(qū)別是什么?(Http定義了與服務(wù)器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認(rèn)為:一個URL地址,它用于描述一個網(wǎng)絡(luò)上的資源,而HTTP中的GET,POST,PUT,DELETE就相應(yīng)著對這個資源的查,改,增,刪4個操作。)1.根據(jù)HTTP規(guī)范,GET用于信息獲取,并且應(yīng)當(dāng)是安全的和冪等的。(1).所謂安全的意味著該操作用于獲取信息而非修改信息。換句話說,GET
請求一般不應(yīng)產(chǎn)生副作用。就是說,它僅僅是獲取資源信息,就像數(shù)據(jù)庫查詢同樣,不會修改,增長數(shù)據(jù),不會影響資源的狀態(tài)。*
注意:這里安全的含義僅僅是指是非修改信息。(2).冪等的意味著對同一URL的多個請求應(yīng)當(dāng)返回同樣的結(jié)果2.根據(jù)HTTP規(guī)范,POST表達(dá)也許修改變服務(wù)器上的資源的請求。以新聞網(wǎng)站為例,讀者對新聞發(fā)表自己的評論應(yīng)當(dāng)通過POST實現(xiàn),由于在評論提交后站點的資源已經(jīng)不同了,或者說資源被修改了。上面大約說了一下HTTP規(guī)范中GET和POST的一些原理性的問題。但在實際的做的時候,很多人卻沒有按照HTTP規(guī)范去做,導(dǎo)致這個問題的因素有很多,比如說:1.很多人貪方便,更新資源時用了GET,由于用POST必須要到FORM(表單),這樣會麻煩一點。2.對資源的增,刪,改,查操作,其實都可以通過GET/POST完畢,不需要用到PUT和DELETE。3.此外一個是,初期的Web
MVC框架設(shè)計者們并沒有故意識地將URL當(dāng)作抽象的資源來看待和設(shè)計,所以導(dǎo)致一個比較嚴(yán)重的問題是傳統(tǒng)的Web
MVC框架基本上都只支持GET和POST兩種HTTP方法,而不支持PUT和DELETE方法。區(qū)別:(1.GET請求的數(shù)據(jù)會附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中),以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。假如數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,假如是空格,轉(zhuǎn)換為+,假如是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進(jìn)制表達(dá)的ASCII。POST把提交的數(shù)據(jù)則放置在是HTTP包的包體中。2."GET方式提交的數(shù)據(jù)最多只能是1024字節(jié),理論上POST沒有限制,可傳較大量的數(shù)據(jù))以上這句是我從其他文章轉(zhuǎn)過來的,其實這樣說是錯誤的,不準(zhǔn)確的:(1).一方面是"GET方式提交的數(shù)據(jù)最多只能是1024字節(jié)",由于GET是通過URL提交數(shù)據(jù),那么GET可提交的數(shù)據(jù)量就跟URL的長度有直接關(guān)系了。而事實上,URL不存在參數(shù)上限的問題,HTTP協(xié)議規(guī)范沒有對URL長度進(jìn)行限制。這個限制是特定的瀏覽器及服務(wù)器對它的限制。IE對URL長度的限制是2083字節(jié)(2K+35)。對于其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決于操作系統(tǒng)的支持。注意這是限制是整個URL長度,而不僅僅是你的參數(shù)值數(shù)據(jù)長度。[見參考資料5](2).理論上講,POST是沒有大小限制的,HTTP協(xié)議規(guī)范也沒有進(jìn)行大小限制,說“POST數(shù)據(jù)量存在80K/100K的大小限制”是不準(zhǔn)確的,POST數(shù)據(jù)是沒有限制的,起限制作用的是服務(wù)器的解決程序的解決能力。
15.是否了解Cookie和Session的區(qū)別是什么?(1)cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上?(2)cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙,假如重要考慮到安全應(yīng)當(dāng)使用session?(3)session會在一定期間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能,假如重要考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE?(4)單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。
(5)所以:將登陸信息等重要信息存放為SESSION;其他信息假如需要保存,可以放在COOKIE中
1,session
在服務(wù)器端,cookie
在客戶端(瀏覽器)
2,session
默認(rèn)被存在在服務(wù)器的一個文獻(xiàn)里(不是內(nèi)存)?3,session
的運營依賴
session
id,而
session
id
是存在
cookie
中的,也就是說,假如瀏覽器禁用了
cookie
,同時
session
也會失效(但是可以通過其它方式實現(xiàn),比如在
url
中傳遞
session_id)?4,session
可以放在
文獻(xiàn)、數(shù)據(jù)庫、或內(nèi)存中都可以。?5,用戶驗證這種場合一般會用
session
因此,維持一個會話的核心就是客戶端的唯一標(biāo)記,即
session
id
16.是否了解Python2.7.x與Python3.x的重要差異?·
HYPERLINK""使用?__future__?模塊·
HYPERLINK""print?函數(shù)·
HYPERLINK""\l"Integer-division"Integer?division·
HYPERLINK""\l"Unicode"Unicode·
HYPERLINK""\l"xrange"xrange·
HYPERLINK""\l"Raising-exceptions"Raising?exceptions·
HYPERLINK""\l"Handling-exceptions"Handling?exceptions·
HYPERLINK""\l"For-loop-variables-and-the-global-namespace-leak"For?循環(huán)變量和全局命名空間泄漏·
HYPERLINK""\l"Comparing-unorderable-types"比較不可排序類型·
HYPERLINK""\l"Parsing-user-inputs-via-input"通過?input()?解析用戶的輸入·
HYPERLINK""\l"Returning-iterable-objects-instead-of-lists"返回可迭代對象,而不是列表
17.Python的數(shù)據(jù)類型Python提供的基本數(shù)據(jù)類型重要有:布爾類型、整型、浮點型、字符串、列表、元組、集合、字典等等。18.tuple和list的區(qū)別列表里的內(nèi)容是可以改變的,增刪改都可以,tuple則不行不可變的tuple意義就在于由于不可變,所以代碼更安全。假如也許,能用tuple就盡量用tuple。
19.Yield的用法帶有
yield
的函數(shù)在
Python
中被稱之為
generator(生成器)。當(dāng)這個函數(shù)在被調(diào)用的時候,這個函數(shù)在碰到y(tǒng)ield的時候會停止運營,并返回一個迭代器。其具體功能是可以當(dāng)return使用,從函數(shù)里返回一個值,不同之處是用yield返回之后,可以讓函數(shù)從上回yield返回的地點繼續(xù)執(zhí)行。也就是說,yield返回函數(shù),交給調(diào)用者一個返回值,然后再“瞬移”回去,讓函數(shù)繼續(xù)運營,
直到下一跳yield語句再返回一個新的值。
20.If
I
want
to
debug
my
python
scripts,which
module
I
should
import
(C)(假如我想調(diào)試我的python腳本,我應(yīng)當(dāng)導(dǎo)入模塊)
A.
pydebugB.
debugC.
pdbD.
pydb21.Which
one
is
correct
for
the
following
script.
(C)(下列哪一個是對的的腳本)fruitlist
=
[‘a(chǎn)pple’,’mango’,’banana’,’orange’]print
fruitlist[1:3]
A.
[‘a(chǎn)pple’,’mango’,’banana’]
B.
[‘mango’,’banana’,’orange’]
C.
[‘mango’,’banana’]
D.
[‘a(chǎn)pple’,’mango’]22.Which
of
following
options
is
not
python
data
type?
(A)(以下哪個選項不是python
數(shù)據(jù)類型)A.
charB.
int
C.
floatD.
list
23.what
king
of
data
that(yī)
cPickle.dump
store
in
file?
D(cpickle.dump存儲在文獻(xiàn)中的什么樣的數(shù)據(jù))
A.
ObjectB.
StringC.
ArrayD.
All
of
above注:在python中,一般可以使用pickle類來進(jìn)行python對象的序列化,而cPickle提供了一個更快速簡樸的接口,如python文檔所說的:“cPickle
--
A
faster
pickle”。cPickle可以對任意一種類型的python對象進(jìn)行序列化操作,比如list,dict,甚至是一個類的對象等。而所謂的序列化,我的粗淺的理解就是為了可以完整的保存并可以完全可逆的恢復(fù)
24.which
of
following
options
is
python
mutable
data
type?
(D)(下列選項哪一個是python的可變數(shù)據(jù)類型)A.intB.floatC.tupleD.list25.which
of
following
options
is
unable
to
create
dict
?(C)
(以下哪個選項是無法創(chuàng)建dict類型)
A.dict1={}B.dict2={3:3}C.dict3={[1,2,3]:’uestc’}
#TypeError:
unhashable
type:
'list'D.dict4={(1,2,3):’usetc’}26.How
to
interpret
the
following
implementation
of
the
result?(B)(如何解釋以下的實現(xiàn)結(jié)果嗎)>>>print
1.2-1.0
==
0.2>>>FalseA.
The
realization
of
Python
error
#Python的實現(xiàn)錯誤B.
Float
could
not
be
accurately
expressed
#浮點數(shù)不能準(zhǔn)確表達(dá)C.
Boolean
operation
can
not
be
used
for
floating-data
type
compar#布爾運算不能用于浮點數(shù)據(jù)類型進(jìn)行了
D.
Python
will
be
non-zero
number
as
False
#Python將非零數(shù)字是錯誤的27.what
would
the
following
code
yield?
()(下面的代碼會產(chǎn)生什么)>>>word
=
‘a(chǎn)bcdefghij’>>>print
word[:3]
+
word[3:]
abcdefghij28.Create
a
new
list
that
converts
the
following
list(num_string)
of
number
string
to
a
list
of
number?(創(chuàng)建一個新的列表,將列表(num_string)數(shù)的字符串列表的數(shù)字)
Note:Please
use
List
Comprehension
Expression(注意:請使用列表理解表達(dá)式)>>>num_strings
=
[‘1’,’21’,’53’,’84’,’50’,’66’,’7’,’38’,’9’]
New_num
=
[
int(i)
for
i
in
num_strings
]
29.what
will
be
the
output
of
the
following?
(寫出下面的輸出)>>>def
func(x,*y,**z):Print
z>>>func(1,2,3)答:{}
30.How
to
import
method
A
and
B
from
module
M.
(如何從模塊M導(dǎo)入方法A和B)from
M
import
A
,
B
31.How
to
print
“This
program
can
hello
world
on
screen.”(如何打印出
“This
program
can
print
hello
world
on
screen.”)def
printHello():‘’’This
program
can
print
hello
world
on
screen’’’Print
“hello
world”
答:printHello.__doc__(dá)
32.建立一個用于下載文獻(xiàn)的線程池,活動線程數(shù)為5.Download_urls
=
[“”,“”,“”,]
33.有多少種設(shè)計模式,實現(xiàn)其中一個設(shè)計模式?設(shè)計模式
共23種
分三類設(shè)計模式重要分三個類型:創(chuàng)建型、結(jié)構(gòu)型和行為型。其中創(chuàng)建型有:
一、Singleton,單例模式:保證一個類只有一個實例,并提供一個訪問它的全局訪問點
二、Abstract
Factory,抽象工廠:提供一個創(chuàng)建一系列相關(guān)或互相依賴對象的接口,而無須指定它們的具體類。
三、Factory
Method,工廠方法:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類,Factory
Method使一個類的實例化延遲到了子類。
四、Builder,建造模式:將一個復(fù)雜對象的構(gòu)建與他的表達(dá)相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表達(dá)。
五、Prototype,原型模式:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型來創(chuàng)建新的對象。
行為型有:
六、Iterator,迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內(nèi)部表達(dá)。
七、Observer,觀測者模式:定義對象間一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到告知自動更新。
八、Template
Method,模板方法:定義一個操作中的算法的骨架,而將一些環(huán)節(jié)延遲到子類中,TemplateMethod使得子類可以不改變一個算法的結(jié)構(gòu)即可以重定義該算法得某些特定環(huán)節(jié)。
九、Command,命令模式:將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進(jìn)行參數(shù)化,對請求排隊和記錄請求日記,以及支持可撤消的操作。
十、State,狀態(tài)模式:允許對象在其內(nèi)部狀態(tài)改變時改變他的行為。對象看起來似乎改變了他的類。
十一、Strat(yī)egy,策略模式:定義一系列的算法,把他們一個個封裝起來,并使他們可以互相替換,本模式使得算法可以獨立于使用它們的客戶。
十二、China
of
Responsibility,職責(zé)鏈模式:使多個對象都有機(jī)會解決請求,從而避免請求的送發(fā)者和接受者之間的耦合關(guān)系
十三、Mediator,中介者模式:用一個中介對象封裝一些列的對象交互。
十四、Visitor,訪問者模式:表達(dá)一個作用于某對象結(jié)構(gòu)中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個元素的新操作。
十五、Interpreter,解釋器模式:給定一個語言,定義他的文法的一個表達(dá),并定義一個解釋器,這個解釋器使用該表達(dá)來解釋語言中的句子。
十六、Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。
結(jié)構(gòu)型有:
十七、Composite,組合模式:將對象組合成樹形結(jié)構(gòu)以表達(dá)部分整體的關(guān)系,Composite使得用戶對單個對象和組合對象的使用品有一致性。
十八、Facade,外觀模式:為子系統(tǒng)中的一組接口提供一致的界面,fa?ade提供了一高層接口,這個接口使得子系統(tǒng)更容易使用。
十九、Proxy,代理模式:為其他對象提供一種代理以控制對這個對象的訪問
二十、Adapter,適配器模式:將一類的接口轉(zhuǎn)換成客戶希望的此外一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作。
二十一、Decrat(yī)or,裝飾模式:動態(tài)地給一個對象增長一些額外的職責(zé),就增長的功能來說,Decorator模式相比生成子類更加靈活。
二十二、Bridge,橋模式:將抽象部分與它的實現(xiàn)部分相分離,使他們可以獨立的變化。
二十三、Flyweight,享元模式:使用共享物件,用來盡也許減少內(nèi)存使用量以及分享資訊給盡也許多的相似物件;它適合用于當(dāng)大量物件只是反復(fù)因而導(dǎo)致無法令人接受的使用大量內(nèi)存。通常物件中的部分狀態(tài)是可以分享。常見做法是把它們放在外部數(shù)據(jù)結(jié)構(gòu),當(dāng)需要使用時再將它們傳遞給享元。代理模式,Python實現(xiàn):class
Interface
:
def
Request(self):
return
0class
RealSubject(Interface):
def
Request(self):
print
"Real
request."class
Proxy(Interface):
def
Request(self):
self.real
=
RealSubject()
self.real.Request()if
__name__
==
"__(dá)main__":
p
=
Proxy()
p.Request()
34.用匿名函數(shù)寫一個功能?·
print
(lambda
x:x*x)(4)
35.爬取淘寶的流程36.MySQL和mongodb的區(qū)別mongodb與mysql命令對比
傳統(tǒng)的關(guān)系數(shù)據(jù)庫一般由數(shù)據(jù)庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由數(shù)據(jù)庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對于關(guān)系型數(shù)據(jù)庫里的表,但是集合中沒有列、行和關(guān)系概念,這體現(xiàn)了模式自由的特點。
37.分析日記的過程先考慮最簡樸的情況,在數(shù)據(jù)規(guī)模比較小的時候,也許是幾十MB、幾百MB或者幾十GB,總之就是在單機(jī)解決尚能忍受的時候。一切都很好辦,現(xiàn)成的各種Unix/Linux工具——awk、grep、sort、join等都是日記分析的利器,假如僅僅是想知道某個頁面的PV,一個wc+grep就能搞定。假如有稍復(fù)雜的邏輯,那就使用Python,配合正則表達(dá)式,基本就可以解決所有的問題。
38.爬蟲的重要模塊urllib
urllib2
BeautifulSoup
requests
scrapy39.如何驗證URL是否存在
URL不存在,也許時兩種情況網(wǎng)頁在服務(wù)器上不存在服務(wù)器不存在第一種異常發(fā)生時,爬蟲程序(urllib模塊)會返回HTTP錯誤,urlopen函數(shù)會拋出”HTTPError”異常使用異常解決try:Html
=urlopen(URL)
except
HTTPError
as
e:print(e)第二中情況urlopen會返回一個None對象,可以增長一個判斷語句檢測返回的html是不是NoneIf
html
is
None:print(“URL
is
not
Found”)else:#程序繼續(xù)40.什么是進(jìn)程池和線程池
這兩個問題有一定的相似度,在面向?qū)ο蟪绦蚓幊讨?對象的創(chuàng)建與析構(gòu)都是一個較為復(fù)雜的過程,較費時間,所認(rèn)為了提高程序的運營效率盡也許減少創(chuàng)建和銷毀對象的次數(shù),特別是一些很耗資源的對象創(chuàng)建和銷毀。所以我們可以創(chuàng)建一個進(jìn)程池(線程池),預(yù)先放一些進(jìn)程(線程)進(jìn)去,要用的時候就直接調(diào)用,用完之后再把進(jìn)程歸還給進(jìn)程池,省下創(chuàng)建刪除進(jìn)程的時間,但是當(dāng)然就需要額外的開銷了?
運用線程池與進(jìn)程池可以是管理進(jìn)程與線程的工作交給系統(tǒng)管理,不需要程序員對立面的線程、進(jìn)程進(jìn)行管理
41.解釋負(fù)載均衡和集群網(wǎng)絡(luò)的負(fù)載均衡是一種動態(tài)均衡技術(shù),常見的實現(xiàn)方式是通過一些工具實時地分析數(shù)據(jù)包,掌握網(wǎng)絡(luò)中的數(shù)據(jù)流量狀況,把任務(wù)合理均衡地分派出去。這種技術(shù)基于現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu),提供了一種擴(kuò)展服務(wù)器帶寬和增長服務(wù)器吞吐量的便宜有效的方法,加強(qiáng)了網(wǎng)絡(luò)數(shù)據(jù)解決能力,提高了網(wǎng)絡(luò)的靈活性和可用性。平常生活中到處都能看到“負(fù)載均衡”,一個超市的收營員高峰期只能服務(wù)10位顧客,當(dāng)做活動時有20位顧客需要服務(wù)的話也許就會排長隊,這樣購物體驗將會很差(就像客戶抱怨系統(tǒng)/網(wǎng)站訪問太慢)。最簡樸的辦法就是再招個營業(yè)員,重新開通一個出口。負(fù)載均衡的核心就是“分?jǐn)倝毫Α薄?/p>
所謂集群是指一組獨立的計算機(jī)系統(tǒng)構(gòu)成的一個松耦合的多解決器系統(tǒng),它們之間通過網(wǎng)絡(luò)實現(xiàn)進(jìn)程間的通信。應(yīng)用程序可以通過網(wǎng)絡(luò)共享內(nèi)存進(jìn)行消息傳送,實現(xiàn)分布式計算機(jī)。通俗一點來說,就是讓若干臺計算機(jī)聯(lián)合起來工作(服務(wù)),可以是并行的,也可以是做備份。1、以下print將輸出什么,為什么a=1deffun(a):
a=2fun(a)printaa=[]deffun(a):
a.a(chǎn)ppend(1)fun(a)printa對象有兩種,“可更改”(mutable)與“不可更改”(immutable)對象。在python中,strings,tuples,和numbers是不可更改的對象,而list,dict等則是可以修改的對象。第一個例子里函數(shù)把引用指向了一個不可變對象,當(dāng)函數(shù)返回的時候,外面的引用沒半毛感覺.而第二個例子就不同樣了,函數(shù)內(nèi)的引用指向的是可變對象,對它的操作就和定位了指針地址同樣,在內(nèi)存里進(jìn)行修改.2、Python中單下劃線和雙下劃線分別代表什么__init__(dá):一種約定,Python內(nèi)部的名字,用來區(qū)別其他用戶自定義的命名,以防沖突._foo:一種約定,用來指定變量私有.程序員用來指定私有變量的一種方式.__foo:這個有真正的意義:解析器用_classname__foo來代替這個名字,以區(qū)別和其他類相同的命名3、什么是閉包當(dāng)一個內(nèi)嵌函數(shù)引用其外部作作用域的變量,我們就會得到一個閉包.總結(jié)一下,創(chuàng)建一個閉包必須滿足以下幾點:必須有一個內(nèi)嵌函數(shù)內(nèi)嵌函數(shù)必須引用外部函數(shù)中的變量外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)4、自己寫一個閉包的實例deflazy_sum(*args):
defsum():
ax=0
forninargs:
ax=ax+n
returnax
returnsum5、三次握手客戶端通過向服務(wù)器端發(fā)送一個SYN來創(chuàng)建一個積極打開,作為三次握手的一部分??蛻舳税堰@段連接的序號設(shè)定為隨機(jī)數(shù)A。服務(wù)器端應(yīng)當(dāng)為一個合法的SYN回送一個SYN/ACK。ACK的確認(rèn)碼應(yīng)為A+1,SYN/ACK包自身又有一個隨機(jī)序號B。最后,客戶端再發(fā)送一個ACK。當(dāng)服務(wù)端受到這個ACK的時候,就完畢了三路握手,并進(jìn)入了連接創(chuàng)建狀態(tài)。此時包序號被設(shè)定為收到的確認(rèn)號A+1,而響應(yīng)則為B+1。6、classPerson:
name="aaa"p1=Person()p2=Person()p1.name="bbb"printp1.nameprintp2.nameprintPerson.name="bbb"是實例調(diào)用了類變量,這其實和上面第一個問題同樣,就是函數(shù)傳參的問題,p1.name一開始是指向的類變量name="aaa",但是在實例的作用域里把類變量的引用改變了,就變成了一個實例變量,self.name不再引用Person的類變量name了.7、GIL線程全局鎖線程全局鎖(GlobalInterpreterLock),即Python為了保證線程安全而采用的獨立線程運營的限制,說白了就是一個核只能在同一時間運營一個線程.8、運用filter過濾出列表中大于5的數(shù)字a=[1,2,3,4,5,6,7]b=filter(lambdax:x>5,a)9、運用map讓列表每項都乘以2a=map(lambdax:x*2,[1,2,3])10、MyISAM和InnoDBMyISAM適合于一些需要大量查詢的應(yīng)用,但其對于有大量寫操作并不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進(jìn)程,就算是讀進(jìn)程都無法操作直到讀操作完畢。此外,MyISAM對于SELECTCOUNT(*)這類的計算是超快無比的。InnoDB的趨勢會是一個非常復(fù)雜的存儲引擎,對于一些小的應(yīng)用,它會比MyISAM還慢。他是它支持“行鎖”,于是在寫操作比較多的時候,會更優(yōu)秀。并且,他還支持更多的高級應(yīng)用,比如:事務(wù)。1.現(xiàn)在有一個dict對象adict,里面包含了一百萬個元素,查找其中的某個元素的平均需要多少次比較?一千萬個元素呢?2.下述兩個對象有何區(qū)別?a=‘你好’a=u‘你好’3.在python2中,dict對象的items()方法和iteritems()方法有什么區(qū)別?4.分析下述代碼的輸出:deffoo(count):
a,b=0,1
whilea<count:
yielda
a,b=b,a+bforiinfoo(10):
printi5.分析下述代碼的輸出:defchange_int(a):
a=10defchange_list(a):
a[0]=10m=2n=[2]change_int(m)change_list(n)6.分析下述代碼的輸出:importres='<html><head><title>Title</title></head></html>'printre.match('<.*>',s).group()printre.match('<.*?>',s).group()7.嘗試寫一段代碼,逐行讀入一個文本文獻(xiàn)(ASCII文獻(xiàn),不必考慮代碼),并在屏幕上打印出來:defprint_file(file_name):8.嘗試寫一段代碼,爬取HTTP協(xié)議的網(wǎng)站,獲取HTTP狀態(tài)碼,HTTP消息頭和網(wǎng)頁內(nèi)容:(使用熟悉的網(wǎng)絡(luò)模塊)importdefcrawl_webpage(url=""):9.嘗試寫一段代碼,從list對象中刪除反復(fù)的項,如輸入[1,2,3,3,4,2,3,4,5,6,1],則輸出為[1,2,3,4,5,6],不必保持順序。盡量使用標(biāo)準(zhǔn)庫和內(nèi)鍵類型以簡化代碼。ids=[1,2,3,3,4,2,3,4,5,6,1]news_ids=[]foridinids:
ifidnotinnews_ids:
news_ids.append(id)printnews_idsids=[1,4,3,3,4,2,3,4,5,6,1]ids=list(set(ids))GIL線程全局鎖線程全局鎖(GlobalInterpreterLock),即Python為了保證線程安全而采用的獨立線程運營的限制,說白了就是一個核只能在同一時間運營一個線程.協(xié)程簡樸點說協(xié)程是進(jìn)程和線程的升級版,進(jìn)程和線程都面臨著內(nèi)核態(tài)和用戶態(tài)的切換問題而花費許多切換時間,而協(xié)程就是用戶自己控制切換的時機(jī),不再需要陷入系統(tǒng)的內(nèi)核態(tài).Python里最常見的yield就是協(xié)程的思想!閉包閉包(closure)是函數(shù)式編程的重要的語法結(jié)構(gòu)。閉包也是一種組織代碼的結(jié)構(gòu),它同樣提高了代碼的可反復(fù)使用性。當(dāng)一個內(nèi)嵌函數(shù)引用其外部作作用域的變量,我們就會得到一個閉包.總結(jié)一下,創(chuàng)建一個閉包必須滿足以下幾點:必須有一個內(nèi)嵌函數(shù)內(nèi)嵌函數(shù)必須引用外部函數(shù)中的變量外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)感覺閉包還是有難度的,幾句話是說不明白的,還是查查相關(guān)資料.重點是函數(shù)運營后并不會被撤消,就像16題的instance字典同樣,當(dāng)函數(shù)運營完后,instance并不被銷毀,而是繼續(xù)留在內(nèi)存空間里.這個功能類似類里的類變量,只但是遷移到了函數(shù)上.閉包就像個空心球同樣,你知道外面和里面,但你不知道中間是什么樣.python中函數(shù)式編程支持:filter函數(shù)的功能相稱于過濾器。調(diào)用一個布爾函數(shù)bool_func來迭代遍歷每個seq中的元素;返回一個使bool_seq返回值為true的元素的序列。>>>a=[1,2,3,4,5,6,7]>>>b=filter(lambdax:x>5,a)>>>printb>>>[6,7]map函數(shù)是對一個序列的每個項依次執(zhí)行函數(shù),下面是對一個序列每個項都乘以2:>>>a=map(lambdax:x*2,[1,2,3])>>>list(a)[2,4,6]reduce函數(shù)是對一個序列的每個項迭代調(diào)用函數(shù),下面是求3的階乘:>>>reduce(lambdax,y:x*y,range(1,4))6Python里的拷貝引用和copy(),deepcopy()的區(qū)別importcopya=[1,2,3,4,['a','b']]
#原始對象b=a
#賦值,傳對象的引用c=copy.copy(a)
#對象拷貝,淺拷貝d=copy.deepcopy(a)
#對象拷貝,深拷貝a.append(5)
#修改對象aa[4].a(chǎn)ppend('c')
#修改對象a中的['a','b']數(shù)組對象print'a=',aprint'b=',bprint'c=',cprint'd=',d輸出結(jié)果:a=
[1,2,3,4,['a','b','c'],5]b=
[1,2,3,4,['a','b','c'],5]c=
[1,2,3,4,['a','b','c']]d=
[1,2,3,4,['a','b']]Python垃圾回收機(jī)制PythonGC重要使用引用計數(shù)(referencecounting)來跟蹤和回收垃圾。在引用計數(shù)的基礎(chǔ)上,通過“標(biāo)記-清除”(markandsweep)解決容器對象也許產(chǎn)生的循環(huán)引用問題,通過“分代回收”(generationcollection)以空間換時間的方法提高垃圾回收效率。1引用計數(shù)PyObject是每個對象必有的內(nèi)容,其中ob_refcnt就是做為引用計數(shù)。當(dāng)一個對象有新的引用時,它的ob_refcnt就會增長,當(dāng)引用它的對象被刪除,它的ob_refcnt就會減少.引用計數(shù)為0時,該對象生命就結(jié)束了。優(yōu)點:簡樸實時性缺陷:維護(hù)引用計數(shù)消耗資源循環(huán)引用
標(biāo)記-清除機(jī)制基本思緒是先按需分派,等到?jīng)]有空閑內(nèi)存的時候從寄存器和程序棧上的引用出發(fā),遍歷以對象為節(jié)點、以引用為邊構(gòu)成的圖,把所有可以訪問到的對象打上標(biāo)記,然后清掃一遍內(nèi)存空間,把所有沒標(biāo)記的對象釋放。分代技術(shù)分代回收的整體思想是:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時間劃分為不同的集合,每個集合就成為一個“代”,垃圾收集頻率隨著“代”的存活時間的增大而減小,存活時間通常運用通過幾次垃圾回收來度量。Python默認(rèn)定義了三代對象集合,索引數(shù)越大,對象存活時間越長。舉例:當(dāng)某些內(nèi)存塊M通過了3次垃圾收集的清洗之后還存活時,我們就將內(nèi)存塊M劃到一個集合A中去,而新分派的內(nèi)存都劃分到集合B中去。當(dāng)垃圾收集開始工作時,大多數(shù)情況都只對集合B進(jìn)行垃圾回收,而對集合A進(jìn)行垃圾回收要隔相稱長一段時間后才進(jìn)行,這就使得垃圾收集機(jī)制需要解決的內(nèi)存少了,效率自然就提高了。在這個過程中,集合B中的某些內(nèi)存塊由于存活時間長而會被轉(zhuǎn)移到集合A中,當(dāng)然,集合A中事實上也存在一些垃圾,這些垃圾的回收會由于這種分代的機(jī)制而被延遲。Python的isis是對比地址,==是對比值HTTP和HTTPS狀態(tài)碼定義1xx報告接受到請求,繼續(xù)進(jìn)程2xx成功環(huán)節(jié)成功接受,被理解,并被接受3xx重定向為了完畢請求,必須采用進(jìn)一步措施4xx客戶端犯錯請求涉及錯的順序或不能完畢5xx服務(wù)器犯錯服務(wù)器無法完畢顯然有效的請求403:Forbidden404:NotFoundAjaxAJAX,AsynchronousJavaScriptandXML(異步的JavaScript和XML),是與在不重新加載整個頁面的情況下,與服務(wù)器互換數(shù)據(jù)并更新部分網(wǎng)頁的技術(shù)去除列表中的反復(fù)元素用集合list(set(l))用字典l1=['b','c','d','b','c','a','a']l2={}.fromkeys(l1).keys()printl2用字典并保持順序l1=['b','c','d','b','c','a','a']l2=list(set(l1))l2.sort(key=l1.index)printl2列表推導(dǎo)式l1=['b','c','d','b','c','a','a']l2=[][l2.append(i)foriinl1ifnotiinl2]Linux
Shell
筆試題1.How
to
enable
debug
mode
in
shell
scripts?
(B)(如何在shell腳本中啟用調(diào)試模式
)A.
set
+
xB.
set
-
xC.
set
debugD.
set
--
注:set
-x與set
+x指令用于腳本調(diào)試。set是把它下面的命令打印到屏幕set
-x
是啟動
set
+x是關(guān)閉
set
-o是查看
(xtrace),set去追中一段代碼的顯示情況。執(zhí)行set
-x后,對整個腳本有效。
2.Display
all
lines
that
begin
with
the
letter
“A”
from
a
file
(B)(顯示所有行開頭字母“A”從一個文獻(xiàn)中)A.
Is
A*B.
Cat
file|grep
^AC.
Cat
file|grep
A$D.
More
|grep
A*
3.What
does
this
sign
mean
in
the
Shell
script
“$#”(B)(這個標(biāo)志是什么意思在Shell腳本”$#)($#添加到Shell的參數(shù)個數(shù))
A.
The
return
value
of
last
command
#最后一個命令的返回值B.
The
number
of
script
arguments#腳本參數(shù)的個數(shù)C.
All
of
the
arguments
values
#所有參數(shù)值D.
The
script
itself#腳本自身
4.Which
does
console
get
after
run
following
script
command
:(B)(控制臺獲取在運營以下腳本命令后)echo
-n
Red
&&
echo
-n
Go
||
echo
-n
Hat(yī)A.
RedHatB.
RedGoC.
RedHatGoD.
GoHat
5.Which
of
the
following
stat(yī)ements
assign
the
name
of
the
current
director
溫馨提示
- 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ù)學(xué)《幫瓢蟲找家》教案
- 礦山隧道堵漏施工方案
- 發(fā)展鄉(xiāng)村特色產(chǎn)業(yè)助推新型農(nóng)村集體經(jīng)濟(jì)的價值及舉措論述
- 優(yōu)化勞動用工制度的策略及實施路徑
- 食品加工企業(yè)物流運輸與配送安全fa
- 低空經(jīng)濟(jì)公司未來發(fā)展戰(zhàn)略
- 基于問題導(dǎo)向的高中物理教學(xué)策略研究
- 中外名建筑賞析知到課后答案智慧樹章節(jié)測試答案2025年春濰坊工程職業(yè)學(xué)院
- 河北省石家莊高三第二次教學(xué)質(zhì)量檢測文綜政治試題
- 人教版新起點(一年級起)二年級英語下冊教案全冊
- 寵物醫(yī)院血常規(guī)檢驗報告單
- 學(xué)校教職工代表大會代表選舉辦法
- 中國慢性鼻竇炎診斷和治療指南課件
- 古老的聲音第1學(xué)時課件-2023-2024學(xué)年高中音樂粵教花城版(2019)必修音樂鑒賞
- 雙控監(jiān)理細(xì)則
- 水上拋石專項方案
- 你進(jìn)步-我高興
- 勞務(wù)派遣具體服務(wù)方案
- 數(shù)據(jù)生命周期管理詳述
- 物理化學(xué)(下)智慧樹知到課后章節(jié)答案2023年下陜西師范大學(xué)
評論
0/150
提交評論