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函数?

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。 (注意:lambda 函数不能包含命令,它们所包含的表达式不能超过一个)

lamda函数有什么好处?
1、lambda函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下;
2、匿名函数,一般用来给filter,map这样的函数式编程服务;
3、作为回调函数,传递给某些应用,比如消息处理

9.Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}

10..Python里面match()和search()的区别?  

re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。
>>>print(re.match(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.match(‘super’, ‘insuperable’))
None
>>>print(re.search(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.search(‘super’, ‘insuperable’).span())
(2, 7)  
posted on 2018-02-14 20:08  Sober--  阅读(130)  评论(0编辑  收藏  举报