Python 2022年面试题总结(2)

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)Python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


除此之外,元组占用的内存空间更小:



a = [1, 2, 3, 4, 5, 6]
print(‘列表的空间大小为:’, a.sizeof())
b = (1, 2, 3, 4, 5, 6)
print(‘元组的空间大小为:’, b.sizeof())


输出结果



列表的空间大小为: 136
元组的空间大小为: 72


元组可以作为字典的key,而列表不能:


列表作为字典的key时会报错!



a = {[‘a’]:1}


输出结果



TypeError: unhashable type: ‘list’


元组作为字典的key时则不会报错



a = {(‘a’,):1}


另外,元组的元素必须用逗号分隔,哪怕只有一个元素:


(‘a’,)  
 元组和列表的区别总结如下:


元组内存地址不可变,列表内存地址可变;  
 元组占用空间比列表更少;  
 元组是不可变参数,所以可以作为字段的key,而列表(可变参数)不能;  
 元组的元素必须用逗号分隔,哪怕只有一个元素;  
 **7)如何在一个函数内部修改全局变量**  
 可以使用global修改:



a = 1

def test():
globals()[‘a’] = 2

print(‘原来的a值:’, a)
test()
print(‘修改后的a值:’, a)


输出结果



原来的a值: 1
修改后的a值: 2


函数也可以改成这样:



def test():
global a
a=2


**8)解释一下Python的GIL**  
 GlL是 python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占 python解释器(加了一把锁即GIL),使该进程內的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。多进程中因为每个进程都能被系统分配资源,相当于每个进程有了ー个 python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大。


**9)Python列表去重**  
 通过集合的方式去重:



a = [1, 2, 2, 3, 3, 6]
a = set(a) # 先转为集合进行去重
a = list(a) # 然后再转换为列表
print(‘去重后的列表’, a)


手写去重代码:



a = [1, 2, 2, 4, 4, 6, 7]
b = []
for i in a:
if i not in b:
b.append(i)

print(‘去重后的列表’, b)


**10)列出 python中可变数据类型和不可变数据类型,并简述原理**  
 不可变数据类型:数值型(int)、字符串型(str)和元组(tuple)不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址):



a = 3
b = 3
print(‘a的内存地址为’, id(a))
print(‘b的内存地址为’, id(b))


输出结果



a的内存地址为 1658574891376
b的内存地址为 1658574891376


可变数据类型:列表(list)和字典(dict),允许变量的值发生变化,即如果对变量进行 append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象:



a = [1,2]
b = [1,2]
print(‘a的内存地址为’, id(a))
print(‘b的内存地址为’, id(b))


输出结果



a的内存地址为 2122512488768
b的内存地址为 2122512662720
6)python2和 python3区别
Python3使用 print必须要以小括号包裹打印内容,而在Python2既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容:
print(“hello world”) #pyton3和python2都可
print “hello world” #python2
python2 range(1,10)返回列表, python3中返回迭代器,节约内存;
python2中使用asci编码, python中使用utf-8编码;
python2中 unicode表示字符串序列,str表示字节序列python3中st表示字符串序列,byte表示字节序列 ;
python2中为正常显示中文,引入 coding声明, python3中不需要;
python2中是 raw input0函数, python3中是 Input0函数;


**11)python中内置的数据结构有几种**  
 整型 int、 长整型 long、浮点型 float、 复数 complex  
 字符串 str、 列表 list、 元祖 tuple  
 字典 dict 、 集合 set  
 Python3 中没有 long,只有无限精度的 int  
 **12)下面代码的输出结果将是什么**



a = [1,2]
print(a[3:])


代码将输出[],不会产生IndexError错误,就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表。这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致Bug很难被追踪到。


\**13)Python代码中\_args, *\_kwargs 含义及用法?**  
 args: arguments 的缩写,表示位置参数


kwargs: keyword arguments 的缩写,表示关键字参数


**14)请列出 5 个 python 标准库?**  
 os:提供了不少与操作系统相关联的函数  
 sys: 通常用于命令行参数  
 re: 正则匹配  
 math: 数学运算  
 datetime:处理日期时间  
 **15)Python的可变数据类型和不可变数据类型分别有?**  
 可变数据类型:列表、字典、集合


