面试中常被问到的python基础知识整理

为了找工作需求,我整理了一些常见的面试时被问到的python问题及回答,希望可以对你有所帮助。

参考博客:
1、https://blog.csdn.net/qq_42642945/article/details/89789524/
2、https://blog.csdn.net/weixin_40862231/article/details/79504455

1.python是什么?

  • python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言
  • python 一种解释性语言,意味着开发过程中没有编译这个环节,类似与PHP语言
  • python是交互式语言,可以在python提示符>>>后直接执行代码
  • python是面向对象,它支持面向对象的风格或代码封装在对象的编程技术。

2.python的优点及缺点

  • python适合面向对象的编程,因为它支持通过组合与继承的方式定义类
  • python简洁、简单、方便、可移植、容易扩展,有许多自带的数据结构,代码编写快,用途广泛
  • 缺点是运行速度慢

3.python中is和==的区别

  • python中对象包含三个基本要素,分别是id、type和value
  • == 比较的是value
  • is 比较的是id,就是看两个对象指向的内存地址是否一样

4.简述read、readline和readlines的区别

  • read 读取整个文件
  • readline 读取下一行数据
  • readlines 读取整个文件到一个list中

5.python是怎样管理内存的?

  • python的内存管理是由私有heap空间管理的。所有的python对象和数据结构都在一个私有heap中。程序员没有访问heap的权限,只有解释器才能对他进行操作。为python的heap空间分配内存是由python的内存管理模块进行的,其核心API会提供一些访问该模块的方法供程序员使用。python有自带的垃圾回收系统,它回收并释放没有被使用的内存,让它们能够被其他程序使用。

6.python中match和search的区别?

  • match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配。也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none

7.python中的标识符

  • 第一个字符必须是字母或下划线_
  • 标识符中其他的部分由字母、数字和下划线组成。
  • 标识符对大小写敏感

8.python中的保留字

  • 保留字即关键字,不能用作任何标识符名称。

9.python的数字类型和字符串

  • 数字类型有4种:整数、布尔型、浮点数和复数
  • python中的字符串用 ’ 或 " 括起来,不能重复,索引从0开始,用+运算符连接,用*重复,
    截取:变量[头下标:尾下标:步长]

10.print输出

  • python默认输出是换行的,如果要实现不换行需要在变量末尾加上end=" "

11.python的标准数据类型

  • 数字、字符串、列表、字典、元组、集合
  • 不可变数据:数字、字符串、元组
  • 可变数据:列表、字典、集合
  • 可以用内置的type()来查询变量所指的对象类型

12.isinstance和type的区别

  • type()不会认为子类是一种父类类型
  • isinstance()会认为子类是一种父类类型

13.数字类型

  • 数字数据类型不允许改变,如果改变数字数据类型的值,将重新分配内存空间

14.字符串

  • 在python中所有的字符串都是unicode字符串

15.列表

  • 列表的数据项不需要具有相同的类型,只需要把逗号分隔的不同数据项使用方括号括起来即可。索引从0开始,列表可以进行截取([ a : b ])和组合(+ / *)。

16.元组

  • 元组使用小括号,且元组不能修改(指的是元组所指向的内存中的内容不可变),只需要在括号中添加元素,并使用逗号隔开。
  • 当元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当做运算符使用
  • 元组拼接可以用 + 。元组中的元素不可以删除,但可以用del语句来删除整个元组。

17.字典

  • 字典可以存储任意类型对象
  • 字典的每个键值key => value对用冒号:分割,每个对之间用逗号,分割,整个字典包括在花括号{ }中
  • 键必须时唯一的,但值则不必,值可以取任意数据类型,但键必须时不可变的,如字符串,数字。
  • 字典中添加新内容,dict = {’name‘:1,’age‘:2},dict[ ‘class’ ] = " 5 "
  • 注意:不允许同一个键出现两次,创建时如果同一个键被赋值两次,后一个值会被记住;键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行。

18.集合

  • 集合set是一个无序的不重复元素序列,可以使用大括号或者set()函数创建集合,创建一个空集合必须用set()而不是{ }
  • 集合添加元素用s.add(x)或者s.update(x,a,b);移除元素用s.remove(x)或者是s.discard(x)

19.pass语句

  • python中的pass是空语句,是为了保持程序结构的完整性,不做任何事情,一般用做占位语句

