一、請寫一個函數。該函數的輸入是一個僅包含數字的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