不可变数据类型:数字、字符串、元组


**16)Python 中魔法方法和其用途?**  
 **init**:对象初始化方法


**new**:创建对象时候执行的方法,单列模式会用到


**str**:当使用print输出对象的时候,只要自己定义了\_\_str\_\_(self)方法,那么就会打印从在这个方法中return的数据


**del**:删除对象执行的方法


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


**18)简述Python引用计数机制?**  
 python垃圾回收主要以引用计数为主,标记-清除和分代清除为辅的机制,其中标记-清除和分代回收主要是为了处理循环引用的难题。


**19)Python赋值、浅拷贝和深拷贝的区别?**  
 Python 有 3 种赋值方式:直接赋值、浅拷贝、深拷贝;


直接赋值:就是对象的引用。(相当于给原来的对象起个别名),比如有个人叫张三,外号叫小张,对象的引用就是类似,虽然换个名字,但是两个名字指的是同一个人。


浅拷贝,拷贝的是父对象,不会拷贝到内部的子对象。(单从浅字就可以看出拷贝的东西不深,可以理解为只拷贝一层) { 1、完全切片方法;2、工厂函数,如 list();3、copy 模块的 copy()函数 }


深拷贝,包含对象里面的自对象的拷贝(可以理解为克隆,全拷贝过去但是两者没有任何关系了,各自是各自的);所以原始对象的改变不会造成深拷贝里任何子元素的改变 { copy 模块的 deep.deepcopy()函数 }


请阐述在Python中split(),sub(),subn()的功能分别是什么?  
 split(): 使用正则表达式模式将给定字符串“拆分”到列表中。


sub(): 查找正则表达式模式匹配的所有子字符串,然后用不同的字符串替换它们


subn(): 它类似于sub(),并且还返回新字符串。


**20)举例 sort 和 sorted方法的区别?**  
 使用 sort()方法对 list 排序会修改 list 本身,不会返回新 list,sort()不能对 dict 字典进行排序;


sorted 方法对可迭代的序列排序生成新的序列,对 dict 排序默认会按照 dict 的 key 值进行排序,最后返回的结果是一个对 key 值排序好的list;


sorted 对 tuple, dict 依然有效,而 sort 不行;


**21)解释 Python 中的可变类型和不可变类型?**  
 1.Python中的可变类型有list,dict;不可变类型有string,number,tuple.


2.当进行修改操作时,可变类型传递的是内存中的地址,也就是说,直接修改内存中的值,并没有开辟新的内存。


3.不可变类型被改变时,并没有改变原内存地址中的值,而是开辟一块新的内存,将原地址中的值复制过去,对这块新开辟的内存中的值进行操作。


**22)Python 中类方法、类实例方法、静态方法有何区别?**  
 类方法: 是类对象的方法,在定义时需要在上方使用 @classmethod 进行装饰,形参为cls,表示类对象,类对象和实例对象都可调用


类实例方法: 是类实例化对象的方法,只能由实例对象调用,形参为self,指代对象本身;


静态方法: 是一个任意函数,在其上方使用 @staticmethod 进行装饰,实例对象和类对象都可以调用。但是方法体中不能使用类或实例的任何属性和方法。


### 二. 企业面试题


**6)python新式类和经典类的区别**


在python里凡是继承了object的类,都是新式类  
 Python3里只有新式类  
 Python2里面继承object的是新式类,没有写父类的是经典类  
 经典类目前在Python里基本没有应用  
 保持class与type的统一对新式类的实例执行a.class与type(a)的结果是一致的,对于旧式类来说就不一样了。  
 对于多重继承的属性搜索顺序不一样新式类是采用广度优先搜索,旧式类采用深度优先搜索。  
 **7)python中内置的数据结构有几种**


整型 int、 长整型 long、浮点型 float、 复数 complex  
 字符串 str、 列表 list、 元祖 tuple  
 字典 dict 、 集合 set  
 Python3 中没有 long,只有无限精度的 int  
 **8)python如何实现单例模式?请写出两种实现方式  
 8.1 第一种方法:使用装饰器**



def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class Foo(object):
pass
foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2) # True

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值