2023年Python面試題總結_第1頁
2023年Python面試題總結_第2頁
2023年Python面試題總結_第3頁
2023年Python面試題總結_第4頁
2023年Python面試題總結_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1.Python

線程池原理?

我理解為線程池是一個存放很多線程的單位,同時尚有一個相應的任務隊列。整個執(zhí)行過程其實就是使用線程池中已有有限的線程把任務隊列中的任務做完。這樣做的好處就是你不需要為每個任務都創(chuàng)建一個線程,由于當你創(chuàng)建第100個線程來執(zhí)行第100個任務的時候,也許前面已有50個線

程結束工作了。超過最大值的線程可以排隊,但他們要等到其他線程完畢后才啟動。因此反復運用線程來執(zhí)行任務,減少系統(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""用戶接口)是指采用圖形方式顯示的計算機操作用戶HYPERLINK""界面。

GPL(HYPERLINK""GNU通用公共許可證)GPL同其它的自由軟件許可證同樣,許可社會公眾享有:運營、復制軟件的自由,發(fā)行傳播軟件的自由,獲得軟件源碼的自由,改善軟件并將自己作出的改善版本向社會發(fā)行傳播的自由。

4.簡述爬蟲的基本環(huán)節(jié)和流程?

網絡爬蟲的基本工作流程如下:

1.一方面選取一部分精心挑選的URL;

2.將這些URL放入待抓取URL隊列;

3.從待抓取URL隊列中取出待抓取在URL,(解析DNS,并且得到主機的ip,)并將URL相應的網頁下載下來,存儲進已下載網頁庫中。此外,將這些URL放進已抓取URL隊列。4.分析已抓?。誖L隊列中的URL和其中的有價值的數據,將新的URL,放入待抓取URL隊列,將數據存儲起來,從而進入下一個循環(huán)。

5.你們公司的業(yè)務中,并發(fā)能達成多少?

6.如何循環(huán)抓取一個網站的1000張圖片?流程大約是這樣?找到所有頁數

----遍歷所有的頁數?----遍歷當前頁的所有相冊(給每個相冊建立一個目錄)

遍歷當前相冊的所有圖片(遍歷此相冊的所有頁(遍歷當前頁的所有照片并找到圖片的url))

----獲得圖片url就存起來,然后通過圖片url下載圖片。-引用計數當圖片下載量達成1000張時,停止爬取。

7.假如對方網站可以反爬取,封ip怎么辦?1、放慢抓取速度,減小對于目的網站導致的壓力。但是這樣會減少單位時間類的抓取量。?2、第二種方法是通過設立代理IP等手段,突破反爬蟲機制繼續(xù)高頻率抓取。但是這樣需要多個穩(wěn)定的代理IP。代理IP可以搜索到免費的,但是也許不太穩(wěn)定,也有收費的,但是不一定劃算,也也許不是長期之計。

普通的基于ADSL撥號的解決辦法

通常,在抓取過程中碰到嚴禁訪問,可以重新進行ADSL撥號,獲取新的IP,從而可以繼續(xù)抓取。但是這樣在多網站多線程抓取的時候,假如某一個網站的抓取被嚴禁了,?同時也影響到了其他網站的抓取,整體來說也會減少抓取速度。

一種也許的解決辦法

同樣也是基于ADSL撥號,不同的是,需要兩臺可以進行ADSL撥號的服務器,抓取過程中使用這兩臺服務器作為代理。

假設有A、B兩臺可以進行ADSL撥號的服務器。爬蟲程序在C服務器上運營,使用A作為代理訪問外網,假如在抓取過程中碰到嚴禁訪問的情況,立即將代理切換為B,然后將A進行重新撥號。假如再碰到嚴禁訪問就切換為A做代理,B再撥號,如此反復。如下圖:使用A為代理,B撥號:8.簡述

移動端app

數據的抓取流程1、例如:爬取手機淘寶,核心還是一個WEB頁面:HYPERLINK"//link.zhih/?target="

2、有很多資訊類的APP,核心都是一個WEB頁面。直接用爬蟲的方法抓就可以了。

3、非WEB頁面的APP,用APP自動化的一些東西試試4、不然就只有抓包了。

