基于人工智能的Python面试题
1. Python中的元组与列表区别是什么?
- 列表是可变类型,元组不是。
- 列表是引用类型,元组不是。
- 列表使用场景更宽泛,元组更多用于一些数据不可变的场景,例如参数、或者返回值。
2. Python中的字典 是否有序?
- python3.6之前字典是无序的,之后是有序的。
- 原因可以参考下这个帖子 https://blog.csdn.net/weixin_48629601/article/details/107683829
3. Python对深浅拷贝的理解?
- 深浅拷贝主要是针对引用类型数据。
- 深浅拷贝深浅定义只要是拷贝深度。
- 浅拷贝,仅仅拷贝第一层数据。这样可能导致数据共享,有可能会不小心出现问题。
- 深拷贝,递归拷贝所有数据。
- 深浅拷贝主要针对符合数据类型嵌套出现的情况
4. 请问你在什么场景下使用lambda 表达式
- lambda 表达式,又名匿名函数,是函数的一种。适合一些简单的函数转化成表达式,更便于书写。
- lambda 更适合一些 回调 调用场景。也就是函数当做参数传递的时候场景
- 排序的sorted方法, pandas的分组等相关的方法都支持这个使用等等。
5. 请问python中的round使用需要注意什么?
- 适合一些对精度要求不高的场景。
- 原因详细查看,面试能说上原因即可: https://www.bbsmax.com/A/LPdo6lME53/
6. 请问如何对一个列表数据去重,请尽可能多说明
li = [1,2,3,4,12,2,1,3,5,6,7,8,19,20,12,43,1314]
# 1. 原始遍历去重
new_li = []
for i in li:if i not in new_li:new_li.append(i)# 2. 利用set特性去重,最便捷的方式
new_li_set = list(set(li)) # 3. 利用字典的key唯一特性去重
new_li_dict = list({}.fromkeys(li).keys())print(new_li)
print(new_li_set)
print(new_li_dict)
[1, 2, 3, 4, 12, 5, 6, 7, 8, 19, 20, 43, 1314]
[1, 2, 3, 4, 5, 6, 7, 8, 1314, 43, 12, 19, 20]
[1, 2, 3, 4, 12, 5, 6, 7, 8, 19, 20, 43, 1314]
7. 请问如何对一个是数字的列表中,删除里面的偶数,请尽可能用更多的方式
# 1. 首先我们要下说明,不能删除的原因. 删除元素后导致元素的索引发生变化。后的元组自动向前移动了# 1. 利用while 循环删除
li = [1,2,2,3,3,4,4,5,6,8,8]
li_copy = li1.copy()
index=0
while index<len(li):if li[index]%2==0:li.remove(li[index])continueindex+=1
print(li)# 2. 保留奇数数值
new_li = [i for i in li_copy if i%2!=0]
print(new_li)# 3.利用切片特性,切片等价于做了一个浅拷贝。这样遍历与删除就不是同一个列表
li1 = [1,2,2,3,3,4,4,5,6,8,8]
for i in li1[::]:if i%2==0:li1.remove(i)
print(li1)# 4. 可以保留偶数在删除与上面类似
li3 = [1,2,2,3,3,4,4,5,6,8,8]
new_li3 = [i for i in li3 if i % 2==0]
for i in new_li3:li3.remove(i)
print(li3)
[1, 3, 3, 5]
[1, 3, 3, 5]
[1, 3, 3, 5]
[1, 3, 3, 5]
8. 请说下,下面的li1 li2 li3 的特点
li = [1,2,3]
li1 = li
li2=li[::]
li3 = li.copy()
- 列表是引用类型,所以li1=li li1与li是一个对象,它们引用的同一块空间
- li2 是在li基础上切片得到的,切片相当于一个浅拷贝.
- li3 是调用的内置的copy,这个copy方法也是一个浅拷贝
9. 请说下对function tools中reduce的理解
- reduce 用于迭代累计处理我们序列数据
- 参数有2个 一个是回调函数是一个方法,一个是初始化值
- 回调函数,有2个参数,第一个参数是累计运算的结果,第二个是当前迭代的元素
- 初始值:如果不设置则把第一个元素作为 它的初始值
下面是源代码示例
def reduce(function, sequence, initial=_initial_missing):"""reduce(function, sequence[, initial]) -> valueApply a function of two arguments cumulatively to the items of a sequence,from left to right, so as to reduce the sequence to a single value.For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates((((1+2)+3)+4)+5). If initial is present, it is placed before the itemsof the sequence in the calculation, and serves as a default when thesequence is empty."""it = iter(sequence)if initial is _initial_missing:try:value = next(it)except StopIteration:raise TypeError("reduce() of empty sequence with no initial value") from Noneelse:value = initialfor element in it:value = function(value, element)return value
10. 请问如何反转一个字符串
# 1. 利用切片的反向切片操作
s = "abcdefg"
s1 = s[::-1]
print(s1)# 2. 利用list的逆置与字符串拼接
li = list(s)
li.reverse()
s2 = "".join(li)
print(s2)# 3. 传统的字符串遍历
s3 = ""
for ts in s:s3 = ts+s3
print(s3)
gfedcba
gfedcba
gfedcba
11. 如何交换2个变量的值
# 利用遍历的多变量赋值操作哈
a = 10
b = 20
b,a = a,b
print(a,b)
20 10
12. 发生循环导包的原因是什么,解决方法是什么?
- 多个模块相互导入,在某个导入链上出现了循环。
- 解决办法:打断这个导入链,可以考虑使用延时加载。当我们需要的时候再加载这个模块。 或者尝试调整导入顺序解决。
13. 请你说下 对super的理解?
- super用于在继承关系中用于调用父类的方法,更多用于调用父类的初始化会更多一些。
- super 返回的是一个mro顺序中的下一位的代理对象,这里可以简单对mro做个说明
- super 返回的代理对象只能用于调用方法不能访问属性
14. 请问你用过自定义异常吗?
- 答案要肯定:用过。
- 做项目期间使用,简单能说上几个即可。 例如我们是调用训练模型的时候,一些错误我们可以定义成异常错误。例如: 加载模型异常错误,调用模型参数错误异常等
15. 如何创建一个Python的包模块,需要注意什么?
- 在构建一个模块包的时候,内部模块推荐使用相对导包,这样方便我们的模块可以更好的被外部调用使用。
16. 请问 sys.path 作用?
- sys.path 主要作用用于加载python模块使用的一个路径集合。当然一些动态库的路径也是在这个里面
- 更多用于再我们构建项目的时候,更好的就加载模块使用。
17. 请问python的list 与 numpy的 Array区别?
- 参考这个链接 https://jakevdp.github.io/PythonDataScienceHandbook/02.01-understanding-data-types.html
18. 请问python中的int 与 numpy 中的int64 区别是什么?
- python3中的int大小无限制。python3之前两者是类似的都是64位的整数。
- numpy int64 有固定大小 64位整数
19. is 与 == 的区别
- is 是根据对象ID判断的
- == 是根据值判断的
20. python __del__什么时候被调用
- del 是对象被解释器回收的时候调用。
- 显式的del 是相当于把引用计数置0,等待解释器回收