1.python中is和==的区别?
python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)、value(值) ==是python中的比较运算符,用来比较两个对象的value值是否相等 is 也被叫做同一性运算符,比较判断的是对象间的唯一身份标识,也就是id是否相同 注:只有在数值型和字符串的情况下,a is b才为True,当a和b是tuple,list,dict或set型时,a is b为False
2. 中间件一般都做什么?
djang处理一个request请求首先通过中间件,我们可以在Middleware这个地方把所有Request都拦截住,用我们自己的方式完成处理以后直接返回Response.
3.类中的@classmethod、@staticmethod和@@property的用法和效果。
@classmethod类方法 是给类用的,类在使用时会将类本身当做参数传给类方法的第一个参数,python为我们内置了函数classmethod来把类中的函数定义成类方法 @staticmethod静态方法 通常情况下,在类中定义的所有函数(注意了,这里说的就是所有,跟self啥的没关系,self也只是一个再普通不过的参数而已)都是对象的绑定方法,对象在调用绑定方法时会自动将自己作为参数传递给方法的第一个参数。除此之外还有两种常见的方法:静态方法和类方法,二者是为类量身定制的,但是实例非要使用,也不会报错。 是一种普通函数,位于类定义的命名空间中,不会对任何实例类型进行操作,python为我们内置了函数staticmethod来把类中的函数定义成静态方法 @property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 补充: ps:面向对象的封装有三种方式: 【public】 这种其实就是不封装,是对外公开的 【protected】 这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开 【private】 这种封装对谁都不公开
4.python的自省
自省是指这种能力:检查某些事物确定它它是什么、它知道什么以及它会做什么。 如:type(),dir(),getattr(),hasattr(),isinstance(),callable(obj)等
5.可变对象与不可变对象
元祖(tuple)、数值型(number)、字符串(string)均为不可变类型 字典(dic)和列表(list)对象是可变类型 可以通过id体现 def test(a=[]): a.append(1) print(a) 连续多次调用test函数,输出什么? 参考博文http://www.cnblogs.com/evening/archive/2012/04/11/2442788.html
6.去除一个列表中的重复内容,原顺序不变
a = ['a','b','b','c','c','d'] b = list(set(a)) b.sort(key=a.index) print(b) 或者 c = sorted(set(a),key=a.index) print(c) 执行结果 ['a', 'b', 'c', 'd']
7.阅读以下代码写出结果
def f(x,li=[]): for i in range(x): li.append(i*i) print(li) f(2) f(3,[3,2,1]) f(3) 结果为 [0, 1] [3, 2, 1, 0, 1, 4] [0, 1, 0, 1, 4] 第一个函数调用十分明显,for循环先后将0和1添加至了空列表l中。l是变量的名字,指向内存中存储的一个列表。 第二个函数调用在一块新的内存中创建了新的列表。l这时指向了新生成的列表。之后再往新列表中添加0、1、2和4。很棒吧。 第三个函数调用的结果就有些奇怪了。它使用了之前内存地址中存储的旧列表。这就是为什么它的前两个元素是0和1了。不明白的话就试着运行以下的代码吧 l_mem = [] l = l_mem # the first call for i in range(2): l.append(i*i) print l # [0, 1] l = [3,2,1] # the second call for i in range(3): l.append(i*i) print l # [3, 2, 1, 0, 1, 4] l = l_mem # the third call for i in range(3): l.append(i*i) print l # [0, 1, 0, 1, 4]
8.什么是lambda函数?
持续更新。。。