9.是否了解Python的函數參數傳遞的機制?python的參數傳遞機制具有值傳遞(int、float等值數據類型)和引用傳遞(以字典、列表等非值對象數據類型為代表)兩種基本機制以及方便的關鍵字傳遞特性(直接使用函數的形參名指定實參的傳遞目的,如函數定義為def

f(a,b,c),那么在調用時可以采用f(b=1,c=2,a=3)的指定形參目的的傳遞方式,而不必拘泥于c語言之類的形參和實參按位置相應)除此之外,python中還允許包裹方式的參數傳遞,這未不擬定參數個數和參數類型的函數調用提供了基礎:def

f(*a,**b)包裹參數傳遞的實現是在定義函數時在形參前面加上*或**,*所相應的形參(如上面的a)會被解釋為一個元組(tuple,而**所相應的形參(如上面的b)會被解釋為一個字典。

10.是否了解*args和**kwargs的用法?當函數的參數不擬定期,可以使用*args

和**kwargs,*args

沒有key值(列表),**kwargs有key值(字典)。

11.是否了解Python中的單例模式。有哪幾種實現?單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例并且該實例易于外界訪問,從而方便對實例個數的控制并節(jié)約系統(tǒng)資源。假如希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最佳的解決方案。單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創(chuàng)建這個實例;三是它必須自行向整個系統(tǒng)提供這個實例。在Python中,單例模式有以下幾種實現方式。方法一、實現__new__方法,然后將類的一個實例綁定到類變量_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方法二、本質上是方法一的升級版,使用__metaclass__(元類)的高級python用法,具體代碼如下:HYPERLINK""?12345678910111213141516171819202122class

Singleton2(type):

def

__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):

__metaclass__

Singleton2

a

=

1

one

MyClass2()two

=

MyClass2()

print

id(one)

#

31495472print

id(two)

#

31495472print

one

==

two

#

Trueprint

one

is

two

True?方法三、使用Python的裝飾器(decorator)實現單例模式,這是一種更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

=

one

=

MyClass3()two

=

MyClass3()

print

id(one)

#

29660784print

id(two)

#

29660784print

one

==

two

#

Trueprint

one

is

two

True

12.是否了解Python垃圾回收機制?HYPERLINK""\o"Python知識庫"Python中的垃圾回收是以引用計數為主,標記-清除和分代收集為輔。引用計數最大缺陷就是循環(huán)引用的問題,假如一個對象的引用數為0,Python虛擬機就會回收這個對象的內存。所以Python采用了輔助方法。

13.是否了解read,readline和readlines三者的區(qū)別是什么?read

讀取整個文獻readline

讀取下一行readlines

讀取整個文獻到一個迭代器以供我們遍歷(讀取到一個list中,以供使用,比較方便)14.是否了解Post和Get的區(qū)別是什么?(Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用于描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就相應著對這個資源的查,改,增,刪4個操作。)1.根據HTTP規(guī)范,GET用于信息獲取,并且應當是安全的和冪等的。(1).所謂安全的意味著該操作用于獲取信息而非修改信息。換句話說,GET

請求一般不應產生副作用。就是說,它僅僅是獲取資源信息,就像數據庫查詢同樣,不會修改,增長數據,不會影響資源的狀態(tài)。*

注意:這里安全的含義僅僅是指是非修改信息。(2).冪等的意味著對同一URL的多個請求應當返回同樣的結果2.根據HTTP規(guī)范,POST表達也許修改變服務器上的資源的請求。以新聞網站為例,讀者對新聞發(fā)表自己的評論應當通過POST實現,由于在評論提交后站點的資源已經不同了,或者說資源被修改了。上面大約說了一下HTTP規(guī)范中GET和POST的一些原理性的問題。但在實際的做的時候,很多人卻沒有按照HTTP規(guī)范去做,導致這個問題的因素有很多,比如說:1.很多人貪方便,更新資源時用了GET,由于用POST必須要到FORM(表單),這樣會麻煩一點。2.對資源的增,刪,改,查操作,其實都可以通過GET/POST完畢,不需要用到PUT和DELETE。3.此外一個是,初期的Web

MVC框架設計者們并沒有故意識地將URL當作抽象的資源來看待和設計,所以導致一個比較嚴重的問題是傳統(tǒng)的Web

