5个很好的Python面试题问题答案及分析


Posted in Python onJanuary 19, 2018

本文的主要内容是向大家分享几个Python面试中的T题目,同时给出了答案并对其进行分析,具体如下。

本文的原文是5 Great Python Interview Questions,同时谢谢 @非乌龟 指出我的疏漏,没有来源标记,也赞其细心,希望看文章的同时大家都能看下原文,因为每个人的理解不一致,原汁原味的最有帮助,我翻译很多文章的目的一是为了自己以后找资料方便;二是作为一个索引,以后再看原文的时候,能更加快捷。其目的还是希望大家能看原文的。

问题一:以下的代码的输出将是什么? 说出你的答案并解释。

class Parent(object):
 x = 1

class Child1(Parent):
 pass

class Child2(Parent):
 pass

print Parent.x, Child1.x, Child2.x
Child1.x = 2
print Parent.x, Child1.x, Child2.x
Parent.x = 3
print Parent.x, Child1.x, Child2.x

答案

以上代码的输出是:

1 1 1
1 2 1
3 2 3

使你困惑或是惊奇的是关于最后一行的输出是 3 2 3 而不是 3 2 1。为什么改变了 Parent.x 的值还会改变 Child2.x的值,但是同时 Child1.x 值却没有改变?

这个答案的关键是,在 Python 中,类变量在内部是作为字典处理的。如果一个变量的名字没有在当前类的字典中发现,将搜索祖先类(比如父类)直到被引用的变量名被找到(如果这个被引用的变量名既没有在自己所在的类又没有在祖先类中找到,会引发一个 AttributeError 异常 )。

因此,在父类中设置 x = 1 会使得类变量 X 在引用该类和其任何子类中的值为 1。这就是因为第一个 print 语句的输出是1 1 1。

随后,如果任何它的子类重写了该值(例如,我们执行语句 Child1.x = 2),然后,该值仅仅在子类中被改变。这就是为什么第二个 print 语句的输出是 1 2 1。

最后,如果该值在父类中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响到任何未重写该值的子类当中的值(在这个示例中被影响的子类是 Child2)。这就是为什么第三个 print 输出是 3 2 3。

问题二:以下的代码的输出将是什么? 说出你的答案并解释?

def div1(x,y):
 print("%s/%s = %s" % (x, y, x/y))

