Python面試題(二)

一、請寫一個函數。該函數的輸入是一個僅包含數字的list,輸出一個新的list,其中每一個元素(element)要滿足一下條件:
1.該元素是偶數
2.該元素在原list中是偶數的位置(index是偶數)

def init_list(temp):
    if not isinstance(temp,list):
        raise TypeError("類型不對")
    else:
        return [i for i in temp if i%2==0 and temp.index(i)%2==0]
temp = [0,1,2,3,5,4,6,7,8,9,10]
init_list(temp)

二、有下面三個Python的類,請問三個print分別輸出什麼?並請說明您的理解。

class Parent(object):
    attr='a'

class Child1(Parent):
    pass

class Child2(Parent):
    pass 
print Parent.attr,Child1.attr,Child2.attr
Child1.attr ='b'
print Parent.attr,Child1.attr,Child2.attr
Parent.attr='c'
print Parent.attr,Child1.attr,Child2.attr

輸出結果

a a a
a b a
c b c

三、有下面一個函數

def multi_funcs():
    return [lambda x:x*i ,i for i in range(4)]

請問執行這個函數multi_func()的返回值是什麼?
執行print [m(2) for m in multi_funcs()]
返回值是函數對象
[6,6,6,6]

四、請解釋一下Python什麼是裝飾器(decorators),並寫一個裝飾器,裝飾login函數,當login失敗後再access_failure.log添加一則記錄。記錄包括登錄時間,用戶名,密碼。

decorator就是一個返回函數的高階函數

import logging
import functools
def login_log(fn):
    def wrapper():
        if not fn():
            logger = logging.getLogger("access_failure.log")
            logger.error("username,password")
        return fn()
    return wrapper

@login_log
def login():
    pass 

五、請完成一個函數merge_tuples_to_dict。該函數接受兩個相同長度的tuple作爲參數tuple1,tuple2,輸出一個dict,其中tuple1中的值作爲key,tuple2中的值作爲value
def merge_tuples_to_dict(tuple1,tuple2):
pass
比如:merge_tuples_to_dict((‘a’,’b’,’c’,’d’),(1,2,3,4))

def merge_tuples_to_dict(tuple1,tuple2):
    dict = {}
    for i in range(len(tuple1)):
        dict[tuple1[i]]=tuple2[i]
    return dict 
dict = merge_tuples_to_dict(('a','b','c','d'),(1,2,3,4))

六、 請描述django從收到一個request請求到返回response的整個流程,請儘可能的詳細。

1、 用戶瀏覽器一個url,發起一個請求
2、在Web應用啓動後,會生成一個 WSGIHandler 實例(根據setting中的WSGI_APPLICATION = ‘dailyblog.wsgi.application’ 調用函數),每次請求響應都用這個實例。
3、構造WSGIRequest。
WSGIHandler 處理器準備工作已經完成,隨後它給調度程序發送一個信號 request_started(這個和Flask中的request_started信號差不多),然後根據入 environ 構造 WSGIRequest 對象,它的父類是HttpRequest。

4、 處理Middleware的request中間件
WSGIHander的get_response方法處理 _request_middleware 實例變量並調用其中的每一個方法,傳入 HttpRequest 的實例作爲參數,即請求到達Request Middlewares,中間件對request做一些預處理,如果中間件返回response,會直接響應請求。

5、 URLConf通過urls.py文件和請求的URL找到相應的視圖函數

此時會創建django.core.urlresolvers.RegexURLResolver 的一個實例。

URLresolver 遵循一個相當簡單的模式。對於在 URL 配置文件中根據 ROOT_URLCONF 的配置產生的每一個在 urlpatterns 列表中的條目,它會檢查請 求的 URL 路徑是否與這個條目的正則表達式相匹配,如果是的話,有兩種選擇:

如果這個條目有一個可以調用的 include,resolver 截取匹配的 URL,轉 到 include 指定的 URL 配置文件並開始遍歷其中 urlpatterns 列表中的 每一個條目。根據你 URL 的深度和模塊性,這可能重複好幾次。
否則,resolver 返回三個條目:匹配的條目指定的 view function;一個 從 URL 得到的未命名匹配組(被用來作爲 view 的位置參數);一個關鍵 字參數字典,它由從 URL 得到的任意命名匹配組和從 URLConf 中得到的任 意其它關鍵字參數組合而成。
注意這一過程會在匹配到第一個指定了 view 的條目時停止,因此最好讓你的 URL 配置從複雜的正則過渡到簡單的正則,這樣能確保 resolver 不會首先匹配 到簡單的那一個而返回錯誤的 view function。

如果沒有找到匹配的條目,resolver 會產生 django.core.urlresolvers.Resolver404 異常,它是 django.http.Http404 例 外的子類。後面我們會知道它是如何處理的。

6、 開始調用View中相應的視圖函數或基於類的視圖。

7、View進行一些處理,如通過模型Models返回數據。

8、如果需要,Views可以創建一個額外的Context,Context被當做變量傳給Template。

9、Template渲染輸出

10、渲染後的輸出被返回到View

11、HTTPResponse被髮送到Response Middlewares

12、Response Middlewares對response進行特定的處理,然後返回一個新的response

13、Response返回呈現給用戶

14、一旦 middleware完成了最後環節,處理器將發送一個信號 request_finished,訂閱這個信號的事件會清空並釋放任何使用中的資源。比如,Django 的 request_finished 的訂閱者subscriber會關閉所有數據庫連接。

15、所有流程至此已經全部完成。

七、請問執行一下代碼後,console上的輸出是什麼?請闡述原因。

class my_metaclass(type):
    def __new__(cls,class_name,parent,attributes):
        print "1"
        return super(my_metaclass,cls).__new__(cls,class_name,parent,attributes)

    def __init__(self,class_name,parent,attributes):
        print "2"
        super(my_metaclass,self).__init__(self)

    def __call__(self,*args,**kwargs):
        print "3"
        return super(my_metaclass,self).__call__(*args,**kwargs)
def my_class_decorator(cls):
    print "4"
    return cls

@my_class_decorator
class C(object):
    __metaclass__ = my_metaclass

    def __new__(cls):
        print "5"
        return super(C,cls).__new__(cls)

    def __init__(self):
        print "6"


c =C()

Python2.7程序結果

1
2
4
3
5
6

Python3.5程序結果

4
5
6
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章