MVC框架基本上都只支持GET和POST兩種HTTP方法,而不支持PUT和DELETE方法。區(qū)別:(1.GET請求的數據會附在URL之后(就是把數據放置在HTTP協(xié)議頭中),以?分割URL和傳輸數據,參數之間以&相連,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。假如數據是英文字母/數字,原樣發(fā)送,假如是空格,轉換為+,假如是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表達的ASCII。POST把提交的數據則放置在是HTTP包的包體中。2."GET方式提交的數據最多只能是1024字節(jié),理論上POST沒有限制,可傳較大量的數據)以上這句是我從其他文章轉過來的,其實這樣說是錯誤的,不準確的:(1).一方面是"GET方式提交的數據最多只能是1024字節(jié)",由于GET是通過URL提交數據,那么GET可提交的數據量就跟URL的長度有直接關系了。而事實上,URL不存在參數上限的問題,HTTP協(xié)議規(guī)范沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。IE對URL長度的限制是2083字節(jié)(2K+35)。對于其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決于操作系統(tǒng)的支持。注意這是限制是整個URL長度,而不僅僅是你的參數值數據長度。[見參考資料5](2).理論上講,POST是沒有大小限制的,HTTP協(xié)議規(guī)范也沒有進行大小限制,說“POST數據量存在80K/100K的大小限制”是不準確的,POST數據是沒有限制的,起限制作用的是服務器的解決程序的解決能力。

15.是否了解Cookie和Session的區(qū)別是什么?(1)cookie數據存放在客戶的瀏覽器上,session數據放在服務器上?(2)cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙,假如重要考慮到安全應當使用session?(3)session會在一定期間內保存在服務器上。當訪問增多,會比較占用你服務器的性能,假如重要考慮到減輕服務器性能方面,應當使用COOKIE?(4)單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。

(5)所以:將登陸信息等重要信息存放為SESSION;其他信息假如需要保存,可以放在COOKIE中

1,session

在服務器端,cookie

在客戶端(瀏覽器)

2,session

默認被存在在服務器的一個文獻里(不是內存)?3,session

的運營依賴

session

id,而

session

id

是存在

cookie

中的,也就是說,假如瀏覽器禁用了

cookie

,同時

session

也會失效(但是可以通過其它方式實現,比如在

url

中傳遞

session_id)?4,session

可以放在

文獻、數據庫、或內存中都可以。?5,用戶驗證這種場合一般會用

session

因此,維持一個會話的核心就是客戶端的唯一標記,即

session

id

16.是否了解Python2.7.x與Python3.x的重要差異?·

HYPERLINK""使用?__future__?模塊·

HYPERLINK""print?函數·

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的數據類型Python提供的基本數據類型重要有:布爾類型、整型、浮點型、字符串、列表、元組、集合、字典等等。18.tuple和list的區(qū)別列表里的內容是可以改變的,增刪改都可以,tuple則不行不可變的tuple意義就在于由于不可變,所以代碼更安全。假如也許,能用tuple就盡量用tuple。

19.Yield的用法帶有

yield

的函數在

Python

中被稱之為

generator(生成器)。當這個函數在被調用的時候,這個函數在碰到y(tǒng)ield的時候會停止運營,并返回一個迭代器。其具體功能是可以當return使用,從函數里返回一個值,不同之處是用yield返回之后,可以讓函數從上回yield返回的地點繼續(xù)執(zhí)行。也就是說,yield返回函數,交給調用者一個返回值,然后再“瞬移”回去,讓函數繼續(xù)運營,

直到下一跳yield語句再返回一個新的值。

20.If

I

want

to

debug

my

python

scripts,which

module

should

import

(C)(假如我想調試我的python腳本,我應當導入模塊)

A.

pydebugB.

debugC.

pdbD.

pydb21.Which

one

is

correct

for

the

following

script.

(C)(下列哪一個是對的的腳本)fruitlist

=

[‘apple’,’mango’,’banana’,’orange’]print

fruitlist[1:3]

A.

[‘apple’,’mango’,’banana’]

B.

[‘mango’,’banana’,’orange’]

C.

[‘mango’,’banana’]

D.

[‘apple’,’mango’]22.Which

of

following

options

is

not

python

data

type?

(A)(以下哪個選項不是python

數據類型)A.

charB.

int

C.

floatD.

list

23.what

king

of

data

that(yī)

cPickle.dump

store

in

file?

D(cpickle.dump存儲在文獻中的什么樣的數據)

A.

ObjectB.

StringC.

ArrayD.

All

of

above注:在python中,一般可以使用pickle類來進行python對象的序列化,而cPickle提供了一個更快速簡樸的接口,如python文檔所說的:“cPickle

--

A

faster

pickle”。cPickle可以對任意一種類型的python對象進行序列化操作,比如list,dict,甚至是一個類的對象等。而所謂的序列化,我的粗淺的理解就是為了可以完整的保存并可以完全可逆的恢復

24.which

of

following

options

is

python

mutable

data

type?

(D)(下列選項哪一個是python的可變數據類型)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)(如何解釋以下的實現結果嗎)>>>print