20.迭代器和生成器

  • 迭代时访问集合元素的一种方式,也是一个可以记住遍历的位置的对象,从集合的第一个元素开始访问,直到所有的元素被访问完结束

  • 迭代器有两种方法:iter()和next(),字符串、列表或元组对象都可用于创建迭代器

  • 把一个类作为一个迭代器使用需要在类中实现两个方法__iter__()与__next__()

  • 生成器:在python中yield的函数被称为生成器,生成器是一个返回迭代器的函数,只能用于迭代操作。在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。

21.调用函数时的参数

  • 参数类型包括:必需参数、关键字参数、默认参数、不定长参数

22. __name__属性

  • 如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在模块自身运行时执行,当其值是’main’时,表明该模块自身在运行,否则是被引入。

23.python中的lambda是什么?

  • python使用lambda来创建匿名函数,意思是不再使用def语句这样标准的形式定义一个函数

24.为什么lambda没有语句?

  • lambda的主体是一个表达式,不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去。lambda拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数

9.什么是picking和unpicking?

  • pickle模块读入任何python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中—这个过程叫pickling。
  • 反之,从存储的字符串文件中提取原始python对象的过程,叫做unpicking。

10.线程中start方法和run方法的区别?

  • 若调用start,则先执行主进程,后执行子进程
  • 若调用run,相当于正常的函数调用,按照程序的顺序执行

11.描述yield作用

  • 保存当前运行状态(断点),然后暂停执行,即将函数挂起
  • 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用,当使用next()、send()函数让函数从断点处继续执行,既唤醒函数。

12.python装饰器

  • 装饰器本质上是一个python,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
  • 功能:1、引入日志;2、函数执行时间统计;3、执行函数前预备处理;4、执行函数后清理功能;5、权限校验;6、缓存

13.对多线程和多进程的理解

  • 1、进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享过程所拥有的全部资源
  • 2、一个程序至少有一个进程,一个进程至少有一个线程
  • 3、线程的划分尺度小于进程,使得多线程程序的并发性高
  • 4、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  • 5、线程不能够独立执行,必须依存在进程中

14.有哪些工具可以帮助debug或做静态分析?

  • PyChecker是一个静态分析工具,它不仅能报告源代码中的错误,并且会报告错误类型和复杂度。Pylint是检验模块是否达到代码标准的另一个工具。

15.python如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

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

16.介绍一下except的用法和作用?

  • 捕获try except中间代码发生的异常,如果发生异常执行except的代码,不管是否发生异常都执行finally中的代码
  • except可以有0个或多个,如果有多个从上到下依次根据异常类型匹配,匹配到某个exception就执行对应的except中代码

17.数组和元组之间的区别

  • 数组内容是可以修改的,而元组内容是只读的。
  • 元组可以被哈希(基本原理是把任意长度的输入,通过hash算法变成固定长度的输出),比如作为字典的关键字

18.参数按值传递和引用传递是怎样实现的?

  • python中的一切都是类,所有的变量都是一个对象的引用。引用的值是由函数确定的,因此无法被改变。但是如果一个对象是可以被修改的,你可以改动对象。

19.字典推导式和列表推导式是什么?

  • 它们是可以轻松创建字典和列表的语法结构

20.python都有哪些自带的数据结构

  • python自带的数据结构分可变和不可变的。可变的包括:列表,集合,字典;不可变的包括字符串,元组,数。

21.什么是python的命名空间?

  • 命名空间是一个命名系统,用于确保名称是唯一性,以避免命名冲突。但不同的命名空间可以重名。它就像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象。

25.python中什么是遍历器?

  • 遍历器用于遍历一组元素,比如列表这样的容器。

26.python中的docstring是什么?

  • python中文档字符串被称为docstring,它再python中的作用是为函数,模块和类注释生成文档。

27.如何在python中拷贝一个对象?

  • 如果要在python中拷贝一个对象,大多时候你可以用copy.copy()或者copy.deepcopy()。但并不是所有的对象都可以被拷贝。

28.python中的负索引是什么?

  • python中的序列可以是正也可以是负。如果是正索引,0是序列中的第一个索引,1是第二个索引。如果是负索引,(-1)是最后一个索引而(-2)是倒数第二个索引。

29.如何将一个数字转换成一个字符串?

  • 可以使用自带函数str()将一个数字转换成字符串。如果你想要八进制或者十六进制数,可以用cot()或hex()。

30.xrange和range的区别是什么?

  • Xrange用于返回一个xrange对象,而range用于返回一个数组。不管那个范围多大,xrange都使用同样的内存。

