python面试问题总结

0.什么是Python?使用Python有什么好处?(这个问题是最常见的开头问题,是最基础也是最重要的!)
答案:下面是一些关键点:
Python是一种解释型语言。这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译。其他解释型语言还包括PHP和Ruby。
Python是动态类型语言,指的是你在声明变量时,不需要说明变量的类型。你可以直接编写类似x=111和x=“I’m a string"这样的代码,程序不会报错。
Python用途非常广泛–网络应用,自动化,科学建模,大数据应用,等等。它也常被用作"胶水语言”,帮助其他语言和组件改善运行状况。
Python让困难的事情变得容易,因此程序员可以专注于算法和数据结构的设计,而不用处理底层的细节。

1.python中is和的区别(总结了大部分人的面试,这道题出现的概率也很大。)
答案:
Python中对象包含的三个基本要素,分别是:id(身份标识) 、type(数据类型)和value(值)。
'
'比较的是value值
'is’比较的是id

答案:
Python的内存管理是由私有heap空间管理的。所有的Python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。
另外,Python有自带的垃圾回收系统,它回收并释放没有被使用的内存让它们能够被其他程序使用。

3.有哪些工具可以帮助debug或做静态分析?
答案:
PyChecker,一个静态分析工具,除了报告源代码中的错误,还能分析出错误的类型和复杂程度。另外,还有Pylint,用于检验模块是否达到代码标准的工具。

4.你如何管理不同版本的代码?
答案:
一点不属于专业的小技巧–被问到这个问题的时候,你应该要表现得很兴奋,甚至告诉他们你是如何使用Git(或是其他你最喜欢的工具)追踪自己和女票的书信往来。除了Git作为版本控制系统(VCS),你也可以选择subversion(SVN)。

5.什么是Python的命名空间?
答案:
python使用命名空间记录变量。python中的命名空间就像是一个dict,key是变量的名字,value是变量的值。
如果你记不住上面这段标准答案,也可以这么回答:
在Python 中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作–这就是命名空间。每一个变量名字都尤其对应的一个对象,而命名空间可是把他们收纳起来的盒子,当查询变量的时候,会从该盒子里面寻找相应的对象。

6.Python中的pass是什么?
答案:
Pass是一个不可或缺但又毫无作用的语句。 pass就是什么也不做,只是为了防止语法错误,比如: if a>1: pass #我这里先不做任何处理,直接跳过,但是如果不写pass,就会语法错误。

7.在Python中如何拷贝一个对象?
答案:
一般来说可以使用copy.copy()方法或者copy.deepcopy()方法,几乎所有的对象都可以被拷贝,一些对象可以更容易的拷贝,Dictionaries有一个copy方法:newdict = olddict.copy()
但并不是所有的对象都可以被拷贝。

8.Xrange和range的区别是什么?
Xrange用于返回一个xrange对象,而range用于返回一个数组。不管那个范围多大,Xrange都使用同样的内存。
其实在面试中,面试官往往不会出太难的问题,只要掌握好基础,大部分都能过关。
最后再给大家提供一点面试时候的小技巧!

9.简述函数式编程。在函数式编程中,函数是基本单位,变量只是一个名称,而不是一个存储单元。除了匿名函数外,Python还使用fliter(),map(),reduce(),apply()函数来支持函数式编程。

10.什么是匿名函数,匿名函数有什么局限性?匿名函数,也就是lambda函数,通常用在函数体比较简单的函数上。匿名函数顾名思义就是函数没有名字,因此不用担心函数名冲突。不过Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。

11.如何捕获异常,常用的异常机制有哪些?如果我们没有对异常进行任何预防,那么在程序执行的过程中发生异常,就会中断程序,调用python默认的异常处理器,并在终端输出异常信息。try…except…finally语句:当try语句执行时发生异常,回到try语句层,寻找后面是否有except语句。找到except语句后,会调用这个自定义的异常处理器。except将异常处理完毕后,程序继续往下执行。finally语句表示,无论异常发生与否,finally中的语句都要执行
assert语句:判断assert后面紧跟的语句是True还是False,如果是True则继续执行print,如果是False则中断程序,调用默认的异常处理器,同时输出assert语句逗号后面的提示信息。
with语句:如果with语句或语句块中发生异常,会调用默认的异常处理器处理,但文件还是会正常关闭。