1.2-1.0

==

0.2>>>FalseA.

The

realization

of

Python

error

#Python的實現錯誤B.

Float

could

not

be

accurately

expressed

#浮點數不能準確表達C.

Boolean

operation

can

not

be

used

for

floating-data

type

compar#布爾運算不能用于浮點數據類型進行了

D.

Python

will

be

non-zero

number

as

False

#Python將非零數字是錯誤的27.what

would

the

following

code

yield?

()(下面的代碼會產生什么)>>>word

‘abcdefghij’>>>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)數的字符串列表的數字)

Note:Please

use

List

Comprehension

Expression(注意:請使用列表理解表達式)>>>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導入方法A和B)from

M

import

,

B

31.How

to

print

“This

program

can

print

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__

32.建立一個用于下載文獻的線程池,活動線程數為5.Download_urls

[“”,“”,“”,]

33.有多少種設計模式,實現其中一個設計模式?設計模式

共23種

分三類設計模式重要分三個類型:創(chuàng)建型、結構型和行為型。其中創(chuàng)建型有:

一、Singleton,單例模式:保證一個類只有一個實例,并提供一個訪問它的全局訪問點

二、Abstract

Factory,抽象工廠:提供一個創(chuàng)建一系列相關或互相依賴對象的接口,而無須指定它們的具體類。

三、Factory

Method,工廠方法:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類,Factory

Method使一個類的實例化延遲到了子類。

四、Builder,建造模式:將一個復雜對象的構建與他的表達相分離,使得同樣的構建過程可以創(chuàng)建不同的表達。

五、Prototype,原型模式:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型來創(chuàng)建新的對象。

行為型有:

六、Iterator,迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內部表達。

七、Observer,觀測者模式:定義對象間一對多的依賴關系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到告知自動更新。

八、Template

Method,模板方法:定義一個操作中的算法的骨架,而將一些環(huán)節(jié)延遲到子類中,TemplateMethod使得子類可以不改變一個算法的結構即可以重定義該算法得某些特定環(huán)節(jié)。

九、Command,命令模式:將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進行參數化,對請求排隊和記錄請求日記,以及支持可撤消的操作。

十、State,狀態(tài)模式:允許對象在其內部狀態(tài)改變時改變他的行為。對象看起來似乎改變了他的類。

十一、Strat(yī)egy,策略模式:定義一系列的算法,把他們一個個封裝起來,并使他們可以互相替換,本模式使得算法可以獨立于使用它們的客戶。

十二、China

of

Responsibility,職責鏈模式:使多個對象都有機會解決請求,從而避免請求的送發(fā)者和接受者之間的耦合關系

十三、Mediator,中介者模式:用一個中介對象封裝一些列的對象交互。

十四、Visitor,訪問者模式:表達一個作用于某對象結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個元素的新操作。

十五、Interpreter,解釋器模式:給定一個語言,定義他的文法的一個表達,并定義一個解釋器,這個解釋器使用該表達來解釋語言中的句子。

十六、Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài)。

結構型有:

十七、Composite,組合模式:將對象組合成樹形結構以表達部分整體的關系,Composite使得用戶對單個對象和組合對象的使用品有一致性。

十八、Facade,外觀模式:為子系統(tǒng)中的一組接口提供一致的界面,fa?ade提供了一高層接口,這個接口使得子系統(tǒng)更容易使用。

十九、Proxy,代理模式:為其他對象提供一種代理以控制對這個對象的訪問

二十、Adapter,適配器模式:將一類的接口轉換成客戶希望的此外一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作。

二十一、Decrat(yī)or,裝飾模式:動態(tài)地給一個對象增長一些額外的職責,就增長的功能來說,Decorator模式相比生成子類更加靈活。

