总结的面试
面试题(掌握的重点):
1、yield返回的是一个生成器,只有在迭代的时候才会一个一个的被执行
问题:
2、什么是可迭代对象?
答:有__iter__方法的就是可迭代对象,返回的是一个迭代器,也可以返回一个生成器
3、什么是迭代器?
答:有__next__方法的就是迭代器,迭代器是往前一个一个的取值,但是不能生成值
4、什么是生成器
答:生成器是基于迭代器的,不仅取值还能生成值。被执行后返回的是一个生成器
需求:新浪面试,数据库12张表,每张表创建一条数据时,记录一条日志。 重写save方法或者用信号,找到信号注册一个函数
什么是ORM?
ORM 就是关系对象映射,ORM框架不是Djang特有的,是所有的框架对有的。ORM就是让面向对象里面的类跟数据库里面的表对应上
做的对应关系,而对象和数据库里的表里面的一行数据做对应,一个类可以当做是一张表,而类里面的一个对象就是表里面的一行数据
做上这种对应关系,以后对数据库就行操作是就不用写繁琐的原生SQL知识用Python的类和对象就可以做数据库操作,它本质的也是SQL语句
它只是将类和对象之间的操作转化成SQL 语句自动执行,这就是ORM。
ORM和原生受SQL缺点?
性能原生sql好一点,原生sql可维护性差一点,操作起来更加简单快捷
你用过什么ORM?
django(django的ORM是原生自己的),SQLALchemy(所有的都能用)
django和SQLALchemy的ORM的区别?
SQLALchemy的ORM 没有django的好,django它包含了双下划线(__.)去跨表,在SQLALchemy找不到双下划线,它没有这样的特殊语法,
要向连表就得是A类和B类都放在一起join这才交联表,它跟接近与SQL 语句,他们两个都有优势,对于Django来说操作起来更简单,
它的双下划线跨表就比较方便,它还可以自动生成第三张表,SQLALchemy它跟接近与sql,他们们的共同点,都是连接不到数据库,
都的借助第三方模块
如何实现对Python列表去重并保持原来的顺序
mailto = ['cc', 'bbbb', 'afa', 'sss', 'bbbb', 'cc', 'shafa']
addr_to = list(set(mailto)) 使用set去重
addr_to.sort(key = mailto.index) 从列表中找出某个值第一个匹配项的索引位置,并实现按目录的顺序排序
Python格式化中%和.format的最主要的区别?
1、format的元素输出位置参数不受顺序约束,元素放置方式为{},只要format中有相对应的参数即可。
2、只要关键字对的上,format也可以像字典一样进行操作
现有两元组 t1 = (('a'),('b')),t2 = (('c'),('d')),请使用Python匿名函数生成列表[{'a': 'c'}, {'b': 'd'}]?
t1 = (('a'),('b'))
t2 = (('c'),('d'))
第一种方式:
print(list(map(lambda t:{t[0]:t[1]} ,zip(t1,t2))))
第二种方式:
print([{i:j} for i,j in zip(t1,t2)])
第三种方式:
test = lambda t1,t2 :[{i:j} for i,j in zip(t1,t2)]
print(test(t1,t2))
请给出二分法查找的Python示列代码:
l = [2,3,5,10,15,16,18,22,26]
#二分法
def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26] 0,8
mid = (end+start)//2 #4 #5+8/2=6 #start =5 end = 5 mid = 5
if start < end:
if l[mid] > aim: #15 17 #18 17
end = mid -1 #end =6-1 = 5
return find2(l,aim,start,end)
elif l[mid] < aim: #15 17
start = mid + 1 # start = 5
return find2(l, aim, start, end)
else:
return mid
else:
return "找不到"
print(find2(l,18,start=0,end = len(l)-1))
*args和**kwargs在什么情况下使用,请给出使用**kwargs的示列?
最常见的用例是在写函数装饰器的时候。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个 dict。并且同时使用*args和**kwargs时,*args参数列必须要在**kwargs前
def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''执行函数之前要做的''')
re = func(*args,**kwargs)
if flag:
print('''执行函数之后要做的''')
return re
return inner
return timer
@outer(False)
def func():
print(111)
func()
python里面如何实现tuple和list的转换
(1)、函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tuple, 元素不变,排序也不变。
例如,tuple([1,2,3])返回(1,2,3), tuple(‘abc’)返回(‘a’.'b’,'c’).如果参数已经是一个tuple的话,函数不做任何拷贝而直接返回原来的对象,
所以在不确定对象是不是tuple的时候来调用tuple()函数也不是很耗费的。
(2)、函数list(seq)可以把所有的序列和可迭代的对象转换成一个list,元素不变,排序也不变。
例如 list([1,2,3])返回(1,2,3), list(‘abc’)返回['a', 'b', 'c']。如果参数是一个list, 她会像set[:]一样做一个拷贝。
请写出一段python代码实现删除一个list里面的重复的元素
list1 = [5,1,3,1,6,2,3]
list2 = []
for i in list1:
if i not in list2:
list2.append(i)
else:
continue
print(list2)
如何得到列表list的交集和差集
1. 获取两个list 的交集
#方法一:
a=[2,3,4,5]
b=[2,5,8]
tmp = [val for val in a if val in b]
print tmp
#[2, 5]
#方法二
print list(set(a).intersection(set(b)))
3. 获取两个 list 的差集
print list(set(b).difference(set(a))) # b中有而a中没有的
什么是lambda表达式
“Lambda 表达式”(lambda expression)是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包。
Python中定义函数时如何书写可变参数和关键子参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
*
args是可变参数,args接收的是一个
tuple
;
*
*
kw是关键字参数,kw接收的是一个
dict
。
以及调用函数时如何传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(
1
,
2
,
3
),又可以先组装
list
或
tuple
,再通过
*
args传入:func(
*
(
1
,
2
,
3
));
关键字参数既可以直接传入:func(a
=
1
, b
=
2
),又可以先组装
dict
,再通过
*
*
kw传入:func(
*
*
{
'a'
:
1
,
'b'
:
2
})。
sys.path.append('/root/mods') (C)
A.改变python的启动路径
B.改变python目前的工作路径
C.添加一个新的python模块的搜素路径
D.从mods中移除所有文件夹
1or2和1and 2输出分别是什么,为什么
1or2输出的是1,因为这里的1为真那么输出的就是的1,如果这里的2为真那么输出的就是2
1and2输出的是2,因为这里的1为真它输出的就是的2,如果这里的1为假那么他输出的就是就是1
rest_Framework的规范:
按顺序:它的method的不同,原来没有考虑,原来是url区分,现在通过method来区分,method的不同提交方式不同,紧接着一般是面向资源的就是把url变成名词,
接下就是返回值,以前没有考虑状态码,现在有考虑状态码。(一般有get,post方法,还有put,delete等方法)
为什么用Django rest_Framework框架?
首先没有Django rest_Framework框架用django也是可以做出来的,只不过它为我们提供一些API常用的功能,
比如:(认证,权限,限流,有了这些我们只需要写个类已配置,它就能当都市图用,还能全局配置,如果自己写还得写中间件,
写装饰器来实现,通过Django rest_Framework框架,他已经把规则写好,只需要写类,只需实现方法,返回值就可以)实现了一部分功能
设计比较好
----单独视图+全局配置 =>Dajngo中间件(importlib/反射)=>动态配置课扩展(短信,邮件,微信等提醒)
1、1,2,3,4,5能组成多少个互不相同的无重复的三位数?
d = [1, 2, 3, 4,5] def getnum(num, digit, length): num1 = num for i in range(len(digit)): num = num1 * 10 + digit[i] if length == 3: yield num elif length < 3: for j in getnum(num, digit[:i] + digit[i + 1:], length + 1): yield j digit = list(getnum(0, d, 1)) print("%r 共可以组成%d个三位数字 " % (d, len(digit))) print("它们是:%r" % digit)
python3的做法:看代码输出l,m的结果 def func(m): for k,v in list(m.items()): m[k+1]=v m = {1:2,3:4} l=m l[9]=10 func(l) m[7]=8 print(l,m) python2的做法:看代码输出l,m的结果 def func(m): for k,v in m.items(): m[k+1]=v m = {1:2,3:4} l=m l[9]=10 func(l) m[7]=8 print(l,m)