1.Python中的不可变数据类型和可变数据类型是什么意思?
可变数据类型:改变值但是内存地址不发生改变,list(列表)、dict(字典)、set(集合,不常用)
不可变数据类型:改变值会导致内存地址发生了改变,数值类型(int、float、bool)、string(字符串)、tuple(元组)题
2.请简述Python中is和==的区别。
Python中的对象包含三个要素:id、type和value。
is比较的是两个对象的id。==比较的是两个对象的value。
3.请简述function(args, **kwargs)中的 args, kwargs分别是什么意思?
万能参数,解决了函数参数不固定的问题
*args:会把位置参数转化为tuple
**kwarg:会把关键字参数转化为dict
4.请简述面向对象中__new__和__init__的区别。
__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别。
__ new__是一个静态方法(创建),而__init__是一个实例方法(初始化)
__new__方法会返回一个创建的实例,而__init__什么都不返回
只有在__new__返回一个类的本身的实例时,后面的__init__才能被调用
当创建一个新实例时调用__new__,初始化一个实例时用__init数
5.Python子类继承自多个父类时,如多个父类有同名方法,子类将继承自哪个方法?
按照顺序先继承A中的方法
Python语言中子类继承父类的方法是按照继承的父类的先后顺序确定的,例如,子类A继承自父类B、C,且B、C中具有同名方法Test(),那么A中的Test()方法实际上是继承自B中的Test()方法。
6.请简述Python中如何避免死锁?
死锁是指不同线程获取了不同的锁,但是线程间又希望获取对方的锁,双方都在等待对方释放锁,这种相互等待资源的情况就是死锁。Python语言可以使用threading.Condition对象,基于条件事件通知的形式去协调线程的运行,即可避免死锁。
7.python中生成器和迭代器的区别
1.所有的生成器都是迭代器.
2.迭代器(iterator)用类实现, 生成器(generator)用函数实现
3.迭代器:定义一个__iter__方法, 内容要 return self 定义一个__next__方法(Python 2中 是 next 方法) 生成器:通常用yield返回(列表、元组、字典、字符串都是可迭代对象。数字、布尔值都是不可迭代的。)
8.什么是lambda函数?它有什么好处?
lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数
lambda函数:首要用途是指点短小的回调函数
lambda [arguments]:expression
a=lambdax,y:x+y
9.赋值是什么意思,深拷贝和浅拷贝的区别
赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝(拷贝对象的内容)
浅拷贝是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。
第一种,如果最外层的数据类型是可变的,会开启新的地址空间去存放。
第二种,如果最外层的数据类型是不可变的,还是引用对象的地址空间
深拷贝(拷贝类的内容和属性),内部和外部都会被拷贝过来。
深拷贝也分两种情况:
第一种,最外层数据类型可变。这个时候,内部和外部的都会拷贝过来。
第二种,外层数据类型不可变,如果里面是可变数据类型,会新开辟地址空间存放。如果内部数据类型不可变,才会如同浅拷贝一样,是对地址的引用。
10.简要描述Python的垃圾回收机制(garbage collection)
Python在内存中存储了每个对象的引用计数(reference count)。如果计数值变成0,那么相应的对象就会消失,分配给该对象的内存就会释放出来。
偶尔也会出现引用循环(reference cycle)。垃圾回收器会定时寻找这个循环,并将其回收。举个例子,假设有两个对象o1和o2,而且符合 == o2和 == o1这两个条件。如果o1和o2没有其他代码引用,那么它们就不应该继续存在。但它们的引用计数都是1。
Python中使用了某些启发式算法(heuristics)来加速垃圾回收。例如,越晚创建的对象更有可能被回收。对象被创建之后,垃圾回收器会分配它们所属的代(generation)。每个对象都会被分配一个代,而被分配更年轻代的对象是优先被处理的。
11.有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
- 答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行codingstandard检查
12.Python里面search()和match()的区别?
match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个
string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none
13.列举布尔值为 False的常见值?
0, [] , () , {} , ” , False , None
14.字符串、列表、元组、字典每个常用的5个方法?
字符串:repleace,strip,split,reverse,upper,lower,join…..
列表:append,pop,,remove,sort,count,index…..
元组:index,count,__len__(),__dir__()
字典:get,keys,values,pop,popitems,clear,,items…..
15.介绍一下except的用法和作用?
Python的except用来捕获所有异常,因为Python里面的每次错误都会抛出一个异常,所以每个程序的错误都被当作一个运行时错误。
16.Python中pass语句的作用是什么?
pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作。
17.python多线程与多进程的区别
多进程是多个程序并发执行要对每个Process对象调用join()方法 (实际上等同于wait) 避免共享资源
对于多线程同一个程序不同片段,由于只有一个进程,所以不存在此必要性,容易地共享资源。
在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和Manager的方法来共享资源。
18.python中单引号和双引号有什么区别?
没区别
19.python的内存管理
引用计数机制: Python内部记录了对象有多少个引用来保持追踪,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。分配一个新名称或者将一个对象放入一个容器计数增加,删除或者重新赋值的时候计数减少。使用sys.getrefcount()函数来获取对象的当前引用计数。对于不可变数据(数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
垃圾回收机制:当内存中有那些引用计数为0的对象,然后清除其在内存的空间。互相引用时计数为0垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0.
内存池机制:在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,预先在内存中申请一定数量的,大小相等的内存块留作备用,用于管理对小块内存的申请和释放。
特性
1.Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
2.Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
3.Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。
4.对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
20.什么是python中的魔法函数?
魔法方法是Python的内置函数,一般以双下划线开头,每个魔法方法对应的一个内置函数或者运算符,比如当使用len(obj)的时候实际上是调用obj.__len__方法。因此当我们对象使用这些方法的时候,相当于对这个对象的这类方法进行重写或重载。
21.c,c++,python语言的区别
1.语言类型不同:c++是编译性语言,所以快(是经过了软件的编译后,生成机器码,然后再由计算机操作系统去运行),python是解释性语言(虚拟机运行)
2.数据类型的不同:C语言的数据类类型、构造类型、指针类型、空类型,C语言在定义变量的时候一定要先声明变量的类型,告诉计算机,我是一个什么类型。Python封装了一些高级的数据类型,比如元组、字典等,Python对比C语言最大的优势在于定义变量的时候不需要事先声明变量的类型。
3.C语言是面向过程的语言,而Python是面向对象的语言。
22.python变量类型
1.在函数或代码内声明的,局部变量
2.在所有函数外部申明的,全局变量
3.作为函数的参数,形式参数2
————欢迎大家留言补充更多面试问题