二十二、Bridge,橋模式:將抽象部分與它的實現部分相分離,使他們可以獨立的變化。

二十三、Flyweight,享元模式:使用共享物件,用來盡也許減少內存使用量以及分享資訊給盡也許多的相似物件;它適合用于當大量物件只是反復因而導致無法令人接受的使用大量內存。通常物件中的部分狀態(tài)是可以分享。常見做法是把它們放在外部數據結構,當需要使用時再將它們傳遞給享元。代理模式,Python實現: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__

==

"__main__":

=

Proxy()

p.Request()

34.用匿名函數寫一個功能?·

print

(lambda

x:x*x)(4)

35.爬取淘寶的流程36.MySQL和mongodb的區(qū)別mongodb與mysql命令對比

傳統(tǒng)的關系數據庫一般由數據庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由數據庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對于關系型數據庫里的表,但是集合中沒有列、行和關系概念,這體現了模式自由的特點。

37.分析日記的過程先考慮最簡樸的情況,在數據規(guī)模比較小的時候,也許是幾十MB、幾百MB或者幾十GB,總之就是在單機解決尚能忍受的時候。一切都很好辦,現成的各種Unix/Linux工具——awk、grep、sort、join等都是日記分析的利器,假如僅僅是想知道某個頁面的PV,一個wc+grep就能搞定。假如有稍復雜的邏輯,那就使用Python,配合正則表達式,基本就可以解決所有的問題。

38.爬蟲的重要模塊urllib

urllib2

BeautifulSoup

requests

scrapy39.如何驗證URL是否存在

URL不存在,也許時兩種情況網頁在服務器上不存在服務器不存在第一種異常發(fā)生時,爬蟲程序(urllib模塊)會返回HTTP錯誤,urlopen函數會拋出”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.什么是進程池和線程池

這兩個問題有一定的相似度,在面向對象程序編程中,對象的創(chuàng)建與析構都是一個較為復雜的過程,較費時間,所認為了提高程序的運營效率盡也許減少創(chuàng)建和銷毀對象的次數,特別是一些很耗資源的對象創(chuàng)建和銷毀。所以我們可以創(chuàng)建一個進程池(線程池),預先放一些進程(線程)進去,要用的時候就直接調用,用完之后再把進程歸還給進程池,省下創(chuàng)建刪除進程的時間,但是當然就需要額外的開銷了?

運用線程池與進程池可以是管理進程與線程的工作交給系統(tǒng)管理,不需要程序員對立面的線程、進程進行管理

41.解釋負載均衡和集群網絡的負載均衡是一種動態(tài)均衡技術,常見的實現方式是通過一些工具實時地分析數據包,掌握網絡中的數據流量狀況,把任務合理均衡地分派出去。這種技術基于現有網絡結構,提供了一種擴展服務器帶寬和增長服務器吞吐量的便宜有效的方法,加強了網絡數據解決能力,提高了網絡的靈活性和可用性。平常生活中到處都能看到“負載均衡”,一個超市的收營員高峰期只能服務10位顧客,當做活動時有20位顧客需要服務的話也許就會排長隊,這樣購物體驗將會很差(就像客戶抱怨系統(tǒng)/網站訪問太慢)。最簡樸的辦法就是再招個營業(yè)員,重新開通一個出口。負載均衡的核心就是“分攤壓力”。

所謂集群是指一組獨立的計算機系統(tǒng)構成的一個松耦合的多解決器系統(tǒng),它們之間通過網絡實現進程間的通信。應用程序可以通過網絡共享內存進行消息傳送,實現分布式計算機。通俗一點來說,就是讓若干臺計算機聯合起來工作(服務),可以是并行的,也可以是做備份。1、以下print將輸出什么,為什么a=1deffun(a):

a=2fun(a)printaa=[]deffun(a):