31.python中的模块和包是什么?有哪些常用内置模块?

  • 在python中,模块是搭建程序的一种方式。每一个python代码文件都是一个模块,并可以引用其他的模块,比如对象和属性。
  • 一个包含许多python代码的文件夹是一个包。一个包可以包含模块和子文件夹。
  • 常用内置模块:os,sys,math,random,data time,json

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

  • <.*>匹配结果是:HTML tag;
  • <.*?>匹配到的结果是:""。 ? 表示非贪婪,搜到符合的结果既返回

33.python中字符串替换

  • 用str.replace()

34.python中的正则表达式是什么?

  • 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使python语言拥有全部的正则表达式功能。compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象,该对象拥有一系列方法用于正则表达式匹配和替换。

35.re模块中match和search方法的不同

  • match函数只检查re是否在字符串开始出匹配
  • research则是扫描整个字符串

36.列表a的正序排列、倒序排列、逆序排列的内置方法

  • 正序:a.sort
  • 倒序:a.sort(reverse = True)
  • 逆序:a.reverse()

37.os模块和sys模块

  • os模块:os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果。
  • sys模块:是一个与python解释器交互的一个接口,用来给命令行传参。

38.os.path和sys.path的区别

  • os.path是module,包含了各种处理长文件名(路径名)的函数
  • sys.path是由目录名构成的列表,python从中查找扩展模块。

39.python中合并列表a=[1,2],b[2,3]

  • a.extend(b)

40.请阐述_new_和_init_的区别

  • new:创建对象时调用,会返回当前对象的一个实例
  • init:创建完对象后调用,对当前对象的一些实例初始化,无返回值
  • 调用顺序:先调用_new_生成一个实例再调用_init_对实例进行初始化,比如添加属性。

41.什么是python的生成器?

  • python生成器是一个可以迭代对象的函数,可以被用作控制循环的迭代行为。生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,一般的函数会返回包括所有数值的数组,生成器一次只能返回一个值,这样消耗的内存将会大大减少。

42.python方法解析顺序

  • python的方法解析顺序优先级从高到低。实例本身→类→继承类(继承关系越近,越先定义,优先级越高)

43.python中dict和list的区别,dict的内部实现

  • dict查找速度快,占用的内存较大。list查找速度慢,占用内存较小。
  • dict不能用来存储有序集合
  • dict用{ }表示,list用[ ]表示
  • dict是通过hash表实现的,dict为一个数组,数组的索引键是通过hash函数处理后得到的,hash函数的目的是使键值均匀的分布在数组中。

44.python多进程

  • 方式一:os.fork()
  • 方式二:使用multiprocessing模块:创建python的实例,传入任务执行函数作为参考
  • 方式三:使用multiprocessing模块:派生process的子类,重写run方法
  • 方式四:使用进程池Pool

45.python中的各种锁

  • 1、全局解释器锁(GIL)
    每个CPU在同一时间只能执行一个线程,那么其他的线程就必须等待该线程的全局解释器,使用权消失后才能使用GIL,即时多个线程直接不会相互影响在同一个线程下也只有一个线程使用CPU,这样的机制称为GIL。GIL的设计简化了Cpython的实现,使得对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,锁住全局解释器使得比较容易的实现对多线程的支持,但也损失了多处理器主机的并行计算能力。
    GIL的好处
    1)避免了大量的加锁解锁的好处
    2)使数据更加安全,解决多线程间的数据完整性和状态同步
    GIL的缺点
    多核处理器退化成单核处理器,只能并发不能并行
    GIL的作用
    多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(CPU)。
  • 2、同步锁
    同一时刻的进程下的一个线程只能使用一个CPU,要确保这个线程下的程序在一段时间内被CPU执行,那么就要用到同步锁。
    1)为什么用同步锁?
    因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程序结果的完整性。
    2)怎么使用同步锁?
    只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。
    3)同步锁的作用?
    为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。
  • 3、死锁
    指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源或者程序推进顺序不当而相互等待的一个现象。
    1)死锁产生的必要条件?
    互斥条件、请求和保持条件、不剥夺条件、环路等待条件。
    2)处理死锁的基本方法?
    预防死锁、避免死锁(银行家算法)、检测死锁(资源分配)、解除死锁(剥夺资源、撤销进程)
  • 4、递归锁
    在python中为了支持同一个线程中多次请求同一资源,python提供了可重入锁。这个Rlock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。递归锁分为可递归锁与非递归锁。
  • 5、乐观锁
    假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
  • 6、悲观锁
    假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。

46.python常用的加锁方式

  • 互斥锁、可重入锁、迭代死锁、互相调用死锁、自旋锁。

47.待续。。

你可能感兴趣的:(python,面试)