一、请写一个函数。该函数的输入是一个仅包含数字的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