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 面向对象 成员的访问约束
Dec 23 Python
Python yield使用方法示例
Dec 04 Python
python算法学习之基数排序实例
Dec 18 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
Python3 无重复字符的最长子串的实现
Oct 08 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
Python configparser模块配置文件过程解析
Mar 03 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
python asyncio 协程库的使用
Jan 21 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 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
一次编写,随处运行
2006/10/09 PHP
推荐文章系统(一)
2006/10/09 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP可变变量学习小结
2015/11/29 PHP
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Python 监测文件是否更新的方法
2019/06/10 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
新加坡交友网站:be2新加坡
2019/04/10 全球购物
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
通信研究生自荐信
2014/02/01 职场文书
新教师培训方案
2014/06/08 职场文书
经营场所使用证明
2015/06/19 职场文书
七年级思品教学反思
2016/02/20 职场文书