12.copy()与deepcopy()的区别copy是浅拷贝,只拷贝可变对象的父级元素。 deepcopy是深拷贝,递归拷贝可变对象的所有元素。

13.函数装饰器有什么作用(常考)装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

14.简述Python的作用域以及Python搜索变量的顺序Python作用域简单说就是一个变量的命名空间。代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是变量的作用域。在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域。Python的变量名解析机制也称为 LEGB 法则:本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)

15.新式类和旧式类的区别,如何确保使用的类是新式类为了统一类(class)和类型(type),python在2.2版本引进来新式类。在2.1版本中,类和类型是不同的。为了确保使用的是新式类,有以下方法:
放在类模块代码的最前面 metaclass = type
从内建类object直接或者间接地继承
在python3版本中,默认所有的类都是新式类。

16.简述__new__和__init__的区别创建一个新实例时调用__new__,初始化一个实例时用__init__,这是它们最本质的区别。new方法会返回所构造的对象,init则不会.

17.Python垃圾回收机制(常考)Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。1 引用计数
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少.引用计数为0时,该对象生命就结束了。

优点:

简单 实时性 缺点:

维护引用计数消耗资源 循环引用

2 标记-清除机制

基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。

3 分代技术

分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。

Python默认定义了三代对象集合,索引数越大,对象存活时间越长。

18.Python中的@property有什么作用?如何实现成员变量的只读属性?@property装饰器就是负责把一个方法变成属性调用,通常用在属性的get方法和set方法,通过设置@property可以实现实例成员变量的直接访问,又保留了参数的检查。另外通过设置get方法而不定义set方法可以实现成员变量的只读属性。

19.args and **kwargsargs代表位置参数,它会接收任意多个参数并把这些参数作为元组传递给函数。**kwargs代表的关键字参数,允许你使用没有事先定义的参数名,另外,位置参数一定要放在关键字参数的前面。

20.有用过with statement吗?它的好处是什么?具体如何实现?with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

what will be the output of the code below? explain your answer
def extend_list(val, list=[]):
list.append(val)
return list

list1 = extend_list(10)
list2 = extend_list(123, [])
list3 = extend_list(‘a’)

print(list1) # list1 = [10, ‘a’]
print(list2) # list2 = [123, []]
print(list3) # list3 = [10, ‘a’]

class Parent(object):
x = 1

class Child1(Parent):
pass

class Child2(Parent):
pass

print(Parent.x, Child1.x, Child2.x) # [1,1,1]
Child1.x = 2
print(Parent.x, Child1.x, Child2.x) # [1,2,1]
Partent.x = 3
print(Parent.x, Child1.x, Child2.x) # [3,2,3]

21.在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
arr = [[1,4,7,10,15], [2,5,8,12,19], [3,6,9,16,22], [10,13,14,17,24], [18,21,23,26,30]]

def getNum(num, data=None):
while data:
if num > data[0][-1]:
del data[0]
print(data)
getNum(num, data=None)
elif num < data[0][-1]:
data = list(zip(*data))
del data[-1]
data = list(zip(*data))
print(data)
getNum(num, data=None)
else:
return True
data.clear()
return False

if name == ‘main’:
print(getNum(18, arr))

22.获取最大公约数、最小公倍数
a = 36
b = 21

def maxCommon(a, b):
while b: a,b = b, a%b
return a

def minCommon(a, b):
c = a*b
while b: a,b = b, a%b
return c//a

if name == ‘main’:
print(maxCommon(a,b))
print(minCommon(a,b))

23.获取中位数
def median(data):
data.sort()
half = len(data) // 2
return (data[half] + data[~half])/2

l = [1,3,4,53,2,46,8,42,82]

if name == ‘main’:
print(median(l))

24.输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
def getOneCount(num):
if num > 0:
count = b_num.count(‘1’)
print(b_num)
return count
elif num < 0:
b_num = bin(~num)
count = 8 - b_num.count(‘1’)
return count
else:
return 8

if name == ‘main’:
print(getOneCount(5))
print(getOneCount(-5))
print(getOneCount(0))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值