Loading

基础

Python面试重点(基础篇)

注意:只有必答题部分计算分值,补充题不计算分值。

第一部分 必答题(每题2分)

  1. 简述列举了解的编程语言及语言间的区别?

    ​ 解释型语言:python,逐行编译,

    ​ 编译型语言:c,java 整体编译好在运行

  2. 列举Python2和Python3的区别?

    ​ python2:源码不统一,有长整型,/获取的是整数,range返回是一个列表,xrange返回是一个生成器,没有布尔型,经典类,2.2之后是新式类,

    python3,源码同意,没有long,/获取是浮点数,range获取是可迭代对象,有布尔型,都是新式类

  3. 看代码写结果

    # 逻辑短路
    and 全真则真,一假则假
    or  一真则真,全假则假
    v1 = 1 or 2        1
    v2 = 3 and 7 or 9 and 0     7
    
  4. 比较以下值有什么不同? **

    数据类型:
        Number(int , float , complex , bool)
        容器:str list tuple set dict
         
    # 复数 : 用在数据分析,人工智能中
    complexvar = 3 + 4j
    3 : 实数
    4j: 虚数
    j: 如果有一个数,他的平方等于-1 ,那么这个数就是j,科学家认为有,表达高精度类型
        
    v1 = [1,2,3]      [int,int,int]
    v2 = [(1),(2),(3)]	[int,int,int]
    v3 = [(1,),(2,),(3,)]  [tuple,tuple,tuple]
    
  5. 用一行代码实现数值交换。

    a = 1
    b = 2
    
    a,b=b,a
    
  6. Python中单引号、双引号、三引号的区别? **

    单引号,双引号用来表示字符串

    单双引号没有区别,三引号可以支持跨行
    在互相嵌套时需注意:里外不能使用相同的引号
    

    三引号用于输入多行文本,或用来注释

  7. is和==的区别?

    is` `是判断两边内存地址是否相同
    =``=` `判断两边的值是否相同
    
  8. python里如何实现tuple和list的转化?

    list``(数据) ``tuple``(数据)
    
  9. 如何实现字符串 name='老男孩'的反转?

    name[::-1]
    
  10. 两个set如何获取交集、并集、差集?

    交集:set1 & set2

    并集: set1 | set2

    差集: set1 -set2

  11. 那些情况下, y != x - (x-y)会成立? **

    """
    非空集合且不为子父关系的两个集合
    """
    y != x-(x-y)
    x = {"a","b","c"}
    y = {"b","d"}
     
    if y != x-(x-y):
        print("ok")
    
  12. Python中如何拷贝一个对象? **

    # import copy
    # 针对于列表的拷贝,还可以使用[:] , [::],浅拷贝的一种方式
    
    lst1 = [1,2,3]
    lst2 = lst1[:]
    lst1.append(4)
    print(lst2)
    
  13. 简述 赋值、浅拷贝、深拷贝的区别?

    #赋值  : 将变量和值在内存中形成映射指向关系
    #浅拷贝 : 只拷贝第一级里所有的元素 copy.copy
    #深拷贝 : 为所有层级的元素都单独开辟新空间 copy.deepcopy() (地址:原不可变数据只是暂时的指向,可变的数据独立开辟新空间)
    """
    可变数据: list set dict
    不可变数据: int float bool complex str tuple
    """
    
    import copy
    lst1 = [1,2,3,[4,5,6]]
    lst2 = copy.deepcopy(lst1)
    lst1[0] = 100
    print(lst1)
    print(lst2)
    print(id(lst1[0]))
    print(id(lst2[0]))
    
  14. pass的作用?

    占位,保持结构的完整性

  15. 阅读代码写结果。

    import copy
    a = [1,2,4,5,['b','c']]
    b = a
    c = copy.copy(a)
    d = copy.deepcopy(a)
    
    a.append(5)
    a[4].append('d')
    
    
    
    print(b)  [1,2,4,5,['b','c','d'],5]
    print(c)  [1,2,4,5,['b','c','d']]
    print(a)  [1,2,4,5,['b','c','d'],5]
    
  16. 用Python实现9 * 9 乘法表。

    for i in range(1,10):
        for j in range(1,i+1):
            print("%d*%d=%d"%(i,j,i*j),end=" ")
        print("")
    
  17. 用Python显示一个斐波那契数列。 ***

    lst = [1,1]
    for i in range(10):
        lst.append(lst[-1] + lst[-2])
    print(lst)
    
  18. 如何删除列表中重复的值?

    list(set(lst))
    
  19. 一个大小为100G的文件etl_log.txt, 要读取文件中的内容, 写出具体过程代码?

    with open(etl_log.txt,"r",encoding="utf-8") as f:

    ​ for i in f:

    ​ print(i)

  20. a = dict(zip(("a","b","c","d","e"),(1,2,3,4,5))) 请问a是什么?

    强转字典的条件:等长的二级容器,配合强转字典的两个函数 zip , enumerate
    # zip  拉链
    a = dict( zip( ("a","b") , [1,2] ) )
    {"a":1,"b":2}
    print(a)
    # enumerate  枚举
    a = dict( enumerate( ["a","b"] ))
    a = dict( enumerate( ["a","b"] ,start = 10 ))
    print(a)
    
  21. lambda关键字的作用?

    lambda 匿名函数 : 用一句话表达只有返回值的无名函数
    lambda 参数 : 返回值
    
  22. *arg**kwarg作用?

    # *arg   普通收集参数 :   收集多余的没人要的普通实参
    # **kwarg 关键字收集参数: 收集多余的没人要的关键字实参
    
  23. 如何在函数中设置一个全局变量 ?

    """
    global  有该全局变量,修改当前变量,没有改全局变量,定义一个全局变量;
    """
    def func():
        global a
        a = 90
    func()
    print(a)
    
  24. filter、map、reduce的作用?

    """
    三目(元)运算符  True   if 条件表达式 else False
     
    filter => 过滤数据
    iterable : 可迭代对象(range ,容器类型数据 , 迭代器)
    filter(func,iterable)  => 返回迭代器
     
    lst = [1,2,3,4,5]
    it = filter(lambda x : True   if x % 2 == 0 else False , lst )
    print(list(it))
     
    """
    # map -> 处理(映射)数据
    map(func,iterable) => 返回迭代器
     
    lst = [1,2,3]
    it = map(lambda x : x*3 , lst)
    print(list(it))
     
    # reduce -> 计算数据
    from functools import reduce
    # reduce(func,iterable) => 最后计算的值
    # [5,4,8,8] => 5488
    lst = [5,4,8,8]
    res = reduce(lambda x,y : x*10 + y ,lst )
    print(res , type(res))
    
  25. 什么是匿名函数?匿名函数有什么作用?

    lambda 匿名函数 : 用一句话表达只有返回值的无名函数

    作用:不会函数名冲突,占用内存少

  26. Python递归的最大层数?

    官方说法1000 , 实际测试 994 ~ 1000
    import sys
    sys.setrecursionlimit(999999) # 修改递归的最大深度
    
  27. 什么是迭代器?什么是可迭代对象?

    # 具有__iter__() 和 __next__()这两个方法的是迭代器
    # 具有__iter__()方法就是可迭代对象
    # dir(数据) 可以查看该数据的内部系统成员
    # 可迭代对象 => 迭代器  把不能直接被next获取 => 可直接获取到该数据的一个过程
    
  28. 什么是生成器?

    生成器的本质就是迭代器,可以自定义迭代的逻辑
    创建方式两种:
        (1)生成器表达式 (推导式)  (i for i in range(3))
        (2)生成器函数   (含有yield关键字)
    
  29. 什么是装饰器及应用场景?

     装饰器的本质就是闭包
    # 在不修改原有代码的前提下,额外增加新功能就是装饰器
    # 应用:登录认证,property类,框架(django,flask,@app.route("/",methdos=["GET","POST"]))
     
    
  30. 什么是反射及应用场景?

    # 通过字符串去操作类对象 或者 模块中的属性方法
    hasattr getattr setattr delattr
    应用: 可以配合用户的操作或者输入,调用其中的成员,api接口中
    
  31. 写一个普通的装饰器。

    闭包:内函数使用了外函数的局部变量,外函数把内函数返回出来的过程叫做闭包
    这个内函数叫做闭包函数;
    特点:如果内函数使用了外函数的局部变量,那么该变量于内函数发生绑定,延长该变量的生命周期
    def wrapper(func):
        def inner(*args,**kwargs):
            res = func(*args,**kwargs)
            print("and you")
            return res
             
        return inner
     
    @wrapper
    def func():
        print("i am fine 3q")
     
    func()
    
  32. 写一个带参数的装饰器。

    def outer(n):
        def wrapper(func):
            def inner1(*args,**kwargs):
                res = func(*args,**kwargs)
                print("我是大王")
                return res
                 
            def inner2(*args,**kwargs):
                res = func(*args,**kwargs)
                print("大王叫我来巡山")
                return res
             
            if n == "alex":
                return inner1
            else:
                return inner2
                 
        return wrapper
     
     
    @outer("alex123") # outer("alex123") => wrapper =>@wrapper
    def func():
        print("i am fine 3q")
         
    func()
     
    
  33. 求结果

    def num():
        return [lambda x:i*x for i in range(4)]
    print([m(2) for m in num()])
     
    """
    def出现的位置是函数的定义处
    函数() 出现的位置是函数的调用处
    (1)调用的时候,才会把函数中的代码,从上到下执行一遍,否则不执行
    (2)里面的func是一个闭包函数,延长了当前变量i的生命周期,最后一次i的值3,所以再去调用时候拿的3
    """
     
     
    def num():
        lst = []
        for i in range(4):
            def func(x):
                return i*x
            lst.append(func)
        return lst
         
    lst = num()
    print(lst)
     
     
    lst = [ m(2)   for m in num()  ]
    lst = [ m(2)   for m in lst  ]
    lst = [ i*x   for m in lst  ]
    lst = [3 * 2 for m in lst]
    lst = [6,6,6,6]
     
     
    """
    [
    <function func at 0x000001A02CA642F0>, 
    <function func at 0x000001A02CA64378>, 
    <function func at 0x000001A02CA646A8>, 
    <function func at 0x000001A02CA64730>
    ]
    def func():
        print(1)
     
    for i in range(3):
        print(i)
         
    """
    
  34. def(a, b=[])这种写法有什么陷阱?

    b身上的默认值是列表,如果使用原来默认的参数,调用func函数
    会把几次调用的值都存放在同一个默认列表里
    """
    默认参数: 
        如果调用时,用户给实参了,那么使用用户的
        如果调用时,用户没给实参,那么使用默认的(早已存在内存中的这个列表)
         
    默认值会提前在内存中驻留,在使用时,才能调取,在定义函数的时候就提前开辟了空间
    """
    
  35. 看代码写结果

    def func(a,b=[]):
        b.append(a)
    	return b
    
    v1 = func(1)
    v2 = func(2,[10,20])
    v3 = func(3)
    print(v1,v2,v3)
    
    1,3
    
    [10,20,2]
    
    1,3
    
  36. 看代码写结果

    def func(a,b=[]):
        b.append(a)
    	return b
    
    v1 = func(1)
    print(v1)    [1]
    v2 = func(2,[10,20])
    print(v2)   [10,20,2]
    v3 = func(3)
    print(v3)    [1,3]
    
  37. 请编写一个函数实现将IP地址转换成一个整数。

    如 10.3.9.12 转换规则为:
            10            00001010
             3            00000011
             9            00001001
            12            00001100
            
    再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
    
    # ljust   原字符串居左,填充符号
    # rjust   原字符串居右,填充符号
    # 方法一
    ip = "10.3.9.12"
    strvar = ""
    for i in ip.split("."):
        bin_str = str(bin(int(i)))[2:]
        # 总长度是8 原字符串居右
        strvar += bin_str.rjust(8,"0")
    print(strvar)
         
    # 把二进制字符串转换成十进制,默认转换时,是十进制
    print(int(strvar,2))
     
    # 方法二
    ip = "10.3.9.12"
    strvar = ""
    for i in ip.split("."):
        # format 将整型转化成二进制,不够8位的拿0补位
        strvar += format(int(i) , "08b")
    print(int(strvar,2))
    
  38. 请查找一个目录下的所有文件(可能存在文件嵌套)。

  39. 求结果

    import math
    print (math.floor(5.5))
    
    5
    
  40. 是否使用过functools中的函数?其作用是什么?

  41. re的match和search区别?

    match:匹配启示位置,不成功返回none

    search匹配整个字符串,匹配不到返回none

  42. 用Python匹配HTML tag的时候,<.>和<.?>有什么区别?

  43. 如何生成一个随机数?

    random.random()

  44. super的作用?

    调用父类的方法,按照新式类顺序查找

  45. 双下划线和单下划线的区别?

    双下划线:是命名私有的

    但下划线:保护变量

  46. @staticmethod和@classmethod的区别?

  47. 实现一个单例模式(加锁)。

  48. 栈和队列的区别?

  49. 以下代码输出是什么? 请给出答案并解释。

    class Parent(object):
        x = 1
    
    class Child1(Parent):
        pass
    
    class Child2(Parent):
        pass
    
    print Parent.x, Child1.x, Child2.x   1,1,1
    
    Child1.x = 2
    print Parent.x, Child1.x, Child2.x
    1,2,1
    
    Parent.x = 3
    print Parent.x, Child1.x, Child2.x
    1,1,3
    
  50. 参考下面代码片段

    class Context:
        pass
    
    with Content() as ctx:
        ctx.do_something()
    请在Context类下添加代码完成该类的实现
    

第二部分 可选题

  1. 如何获取列表中第二大的值?
  2. 简述Python内存管理机制。
  3. 简述Python的垃圾回收机制。
  4. 请用两个队列来实现一个栈。
  5. 请用Python实现一个链表。
  6. 请用Python实现链表的逆转。

概念

jwt登录流程

posted @ 2020-02-26 11:56  封灵寒武  阅读(46)  评论(0)    收藏  举报