def div2(x,y):
 print("%s//%s = %s" % (x, y, x//y))

div1(5,2)
div1(5.,2)
div2(5,2)
div2(5.,2.)

答案

这个答案实际依赖于你使用的是 Python 2 还是 Python 3。

在 Python 3 中,期望的输出是:

5/2 = 2.5
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0

在 Python 2 中,尽管如此,以上代码的输出将是:

5/2 = 2
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0

默认,如果两个操作数都是整数,Python 2 自动执行整型计算。结果,5/2 值为 2,然而 5./2 值为 ```2.5``。

注意,尽管如此,你可以在 Python 2 中重载这一行为(比如达到你想在 Python 3 中的同样结果),通过添加以下导入:

from __future__ import division

也需要注意的是“双划线”(//)操作符将一直执行整除,而不管操作数的类型,这就是为什么 5.0//2.0 值为 2.0。

注: 在 Python 3 中,/ 操作符是做浮点除法,而 // 是做整除(即商没有余数,比如 10 // 3 其结果就为 3,余数会被截除掉,而 (-7) // 3 的结果却是 -3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。而在 Python 2 中,/ 就是整除,即和 Python 3 中的 // 操作符一样,)

问题三:以下代码将输出什么?

list = ['a', 'b', 'c', 'd', 'e']
print list[10:]

答案

以上代码将输出 [],并且不会导致一个 IndexError。

正如人们所期望的,试图访问一个超过列表索引值的成员将导致 IndexError(比如访问以上列表的 list[10])。尽管如此,试图访问一个列表的以超出列表成员数作为开始索引的切片将不会导致 IndexError,并且将仅仅返回一个空列表。

一个讨厌的小问题是它会导致出现 bug ,并且这个问题是难以追踪的,因为它在运行时不会引发错误。

问题四:以下的代码的输出将是什么? 说出你的答案并解释

def multipliers():
 return [lambda x : i * x for i in range(4)]

print [m(2) for m in multipliers()]

你将如何修改 multipliers 的定义来产生期望的结果

答案

以上代码的输出是 [6, 6, 6, 6] (而不是 [0, 2, 4, 6])。

这个的原因是 Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用的时候被查找。所以结果是,当任何 multipliers() 返回的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找,到那时,无论哪个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回的函数 multiplies 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x 2)。

(顺便说下,正如在 The Hitchhiker's Guide to Python 中指出的,这里有一点普遍的误解,是关于 lambda 表达式的一些东西。一个 lambda 表达式创建的函数不是特殊的,和使用一个普通的 def 创建的函数展示的表现是一样的。)

这里有两种方法解决这个问题。

最普遍的解决方案是创建一个闭包,通过使用默认参数立即绑定它的参数。例如:

def multipliers():
 return [lambda x, i=i : i * x for i in range(4)]

另外一个选择是,你可以使用 functools.partial 函数:

from functools import partial
from operator import mul

def multipliers():
 return [partial(mul, i) for i in range(4)]

问题五:以下的代码的输出将是什么? 说出你的答案并解释?

def extendList(val, list=[]):
 list.append(val)
 return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

你将如何修改 extendList 的定义来产生期望的结果

以上代码的输出为:

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

许多人会错误的认为 list1 应该等于 [10] 以及 list3 应该等于 ['a']。认为 list 的参数会在 extendList 每次被调用的时候会被设置成它的默认值 []。

尽管如此,实际发生的事情是,新的默认列表仅仅只在函数被定义时创建一次。随后当 extendList 没有被指定的列表参数调用的时候,其使用的是同一个列表。这就是为什么当函数被定义的时候,表达式是用默认参数被计算,而不是它被调用的时候。

因此,list1 和 list3 是操作的相同的列表。而 ````list2是操作的它创建的独立的列表(通过传递它自己的空列表作为list``` 参数的值)。

extendList 函数的定义可以做如下修改,但,当没有新的 list 参数被指定的时候,会总是开始一个新列表,这更加可能是一直期望的行为。

def extendList(val, list=None):
 if list is None:
  list = []
 list.append(val)
 return list

使用这个改进的实现,输出将是:

list1 = [10]
list2 = [123]
list3 = ['a']

总结

关于面试,怎么能给面试官一个好的印象?比方说人家考你这段程序输出结果是什么,你不仅能答上来,如果再能指出这段代码在实现功能不变的情况下,有什么可以优化的地方,一定会让考官眼前一亮的吧。不管怎么样,都需要扎实的基础知识。

以上就是本文关于5个很好的Python面试题问题答案及分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python对html代码进行escape编码的方法
May 04 Python
Python字符串、整数、和浮点型数相互转换实例
Aug 04 Python
python实现微信小程序自动回复
Sep 10 Python
Python模块的加载讲解
Jan 15 Python
python实现的登录与提交表单数据功能示例
Sep 25 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Python实现动态给类和对象添加属性和方法操作示例
Feb 29 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
Python3实现的画图及加载图片动画效果示例
Jan 19 #Python
Python实现将doc转化pdf格式文档的方法
Jan 19 #Python
python机器学习理论与实战(四)逻辑回归
Jan 19 #Python
python机器学习理论与实战(二)决策树
Jan 19 #Python
Python三种遍历文件目录的方法实例代码
Jan 19 #Python
python机器学习理论与实战(一)K近邻法
Jan 28 #Python
python机器学习理论与实战(六)支持向量机
Jan 19 #Python
You might like
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
Python迭代用法实例教程
2014/09/08 Python
Python 自动补全(vim)
2014/11/30 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
外贸业务员岗位职责
2013/11/24 职场文书
社团成立邀请函
2014/01/08 职场文书
青年文明号创建承诺
2014/03/31 职场文书
企业委托书范本
2014/09/13 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
司机岗位职责
2015/02/04 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python