Python面試題(四)

2022-02-21 16:39:56 字數 4606 閱讀 2849

去年也是這個時候吧,當時正好也是面試,所以總結了三篇面試的題目。另外前段時間我出了乙個面試題的課程,170道面試題,總結了python的一些方法的使用技巧以及在面試中可能遇到的題目。接下來是我這這段時間遇到的面試題,之前一直懶得寫,今天做乙個總結吧,這裡的題目是170道面試題中沒有出現的題目。

這篇文章寫的很詳細了:

狀態碼類別

原因1xx

informational(資訊性狀態碼)

接受的請求正在處理

2xxsuccess(成功狀態碼)

請求正常處理完畢

3xxredirection(重定向狀態碼)

需要進行附加操作以完成請求

4xxclient error(客戶端錯誤狀態碼)

伺服器無法處理請求

5xxserver error(伺服器錯誤狀態碼)

伺服器處理請求出錯

定義301 moved permanently 被請求的資源已永久移動到新位置,並且將來任何對此資源的引用都應該使用本響應返回的若干個uri之一。如果可能,擁有鏈結編輯功能的客戶端應當自動把請求的位址修改為從伺服器反饋回來的位址。除非額外指定,否則這個響應也是可快取的。

302 found 請求的資源現在臨時從不同的uri響應請求。由於這樣的重定向是臨時的,客戶端應當繼續向原有位址傳送以後的請求。只有在cache-control或expires中進行了指定的情況下,這個響應才是可快取的。

簡單理解就是301是永久重定向,301請求是可以快取的,即通過看status code,可以發現後面寫著from cache。而302是臨時重定向。

區別而301重定向是永久的重定向,搜尋引擎在抓取新的內容的同時也將舊的**替換為了重定向之後的**。

1.在網頁中使用正規表示式匹配出類似的鏈結。例如可以但是不可以。

答:這個比較簡單直接.*就解決了

import re

html = ("""

這是頁面1

這是頁面2

這是頁面3

這是頁面4

這是頁面5

這是頁面6

""")

pattern_str = r"/.*?\.html"

pattern_obj = re.compile(pattern_str)

result = pattern_obj.findall(html)

print(result)

2.思考上面的.*?能否改為.*?為什麼?

這就牽扯到貪婪匹配和懶惰匹配;在限定符後面加上?,則為懶惰模式;在限定符後面不加?則為貪婪模式。

當正規表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。以這個表示式為例:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。

有時,我們更需要懶惰匹配,也就是匹配盡可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上乙個問號?。這樣.*?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。

懶惰限定符

**/語法

說明*?

重複任意次,但盡可能少重複

+?重複1次或更多次,但盡可能少重複

??重複0次或1次,但盡可能少重複

?重複n到m次,但盡可能少重複

?重複n次以上,但盡可能少重複

所以針對第一題如果我們使用.*匹配最後一條會匹配出如下內容

"/music_html_9.html'>這是頁面5

為了避免這種情況我們使用.*?解決問題。同時需要注意的是我們匹配的結尾是.html

而不是html,這就是為什麼我寫成.?\.html而不是.?html了。

@tag

def render(text, *args, **kwargs):

return text

@tag(name = 'p', title = 'text'):

def render2(text, *args, **kwargs):

return text

print(render("hello"))

print(render2("hello"))

答:

關於裝飾器的文章,網上很多資料了,我就不走他們的套路了。

我就寫寫我理解。先看**

def a(func):

print("in a")

func()

@adef b():

print("in b")

上面被裝飾a修飾b內部實際等價於下面這句

b = a(b)
也就是說,使用裝飾器b在被呼叫的時候實際是呼叫了函式a的別名而已。

但是如果b含有引數就出錯了。

像這種

def a(func):         (1)

print("in a") (3)

func() (4)

@a (6)

def b(msg): (7)

print(msg) (8)

def a(func):         (1)

print("in a") (3)

func(msg) (4) #這才是原來的b,為了符合原來引數結構

@a (6)

def b(msg): (7)

print(msg) (8)

def a(func):                     (1)

print("in a") (3)

func(*args,**kwargs) (4)

@a (6)

def b(msg): (7)

print(msg) (8)

到這裡簡單的裝飾器基本就完事了,對函式元資訊的獲取啥的就不細說了。

接下來就是,帶有引數的裝飾器了,繼續拓展我們的例子。

def a(func):                     (1)

print("in a") (3)

func(*args,**kwargs) (4)

@a(name='div') (6)

def b(msg): (7)

print(msg) (8)

到這裡我只是修改了步驟(6)展示下效果,裝飾器具體實現後面我們再完善。

對於帶引數的裝飾就等價於下面的**

b = a(b)(name='div')
對裝飾器的修改思路就是在其外層再加一層函式,為了接收引數的,修改之後如下

def a(name = 'div', *args, **kwargs):

def _a(func):

print("in a")

func(msg, *args, **kwargs)

return _a

@a(name='div')

def b(msg):

print(msg)

b("haha")

對於裝飾器的引數部分習慣性的在最好加

*args, **kwargs
最後我們看下這個題的答案:

def tag(name=none,title=none,*args,**kwargs):

def test(func):

def test2(text,*args,**kwargs):

content = func(text,*args,**kwargs)

if name is none:

# html = '' + content + '

' result = f'

' else:

# html = '<'+ name + ' title="' + title + '">' + content + ''

result = f'< title="">'

return result

return test2

return test

@tag()

def render(text,*args,**kwargs):

return text

@tag(name='p', title='text')

def render2(text,*args,**kwargs):

return text

a = render('hello')

print(a)

b = render2('你好')

print(b)

python語法面試題 python面試題

1.去重,集合 集合的乙個重要特點是 自動去除重複的值 li 1,2,3,1,1,2,2,3,3 去除重複的元素 set set li 轉換為集合,因為集合會自動去重。print set li list set 將集合轉換為列表print li 2.生成器 規則 生成器函式,或者生成器表示式,在呼叫...

大資料面試題 四 YARN面試題

無意中發現了乙個巨牛的人工智慧教程,忍不住分享一下給大家。教程不僅是零基礎,通俗易懂,而且非常風趣幽默,像看 一樣!覺得太牛了,所以分享給大家。點這裡可以跳轉到教程。大資料面試寶典目錄,簡述hadoop1 與hadoop2 的架構異同 加入了yarn 解決了資源排程的問題。加入了對zookeeper...

php面試題四

php面試題二 8.談談事務處理 答案是 事物只是一組sql語句,通常因為它們是彼此相互依賴的。所有要在全有或者 全無的模式下執行,只有當所有的語句都執行成功了,乙個事物才算成功了,任何乙個語句中的失敗應該都會導致系統 回滾 到它先前的狀態,以避免資料連線 崩潰問題。9.apache mysql p...