• Python面试重点(基础篇)


    Python面试重点(基础篇)

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

    1. 简述列举了解的编程语言及语言间的区别?
      python 解释型 相对于简单易学
      java 混合型 学习成本高,java做web
      c 编译型 底层语言
      c++ 编译型 c的基础上加了面向对象
      go 编译型 高并发,区块链

      语言特点: 灵活简洁,语言优美 可读性强,
      
      语言类型:
      		解释型:逐行转化,运行效率低,性能差,开发效率高。兼容性好,跨平台
      		编译型 :一次性编译成二进制文件,执行效率高,兼容性差,
      		动态语言:不用声明变量的数据类型(脚本类语言)
      		静态语言:需要声明变量的数据类型
      
      第三方库:python定位是任其发展,开源库很多,应用领域广
      
    2. 列举Python2和Python3的区别?
      Python 2只支持到2020年
      print函数 Python2不加括号 Python3加括号 从语句变为函数
      input函数 Python2用户输入解析为int类型,raw_input为字符串类型 Python3为字符串类型
      整除/ 2 根据除数小数点位得到结果,整形 3是真除
      默认编码 2是ascll码 3 utf-8
      不等!= <> python3取消了<>
      int类型 2有long类型 3只有int
      range 2 是列表 xrange 可迭代对象 3是可迭代对象
      2新式类,经典类 3 新式类

    3. 看代码写结果

      v1 = 1 or 2
      #v1 = 1
      v2 = 3 and 7 or 9 and 0
      #v2 = 7 or 0
      #v2 = 7
      在没有()的情况下not 优先级高于 and,and优先级高于or 
      x or y , x为真,值就是x,x为假,值是y;
      x and y, x为真,值是y,x为假,值是x。
      两边都不是0的情况下 
      and 直接取后面的值 or 直接取前面的值 
      如果存在0的情况
      and 直接取0 or 直接取非0
      false是 0 。。
      
    4. 比较以下值有什么不同?
      v1 = [1,2,3]
      v2 = [(1),(2),(3)]
      v3 = [(1,),(2,),(3,)]
      1和2没什么太大区别,3的话(1,)表示是一个元组,(1)表示的是里面元素本身的类型

    5. 用一行代码实现数值交换。
      a = 1
      b = 2

      #a,b = b,a
      
    6. Python中单引号、双引号、三引号的区别?
      python中单双引号可以互相包含,避免转义,
      而三引号有两种作用 长字符串的换行,以及注释

    7. is和==的区别?
      对象的基本三要素:type(数据类型) id(身份标识) 和 value(值)
      ==比较两个对象的值是否相等
      is判断id值是否相同

    8. python里如何实现tuple和list的转化?
      tuple(list) #可以用循环添加
      list(tuple) #tuple不可变,不能循环添加

    9. 如何实现字符串 name='老男孩'的反转?
      1.切片
      name = name[::-1]
      2.列表的reverse方法
      name = list(name)
      name.reverse()
      name = ''.join(name)
      #name = ''.join(name[::-1])
      3.for 循环
      #各种切片insert都可以
      4.reduce函数
      new_name = reduce(lambda x,y:y+x,name)
      print(new_name)
      5.递归
      def func(s):
      if len(s) < 1:
      return s
      return func(s[1:]) +s[0]
      6.使用栈
      s = "hello"
      l = list(s)
      result = ""
      while(len(l)>0):
      result += l.pop()
      print(result)

    10. 两个set如何获取交集、并集、差集?
      交集 list(set(a).intersection(set(b)))
      &
      并集 list(set(a).union(set(b)))
      |
      差集 list(set(b).difference(set(a)))
      -

    11. 那些情况下, y != x - (x-y)会成立?
      x,y是两个不相等的非空集合

    12. Python中如何拷贝一个对象?
      为了在修改数据时不改变原数据所产生了拷贝
      copy模块 copy.copy() copy.deepcopy()
      [:]
      可变对象:所谓可变是指可变对象的值可变,身份(id)是不变的。如:列表、字典、集合
      不可变对象:就是对象的身份和值都不可变。如:数字(数字也是不可变,切记)、字符串、元组

    13. 简述 赋值、浅拷贝、深拷贝的区别?
      原则上是分离数据,修改数据互不影响

      赋值:让多个变量同时指向一个对象的内存地址。不可变对象在赋值时会开辟新空间。可变对象在赋值时,修改一个的值,另一个也会发生改变。
      
      浅拷贝:(copy模块的copy.copy()函数) 拷贝父对象,不会拷贝对象的内部的子对象。不可变对象和赋值没区别。可变对象,浅拷贝在拷贝时,只拷贝第一层中的引用,如果元素是可变对象,并且被修改,那么拷贝的对象也会发生变化。####拷贝第一层元素内存地址
      
      深拷贝:完全拷贝了父对象及其子对象。深拷贝就是将顶级对象以及子对象的值同时复制给新对象,此时修改任何一个都不会影响另一个。{copy模块的 copy.deepcopy()函数}####不管多少层,不可变共有,可变开辟新空间
      
      但由于小数据池的概念,python中 -5~~256  20字符串 bool完全共享内存地址
      
    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)
      print(c)
      print(a)
      
    16. 用Python实现9 * 9 乘法表。

    17. 用Python显示一个斐波那契数列。
      lst = [1,1]
      for i in range(10):
      lst.append()

    18. 如何删除列表中重复的值?
      list(set(list))

    19. 一个大小为100G的文件etl_log.txt, 要读取文件中的内容, 写出具体过程代码?
      for i in 文件句柄

    20. a = dict(zip(("a","b","c","d","e"),(1,2,3,4,5))) 请问a是什么?
      字典的创建方式

    21. lambda关键字的作用?
      定义一个匿名函数

    22. *arg和**kwarg作用?
      * arg 接受多余位置参数
      **kwarg 接受多余关键字参数

    23. 如何在函数中设置一个全局变量 ?
      global name

    24. filter、map、reduce的作用?
      filter 过滤
      map 映射
      reduce 累计算

    25. 什么是匿名函数?匿名函数有什么作用?
      lambda 函数就是匿名函数,一句话函数
      配合高阶函数进行使用
      高阶函数:能写方法的

    26. Python递归的最大层数?
      官方1000 实际994-998
      import sys
      sys.setrecursionlimit(10000)修改递归最大深度

    27. 什么是迭代器?什么是可迭代对象?
      具有__iter__()和__next__()方法的就是迭代器
      具有__iter__()方法的就是可迭代对象
      .dir()查看某个对象的所有属性和方法

    28. 什么是生成器? 什么是装饰器及应用场景?
      生成器的本质就是迭代器,具有yield关键字就是生成器
      装饰器本质闭包,不修改源代码及调用方式下,额外增加功能
      登陆验证

      flask
      django

    29. 什么是反射及应用场景?
      通过字符串操作对象的方法和属性
      应用场景:
      用户输入,判断选择,cbv

    30. 写一个普通的装饰器。

    31. 写一个带参数的装饰器。

    32. 求结果
      def num():
      return [lambda x:i*x for i in range(4)]
      print([m(2) for m in num()])

      [6,6,6,6]
      
    33. def(a, b=[])这种写法有什么陷阱?
      默认参数是可变数据类型 闭包

    34. 看代码写结果
      def func(a,b=[]):
      b.append(a)
      return b

      v1 = func(1)
      v2 = func(2,[10,20])
      v3 = func(3)
      print(v1,v2,v3)
      
    35. 看代码写结果
      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 
      
    36. 请编写一个函数实现--换成一个整数。
      如 10.3.9.12 转换规则为:
      10 00001010
      3 00000011
      9 00001001
      12 00001100

      再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
      
    37. 请查找一个目录下的所有文件(可能存在文件嵌套)。
      os.walk() 本质递归

    38. 求结果
      import math
      print (math.floor(5.5))
      地板除 5

    39. 是否使用过functools中的函数?其作用是什么?
      reduce wraps

    40. re的match和search区别?
      match 从开头进行匹配,匹配一个就停止
      search 从任意位置进行匹配 匹配一个就停止

    41. 用Python匹配HTML tag的时候,<.>和<.?>有什么区别?
      .
      贪婪匹配 匹配多个任意字符
      .*? 非贪婪 只匹配一次

    42. 如何生成一个随机数?
      random
      random.random()

    43. super的作用?
      按照mro的顺序进行继承

    44. 双下划线和单下划线的区别?
      __a = 10 强制私有
      _b = 15 程序员约定俗成这是一个私有方法

    45. @staticmethod和@classmethod的区别?
      一个是静态方法 普通函数
      一个是类方法

    46. 实现一个单例模式(加锁)。
      多线程不再是单例了,为了保证所以加锁

    47. 栈和队列的区别?
      栈 先进后出
      队列 先进先出

    48. 以下代码输出是什么? 请给出答案并解释。
      class Parent(object):
      x = 1

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

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

    方法1
    from threading import Thread # 创建线程的模块

    def task(name):
    print(name)

    if name == 'main':
    # 开启线程 参数1:方法名(不要带括号) 参数2:参数(元祖) 返回对象
    p = Thread(target=task, args=('线程1',))
    p.start() # 只是给操作系统发送了一个就绪信号,并不是执行。操作系统接收信号后安排cpu运行

    print('主')
    

    方法2 - 类的方法
    from threading import Thread # 创建线程的模块

    class MyThread(Thread):
    def init(self, name):
    super().init()
    self.name = name

    def run(self):  # 固定名字run !!!必须用固定名
        print(self.name)
    

    if name == 'main': # 必须要这样启动
    p = MyThread('子线程1')
    p.start()
    print('主)

    常用方法
    currentThread() 取线程对象
    getName() 取线程名
    setName(‘设置线程名’) 取线程对象
    isAlive() # 线程是否存活

    • getName()
      from threading import Thread
      from threading import currentThread # 获取当前线程对象的 对象
      import time

    def task():
    print('%s is runing' %currentThread().getName()) # 获取线程名
    time.sleep(2)
    print('%s is down' % currentThread().getName())

    if name == 'main':
    t = Thread(target=task, name='这里设置子线程初始化名')
    t.start()
    t.setName('设置线程名') # !!!!
    t.join() # 等待子线程运行结束
    # currentThread() 等同于 线程对象t 所以获取线程名也可以t.getName()
    print('主线程', currentThread().getName())
    # 但在主线程内(并没有线程对象)要获取线程名必须用 currentThread().getName()
    t.isAlive() # 线程是否存活! 查看线程对象是否存活

    第二部分 可选题

    1. 如何获取列表中第二大的值?
    2. 简述Python内存管理机制。
    3. 简述Python的垃圾回收机制。
    4. 请用两个队列来实现一个栈。
    5. 请用Python实现一个链表。
    6. 请用Python实现链表的逆转。
  • 相关阅读:
    原码、反码、补码,计算机中负数的表示
    java 解惑系列
    (转载) 深入JVM学习笔记-安全性
    理解Java对象序列化
    关于Arrays.asList 函数的一些 陷阱
    JAVA设计模式之单例模式 (转载)
    Educational Codeforces Round 76 D
    总结
    bzoj3531: [Sdoi2014]旅行 (树链剖分 && 动态开点线段树)
    bzoj3626: [LNOI2014]LCA (树链剖分)
  • 原文地址:https://www.cnblogs.com/yly123/p/11910656.html
Copyright © 2020-2023  润新知