python123第五周作业答案_5个很好的Python⾯试题问题答案贵州163人事考试信息网报名入口
及分析
本⽂的主要内容是向⼤家分享⼏个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 中,期望的输出是:34所自主划线学校
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⾯试题问题答案及分析的全部内容,希望对⼤家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不⾜之处,欢迎留⾔指出。感谢朋友们对本站的⽀持!
公务员考试试题类型