总结的面试

面试题(掌握的重点):

       1yield返回的是一个生成器,只有在迭代的时候才会一个一个的被执行
问题:
  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(123),又可以先组装listtuple,再通过*args传入:func(*(123));
 
关键字参数既可以直接传入: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)

 

posted @ 2018-01-12 14:43  孟庆健  阅读(220)  评论(0编辑  收藏  举报