a.append(1)fun(a)printa對象有兩種,“可更改”(mutable)與“不可更改”(immutable)對象。在python中,strings,tuples,和numbers是不可更改的對象,而list,dict等則是可以修改的對象。第一個例子里函數把引用指向了一個不可變對象,當函數返回的時候,外面的引用沒半毛感覺.而第二個例子就不同樣了,函數內的引用指向的是可變對象,對它的操作就和定位了指針地址同樣,在內存里進行修改.2、Python中單下劃線和雙下劃線分別代表什么__init__:一種約定,Python內部的名字,用來區(qū)別其他用戶自定義的命名,以防沖突._foo:一種約定,用來指定變量私有.程序員用來指定私有變量的一種方式.__foo:這個有真正的意義:解析器用_classname__foo來代替這個名字,以區(qū)別和其他類相同的命名3、什么是閉包當一個內嵌函數引用其外部作作用域的變量,我們就會得到一個閉包.總結一下,創(chuàng)建一個閉包必須滿足以下幾點:必須有一個內嵌函數內嵌函數必須引用外部函數中的變量外部函數的返回值必須是內嵌函數4、自己寫一個閉包的實例deflazy_sum(*args):

defsum():

ax=0

forninargs:

ax=ax+n

returnax

returnsum5、三次握手客戶端通過向服務器端發(fā)送一個SYN來創(chuàng)建一個積極打開,作為三次握手的一部分??蛻舳税堰@段連接的序號設定為隨機數A。服務器端應當為一個合法的SYN回送一個SYN/ACK。ACK的確認碼應為A+1,SYN/ACK包自身又有一個隨機序號B。最后,客戶端再發(fā)送一個ACK。當服務端受到這個ACK的時候,就完畢了三路握手,并進入了連接創(chuàng)建狀態(tài)。此時包序號被設定為收到的確認號A+1,而響應則為B+1。6、classPerson:

name="aaa"p1=Person()p2=Person()p1.name="bbb"printp1.nameprintp2.nameprintPerson.name="bbb"是實例調用了類變量,這其實和上面第一個問題同樣,就是函數傳參的問題,p1.name一開始是指向的類變量name="aaa",但是在實例的作用域里把類變量的引用改變了,就變成了一個實例變量,self.name不再引用Person的類變量name了.7、GIL線程全局鎖線程全局鎖(GlobalInterpreterLock),即Python為了保證線程安全而采用的獨立線程運營的限制,說白了就是一個核只能在同一時間運營一個線程.8、運用filter過濾出列表中大于5的數字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適合于一些需要大量查詢的應用,但其對于有大量寫操作并不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都無法操作直到讀操作完畢。此外,MyISAM對于SELECTCOUNT(*)這類的計算是超快無比的。InnoDB的趨勢會是一個非常復雜的存儲引擎,對于一些小的應用,它會比MyISAM還慢。他是它支持“行鎖”,于是在寫操作比較多的時候,會更優(yōu)秀。并且,他還支持更多的高級應用,比如:事務。1.現在有一個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.嘗試寫一段代碼,逐行讀入一個文本文獻(ASCII文獻,不必考慮代碼),并在屏幕上打印出來:defprint_file(file_name):8.嘗試寫一段代碼,爬取HTTP協(xié)議的網站,獲取HTTP狀態(tài)碼,HTTP消息頭和網頁內容:(使用熟悉的網絡模塊)importdefcrawl_webpage(url=""):9.嘗試寫一段代碼,從list對象中刪除反復的項,如輸入[1,2,3,3,4,2,3,4,5,6,1],則輸出為[1,2,3,4,5,6],不必保持順序。盡量使用標準庫和內鍵類型以簡化代碼。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é)程是進程和線程的升級版,進程和線程都面臨著內核態(tài)和用戶態(tài)的切換問題而花費許多切換時間,而協(xié)程就是用戶自己控制切換的時機,不再需要陷入系統(tǒng)的內核態(tài).Python里最常見的yield就是協(xié)程的思想!閉包閉包(closure)是函數式編程的重要的語法結構。閉包也是一種組織代碼的結構,它同樣提高了代碼的可反復使用性。當一個內嵌函數引用其外部作作用域的變量,我們就會得到一個閉包.總結一下,創(chuàng)建一個閉包必須滿足以下幾點:必須有一個內嵌函數內嵌函數必須引用外部函數中的變量外部函數的返回值必須是內嵌函數感覺閉包還是有難度的,幾句話是說不明白的,還是查查相關資料.重點是函數運營后并不會被撤消,就像16題的instance字典同樣,當函數運營完后,instance并不被銷毀,而是繼續(xù)留在內存空間里.這個功能類似類里的類變量,只但是遷移到了函數上.閉包就像個空心球同樣,你知道外面和里面,但你不知道中間是什么樣.python中函數式編程支持:filter函數的功能相稱于過濾器。調用一個布爾函數bool_func來迭代遍歷每個seq中的元素;返回一個使bool_seq返回值為true的元素的序列。>>>a=[1,2,3,4,5,6,7]>>>b=filter(lambdax:x>5,a)>>>printb>>>[6,7]map函數是對一個序列的每個項依次執(zhí)行函數,下面是對一個序列每個項都乘以2:>>>a=map(lambdax:x*2,[1,2,3])>>>list(a)[2,4,6]reduce函數是對一個序列的每個項迭代調用函數,下面是求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].append('c')

