25道Python经典面试题大全,看这一篇就够了

1、什么是值传递、引用传递?


值传递是传递变量的值,不会改变函数外面变量的值。不可变对象(比如strings, tuples, 和numbers)用的是值传递。


引用传递是传递对象的地址,会改变对象本身的值,可变对象(比如list, dict, set)用的是引用传递。


2、什么是实参、形参?


形式传参:在定义函数时,函数名后面括号中的参数为“形式参数”,也称为形参。


实际参数:在调用函数时,函数名后面括号中的参数为“实际参数”,也称为实参。

3、下面这个代码,最终输出的结果是多少?为什么?

答案:


输出结果是1,因为a = 1,是Number类型的对象。Number属于不可变对象,这样实参的值传给形参的时候,会使用值传递,只会用实参的值来初始化形参的存储单元,也就是说实参和形参会是两个不同的存储单元,所以函数里面进行的赋值操作,不会改变函数外面变量的值。


4、什么是元类?


所有对象都是实例化或者调用类而得到的,python中一切都是对象,通过class关键字定义的类本质也是对象,对象又是通过调用类得到的,因此通过class关键字定义的类肯定也是调用了一个类得到的,这个类就是元类。type就是Python内置的元类。


5、在python中,什么是构造函数?


在创建类时,我们可以手动添加一个 __init__() 方法,该方法是一个特殊的类实例方法,称为构造方法(或构造函数)。

构造方法用于创建对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调用它。


6、类变量和实例变量


类变量:是可以在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。例如下例中,num_of_instance 就是类变量,用于跟踪存在着多少个Test 的实例。

实例变量:实例化之后,每个实例单独拥有的变量。


7、讲讲Python的静态方法、类方法、实例方法

实例方法:既可以获取构造函数定义的变量,也可以获取类的属性值,只能通过实例调用。


类方法:通过装饰器@calssmethod进行修饰。不能获取构造函数定义的变量,可以获取类的属性。有两种调用方式,a.类名.类方法名 b.实例化调用。它传递的是类而不是实例。


静态方法:通过装饰器@staticmethod进行修饰。不能获取构造函数定义的变量,也不可以获取类的属性。有两种调用方式,a.类名.静态方法名 b.实例化调用。


8、什么是Python自省?


在计算机编程领域里,自省是指程序运行时判断对象的类型的能力。它是Python的强项之一。


Python中比较常见的自省函数有:

type(),dir(),getattr(),hasattr(),isinstance(),通过这些函数我们能够在程序运行时获知对象的类型,判断对象的属性


9、列表推导式


推导式是python是一种独特的数据处理方式,Python中有三种推导式,分别是列表推导式、字典推导式和集合推导式。


列表推导式又叫列表生成式。

格式:[表达式 for 变量 in 列表 if 条件]


10、字典推导式


字典推导式在Python2.7中才加入的:

格式:{key: value for (key, value) in 字典}

11、Python中单下划线和双下划线


__foo__:是Python内部名字的约定,用来区别其他用户自定义的命名,以防冲突,例如__init__(),__del__(),__call__()这些特殊方法;


_foo:用来指定变量私有。不能用from module import * 导入,其他方面和公有一样访问;


__foo:解析器用_classname__foo来代替这个名字,用来区别和其他类相同的命名,它无法直接像公有成员一样随便访问,通过对象名._classname__foo来访问。


12、将列表生成式中[]改成()之后数据结构是否改变?


会改变,会从列表变为生成器。


通过列表生成式,可以直接创建一个列表。但是,受到内存限制,列表容量是有限的。并且创建一个包含百万元素的列表,会占用很大的内存空间。如果我们只需要访问前面的几个元素,后面大部分元素所占的空间都是浪费的,所以没有必要创建完整的列表。在Python中,我们可以采用生成器:边循环,边计算。

13、什么是Python迭代器iterator?


迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 可以通过iter()来创建迭代器,通过next()获取下一个元素。

14、迭代器与列表的区别


(1)列表不论遍历多少次,表头位置始终是第一个元素;

(2)迭代器遍历结束后,不再指向原来的表头位置,而是为最后元素的下一个位置;

(3)列表可以通过内置函数iter()包装成迭代器。

15、什么是python生成器generator?


生成器就是一种一边使用一边计算的机制,使用第n个元素,则只需要生成前n元素。


如果我们使用其他可迭代对象处理庞大的数据时,会申请存储整个可迭代对象的内存,占用很大的内存空间,有的时候我们只需要访问前面几个元素,有的元素当前我们用不到,但它却一直占用这内存,非常浪费。


这时候就体现了生成器的优点了,它不是一次性把所有的结果都返回,而是当我们每读取一次,它会返回一个结果,当我们不读取时,它就是一个生成器表达式,几乎不占用内存。


16、生成器的工作原理


在调用生成器的过程中,遇到yield会暂停并保存运行信息,然后返回yield的值。


并在下一次执行next()方法时从当前位置继续运行。调用一个生成器函数,返回一个迭代器对象。


17、说说Python中迭代器和生成器的区别?


