Python基础常见面试题

1、深拷贝和浅拷贝的区别是什么?
浅拷贝只会拷贝对象的第一层属性,如果这些属性是对象,则不会对这些对象进行拷贝,而是直接复制对象的引用。这意味着,对于浅拷贝后的对象,如果原对象的属性值发生了变化,浅拷贝后的对象的属性值也会跟着发生变化。”其实就是对象里边如果还有对象,浅拷贝之后,被拷贝的对象里边的这个对象只是个引用。当A对象里边的对象改变,B对象里边的对象也会受到影响

深拷贝时,会拷贝所有的属性,并且如果这些属性是对象,也会对这些对象进行深拷贝,直到最底层的基本数据类型为止。这意味着,对于深拷贝后的对象,即使原对象的属性值发生了变化,深拷贝后的对象的属性值也不会受到影响。

2、能否解释一下 *args 和 kwargs?

如果我们不知道将多少个参数传递给函数,比如当我们想传递一个列表或一个元组值时,就可以使用*args。
当我们不知道将会传入多少关键字参数时,使用**kwargs 会收集关键字参数。
2.1、arg和 *kwarg作用?
万能参数,解决了函数参数不固定的问题
*arg:会把位置参数转化为tuple(非键值对的参数组)
**kwarg:会把关键字参数转化为dict(键值对参数组)


3、lambda表达式格式以及应用场景?


lambda函数赋值给其他函数
表达式格式:lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。冒号前是参数,冒号后是返回值。例如:lambda x : 2x
**应用场景:**经常与一些内置函数相结合使用,比如说map(),filter(),sorted(),reduce()等


4、is和==的区别?


is:判断内存地址是否相等
==:判断数值是否相等

5、如何安装第三方模块?以及用过哪些第三方模块?
pip3 install 模块名

6、列举常用模块都有那些?
os,sys,time,random,hashlib,logging,json

7、简述 生成器、迭代器、可迭代对象 以及应用场景?


生成器:在 Python 中,一边循环一边计算的机制,称为生成(generator),通过next()取值,两种表现形式
1、将列表生成式的[]改为()
2、含有yield关键字的函数
应用场景:优化代码,节省内存
带有 yield 的函数在 Python 中被称之为 generator(生成器)

迭代器:是访问集合元素的一种方式。迭代器同时实现了__iter__和__next__方法
可迭代对象:只要实现了__iter__方法的对象就是可迭代对象


8、os和sys模块的作用?


os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

9、谈谈你对面向对象的理解?


面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,
不存在的也可以创造出来。对象是特征和技能的结合,其中特征和技能分别对应对象的数据属性和方法属性。
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,
面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。

10、Python面向对象中的继承有什么特点?

在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。
区别于在类中调用普通函数时并不需要带上self参数
Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

11、面向对象中super的作用?

super在面向对象继承类中代指父类,书写方法super(类名,self).属性或者方法或super().属性或者方法
super方法可以增加类之间调用的灵活性,当父类名发生变化时不必修改
super方法在类的多继承时可以简化代码,避免代码冗余
super机制里可以保证公共父类仅被执行一次,执行的顺序遵循MRO,广度优先查询方法


12、列举面向对象中带双下划线的特殊方法,如: new 、 init


new:构造方法,创建一个对象,实例化时第一个被执行,返回一个创建好的对象及__init__(self)的self,只有继承了object的类才会有这个方法
init:初始化方法,__init__在__new__的基础上完成一些其它初始化的动作,__init__没有返回值
 

13、常见的八个魔术方法


1.__init__方法:在创建对象的时候自动执行,常用来初始化属性
2.__new__方法:在声明对象的时候自动执行,在__init__方法前被调用
3.__str__方法:打印对象的名称时候调用,使用%s也是默认调用str,使用return返回,必须返回字符串,自动   打印return的信息
4.__repr__方法:改变对象的字符串显示,是str方法的备用方法,找不到str调用此方法,可以使用%r方法调用
5.__del__方法:当一个对象在内存被销毁时自动调用,无返回值
6.__call__方法:可以将对象变成函数使用,如a()
7.__eq__方法:可以进行比较
8.__hash__方法:一般和eq配合使用
 

14、反射方法

  • hasattr:判断是否由此变量,返回bool
  • getattr:获取属性值或者方法
  • setattr:给类或者对象设置属性或者方法
  • delattr:删除类或对象的属性或者方法

15、迭代器

迭代器两个基本方法,iter和next
可以将迭代对象通过iter方法变为迭代器对象,通过next每次输出
特点是可以记住遍历对象的位置,类似队列的机制
当迭代完成,继续next会报出StopIteration异常


16、生成器

使用了yield的函数被称为生成器,生成器就是一个迭代器
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行next() 方法时从当前位置继续运行。
yield和return不可以同时出现
 

17、进程、线程和协程


1.线程

定义:

CPU调度的最小单位,有时候也被称为轻量级进程;
标准线程由线程ID+指令指针+寄存器集合+堆栈组成;
特点:

没有独立资源,但是和同属于一个进程的其他线程共享同一个进程的全部资源;
同一个进程中的线程执行并发执行;
线程之间相互制约,因此有三种基本状态(就绪、阻塞、运行);
线程锁:

产生原因: 由于同一个进程中的线程共享资源和数据,因此容易资源争夺或出现脏数据,因此有了锁可以限制某一时候只有一个线程可以访问某个指定的数据;

互斥锁概念: 某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

互斥锁锁的好处:

确保了某段关键代码只能由一个线程从头到尾完整地执行
保证代码正常的情况下,尽量给最少的代码的上锁,因为上锁的代码只能以单线程执行,效率低
互斥锁锁的坏处:

阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁
互斥锁死锁:

定义:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
避免死锁:添加超时时间自动释放
GIL锁

产生原因:作为解释型语言,Python的解释器必须做到既安全又高效。数据的保护机制是是解释器全局锁GIL。GIL对当前线程状态和为垃圾回收而用的堆分配对象这样的东西的访问提供着保护。
**影响:**使我们我们不可随意使用多线程。
线程的通信通过队列

2.进程:

程序执行的最小单位;
每个进程都有自己独立的数据空间,不同进程之间通常是不能共享数据,创建一个进程需要非常大的开销。
进程之间的通信也可以使用队列;
一个进程中至少包含一个线程;
3.协程

线程和进程的操作是由程序触发系统接口,最后的执行者是系统,它本质上是操作系统提供的功能。而协程的操作则是程序员指定的,在python中通过yield,人为的实现并发处理。
存在意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时。协程,则只使用一个线程,分解一个线程成为多个“微线程”,在一个线程中规定某个代码块的执行顺序。
第三方模块: greenlet和gevent。gevent是对greenlet的高级封装,因此一般用它就行。
4.进程线程的区别

建议在IO密集型任务中使用多线程,在计算密集型任务中使用多进程。
进程与进程相互独立,同一个进程中的线程共享该进程的内存空间和数据。
线程启动速度快,进程启动速度慢。
通信都可以通过各自模块的队列进行。
同一个进程中的线程可以操其他线程,但是进程智能操作其他子进程。
 

18、如何在Python中生成随机数?

random模块是用于生成随机数的标准模块。该方法定义为:

  1. import random

  2. random.random

19、如何在Python中删除文件?

要在Python中删除文件,您需要导入OS模块。之后,您需要使用os.remove()函数。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟学识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值