python基础面试题

1.python有哪些解释器?

CPython:默认的并且是使用最广泛的python编译器,使用C语言编写,并且使用了全局解释器锁GIL

IPython:基于CPython之上的一个交互式解释器,其余功能与CPython完全一样

PyPy:python的另一个解释器,主要目标的执行速度

Jython:运行在java平台上的python解释器,可以直接把python代码编译成Java字节码执行

2.python中 list和set的区别,list和tuple的区别是什么?

list与set的区别:list为有序项目集合,set为无序项目集合;list中可以存放任何数据类型,set存放的元素为不可变数据类型;set中元素唯一,天生去重,list中存放的元素可以重复

list与tuple的区别:list为可变数据类型,set为不可变数据类型,无法进行增删改查的操作,只能进行整体替换;由于list为可变数据类型,所以list不能作为dict的key值,而set可以;定义时,list使用方括号,set使用圆括号定义,并且set中只有一个元素时,要在后面加上一个逗号;存储上,空list比空set多占用16字节

3.python中dict的实现原理以及dict的特点。

dict有一下几个特点:键值(key-value)映射的数据结构,key值必须是不可变数据类型(可hash对象)且唯一,value值可以是任何值;dict为无序项目集合,没有直接的index索引;dict为可变数据类型

dict底层维护一张哈希表,哈希表中的每一个元素又存储了哈希值、key、value3个元素,假设要在dict中增加一个元素,首先会计算key的hash值,再跟mask做与操作(mask=字典最小长度-1)得到要插入哈希表中的下标位置index,如果这个index位置已经被占用,就会去判断这个位置的key值是否与要插入的key值相同,若相等就表示key已存在,更新value值;若不相等,就表示hsah冲突,继续向下寻找空位,一直到找到剩余空位为止。

在python3.7+后,引入的新的实现方法,新字典添加了一张表来进行辅助,使得字典可以有序。

4.python中哪些是可变数据类型,哪些是不可变数据类型

可变数据类型包括列表、字典、集合

不可变数据类型包括整型、字符串、浮点数、布尔型、元组

5.python中怎么打开文件,读取的方式有哪些?

python中内置了打开文件的open()函数,读写文件就是请求操作系统打开一个文件描述符,然后通过操作系统提供的接口从这个文件描述符中读取数据或者把数据写入文件对象。在打开文件时我们一般使用with open语句打开文件,因为with语句会帮助我们自动调用close方法

读取文件的方式包括read()--读取全部文件内容;read(size)每次读取指定size个字节内容;readline()每次读取一行内容;readlines()读取全部内容,但返回结果是一个列表,其中的每个元素是每行的内容

6.python的内存管理

python是通过引用计数来保存内存中的变量追踪,就是记录对象被其他使用的对象引用的次数

python的垃圾回收机制是采用引用计数为主,标记清除和分代回收为辅的垃圾回收方式

7.什么是深浅拷贝

深浅拷贝只有在容器类型中包含可变数据类型的时候才会有区别

浅拷贝只会拷贝最外层数据的引用,它里面可变数据类型的改变会影响原对象

深拷贝会对容器类型里面的可变数据类型做一次全新的copy,只会拷贝值,生成一个全新的可变数据类型,它里面的修改不会影响原对象

8.python中操作数据库用什么库,正则表达式用什么库?

python中使用pymysql库去连接操作数据库,在使用前需要使用pip去安装pymysql库

python中使用正则表达式要导入re库,正则表达式通常被用来检索查找、替换那些符合某个规则的文本

9.python面向对象,什么是类?什么是对象?经典类和新式类的区别?

面向对象中的两个重要的概念:类和对象。类就是具有相同属性(描述对象的具体信息)或方法(对象具备的功能)的对象的集合;对象就是一个实实在在的例子,某个类实例化之后的结构体

直接calss [calss_name]的是经典类,新式类是继承了python的内置类的类。类型区别:经典类通过type函数查看到的类型是instance,实例和类的关系只能通过__class__属性获得;新式类可以通过type函数直接查看它属于哪个类;它们两者最大的区别还是继承顺序的区别:经典类的继承顺序是深度优先,新式类的继承顺序是采用c3算法

10.什么是魔术方法?用过哪些魔术方法?

魔术方法是不需要显示调用,某种情况下自动执行的方法,魔术方法都是以双下划线开头、双下划线结尾的方法

使用过__del__析构函数:通常用于一些一些收尾工作,如关闭数据库的连接,关闭临时打开的文件等;__init___方法:类会自动创建该方法,每创建类的新实例时都会自动执行;__call__调用方法:把实例化后的对象当做函数调用的时候自动执行;__str__ __repr__方法:返回对象的描述信息

11.python 中 yield有什么用? 生成器的作用是什么

yield是python中的一个关键字,它的作用是返回一个可以用来迭代的生成器,它通常应用于一个需要返回一系列值的、含有循环的函数中

python中使用了yield关键字的函数就称为生成器函数,它可以在迭代的过程中逐步产生值,而不是一次性返回所有的结果,生成器是迭代器更加优雅的写法,不需要手动实现__iter__和__next__方法,可以用更少的代码来实现迭代器的效果

12.什么是装饰器?用过哪些python自带的装饰器?

装饰器是一种程序设计模式,主要用于在不改变函数或类源代码的基础上添加一些额外功能,装饰器本质就是闭包函数,它需要把一个callable对象作为参数传入

使用过@classmethod装饰器,被@classmethod装饰的方法就是类方法,方法传入的第一个参数就是cls类;@staticmethod装饰器改变一个方法为静态方法,静态方法可以传递参数也可以不传递参数

13.什么是进程、线程、协程?python中使用多线程或多进程的库是什么?怎么进行通信?

进程是正在运行的程序,是系统进行资源分配(CPU时间片、内存等资源)的最小单位;线程运行在进程之上,是操作系统进行调度的最小单位;协程是一种用户态的轻量级线程,协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈

python中使用多线程的库是threading,使用多进程的库是multiprocessing

同个进程内的线程是可以直接交流的,同进程内的线程可以直接共享数据。进程之间的通信方式有管道、消息队列、共享内存、信号量、信号、socket套接字的方式进行通信

14.什么是GIL?

GIL是全局解释器锁,是CPython解释器的历史遗留问题,是在解释器层面的互斥锁,用来阻止同一个进程下多个线程同时执行,即保证了同一时刻同一进程内只有一个线程能够运行,它的基本行为为:当前执行的线程必须要有全局解释器锁,当遇到io阻塞或者是cpu时间片到了,才会释放全局解释器锁

15.如何跨模块共享全局变量?

在python中如果需要使用跨模块全局变量,可以在单独模块中进行定义,然后在需要的模块中import加载即可以访问及修改

16.python中is和==号的区别是什么?

is用于比较两个对象的标识是否相同,即比较id是否相同

双等于号用于比较两个对象的值是否相等

17.面向对象的三大特性

封装:将属性和方法封装成类,不关心具体的实现,只关心如何去用

继承:代码共用,提高代码的重用率

多态:就是一个接口的不同形态,主要是实现接口的重用

18.闭包的三个条件

1.必须要有内外函数

2.外函数必须返回内函数

3.内函数必须引用外函数的变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值