#修改對象a中的['a','b']數組對象print'a=',aprint'b=',bprint'c=',cprint'd=',d輸出結果: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垃圾回收機制PythonGC重要使用引用計數(referencecounting)來跟蹤和回收垃圾。在引用計數的基礎上,通過“標記-清除”(markandsweep)解決容器對象也許產生的循環(huán)引用問題,通過“分代回收”(generationcollection)以空間換時間的方法提高垃圾回收效率。1引用計數PyObject是每個對象必有的內容,其中ob_refcnt就是做為引用計數。當一個對象有新的引用時,它的ob_refcnt就會增長,當引用它的對象被刪除,它的ob_refcnt就會減少.引用計數為0時,該對象生命就結束了。優(yōu)點:簡樸實時性缺陷:維護引用計數消耗資源循環(huán)引用

標記-清除機制基本思緒是先按需分派,等到沒有空閑內存的時候從寄存器和程序棧上的引用出發(fā),遍歷以對象為節(jié)點、以引用為邊構成的圖,把所有可以訪問到的對象打上標記,然后清掃一遍內存空間,把所有沒標記的對象釋放。分代技術分代回收的整體思想是:將系統(tǒng)中的所有內存塊根據其存活時間劃分為不同的集合,每個集合就成為一個“代”,垃圾收集頻率隨著“代”的存活時間的增大而減小,存活時間通常運用通過幾次垃圾回收來度量。Python默認定義了三代對象集合,索引數越大,對象存活時間越長。舉例:當某些內存塊M通過了3次垃圾收集的清洗之后還存活時,我們就將內存塊M劃到一個集合A中去,而新分派的內存都劃分到集合B中去。當垃圾收集開始工作時,大多數情況都只對集合B進行垃圾回收,而對集合A進行垃圾回收要隔相稱長一段時間后才進行,這就使得垃圾收集機制需要解決的內存少了,效率自然就提高了。在這個過程中,集合B中的某些內存塊由于存活時間長而會被轉移到集合A中,當然,集合A中事實上也存在一些垃圾,這些垃圾的回收會由于這種分代的機制而被延遲。Python的isis是對比地址,==是對比值HTTP和HTTPS狀態(tài)碼定義1xx報告接受到請求,繼續(xù)進程2xx成功環(huán)節(jié)成功接受,被理解,并被接受3xx重定向為了完畢請求,必須采用進一步措施4xx客戶端犯錯請求涉及錯的順序或不能完畢5xx服務器犯錯服務器無法完畢顯然有效的請求403:Forbidden404:NotFoundAjaxAJAX,AsynchronousJavaScriptandXML(異步的JavaScript和XML),是與在不重新加載整個頁面的情況下,與服務器互換數據并更新部分網頁的技術去除列表中的反復元素用集合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列表推導式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腳本中啟用調試模式

)A.

set

+

xB.

set

-

xC.

set

debugD.

set

--

注:set

-x與set

+x指令用于腳本調試。set是把它下面的命令打印到屏幕set

-x

是啟動

set

+x是關閉

set

-o是查看

(xtrace),set去追中一段代碼的顯示情況。執(zhí)行set

-x后,對整個腳本有效。

2.Display

all

lines

that

begin

with

the

letter

“A”

from

file

(B)(顯示所有行開頭字母“A”從一個文獻中)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)(這個標志是什么意思在Shell腳本”$#)($#添加到Shell的參數個數)

A.

The

return

value

of

last

command

#最后一個命令的返回值B.

The

number

of

script

arguments#腳本參數的個數C.

All

of

the

arguments

values

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

評論

0/150

提交評論