(1)生成器就是一种特殊的迭代器,能做到迭代器能做的所有事

(2)生成器是高效的,使用生成器表达式取代列表解析,会非常节省内存

(3)生成器除了创建和保持程序状态的自动生成,当发生器终结时,还会自动跑出StopIterration异常。


18、yeild 与 return的区别


相同点:都是返回函数执行的结果。


不同点:return 在返回结果后结束函数的运行,而yield 则是让函数变成一个生成器,生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。


19、for循环的原理 


先调用可迭代对象的__iter__方法,返回一个迭代器,然后再对迭代器调用__next__方法,直到最后一个退出。


20、range()返回的是迭代器吗?


不是,Python3中,range() 返回的是一个可迭代对象,不是迭代器,也不是列表类型。


21、range对象是怎样占用内存的?


不管range对象表示的整数序列有多长,所有range对象占用的内存空间都是相同的,因为仅仅需要存储start、stop和step,只有用到range对象时,才会去计算序列中的相关元素。


22、(i for i in range(5))  内存是一起开辟的吗?


不是一起开辟的,这是列表生成式,返回的是生成器,生成器是边循环边运行,不是一次性把所有的结果都返回。


23、python2和python3的range(100)的区别?


python2返回列表,python3返回迭代器对象,节省内存。


24、为什么使用* args,** kwargs?


当我们不确定将多少个参数传递给函数,或者我们想要将存储的列表或参数元组传递给函数时,我们使用* args。


当我们不知道将多少关键字参数传递给函数时使用** kwargs,或者它可以用于将字典的值作为关键字参数传递。


标识符args和kwargs是一个约定,你也可以使用* bob和** billy。


25、面向切面编程AOP和装饰器


装饰器的作用就是为已经存在的对象添加额外的功能。 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。


装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。


本次的内容大致的就介绍到这里拉,由于内容太多,只能简单介绍到这里,如有需要以上内容的完整版,大家可以私信我获取哦~~后台关注我后私信回复:【08】即可获取
#面试##Python##金九银十##后端#
全部评论
楼主你分享了不少好东西啊
点赞 回复 分享
发布于 2022-09-25 12:51 陕西

相关推荐

#我和xx公司的爱恨情仇# 怎么会有这么**的公司!实习ld跟我说,在这实习秋招会有很大优势,没太大问题;线下一面二面水的很,手撕都是easy,二面面试官甚至说,你随便手撕个题目就行,找个代码量多的题目,然后我写了一个bfs图算法。主管面也是基本上纯聊天,然后甚至问我预期薪资,我说虽然我有互联网公司offer但是更想来华子,认可企业文化。面试完后,保温电话说根据面评开14a没问题,过了一段时间后去问了对接人,先说11月底开,后来说12月底开,昨天去问,他说你不是签了美团了吗,我们已经发完全部offer了。tmd那你不早说,我还在这等。我问了我们这个部门的其他实习生(三级部门下8个实习生,我们四级部门下就有5个,按理说我们部门应该缺人吧),结果其他实习生全军覆没,之前都收到降温电话要签个其他offer保底,实习生中甚至有人空白三方在allin华子,最逆天的是,其中一个是优秀实习生,他也没开出来。问那个优秀实习生,他说他在这实习时接口人天天给他洗脑说,在这实习只有不想来的,没有泡不出来的(如图1)。我接口人也是这么跟我说的,说我们2012实验室下面都偏预研,部门加班少,我们部门确实还行,而且本身华为比互联网稳定,后期还有股票,退休保留股票一直分红(补充:只有5%的人可以熬到40岁以上退休分股),你看看华为那么多od,人家为什么社招想来华为当od呢,因为华为真的稳定啊(后来想想他们来当od应该是没有更好的选择了吧,xhs上那个清华姚班都来华为当od)。我跟几个实习生已经转投其他部门了,那个优秀实习生去找别的部门hr时,人家问:你优秀实习生也要换部门吗,没遇到你这种情况之前为了选华为还是美团我还纠结了1个多月,现在想想真**,这**公司谁来谁知道,华子稳定个**,这里补充一下,35岁下岗就是华子最早提出来的。还有华为内部转岗的事,后来问了下很多大公司都可以内转,华子内转还要背绩效,去新部门会有很大绩效压力,原部门绩效太差还不能转,****。这**泡池子机制也是遥遥领先,其他互联网公司纷纷效仿。还有那5%公积金真恶心。之前认识一个腾讯提前批哥们,他杭电本科生,hr打电话还恶心他,给他开13a,总包比腾讯少20w,跟他说一大堆什么企业稳定,前景好,技术遥遥领先(图2)另外,还有个签约阿里被华为恶心的(图3)我和腾讯提前批的哥们的故事是真的,可以保证确有其事,图3是道听途说,不保证真实性,但我觉得这**公司真有可能发生这种诈骗故事
好吃的麦乐鸡块:这公司真的恶心,毫无信誉可言
点赞 评论 收藏
分享
评论
4
26
分享
牛客网
牛客企业服务