经典面试题
1、问题:以下代码将输出什么?说出你的答案并解释。
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
此题考验对于面向对象 对于继承的理解
2、问题:以下代码在python2和python3中分别输出什么?
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.)
在python2中:
5/2 = 2
5./2 = 2.5
5//2 = 2
5.//2 = 2.0
在python3中:
5/2 = 2.5
5./2 = 2.5
5//2 = 2
5.//2 = 2.0
"""
在 Python 3 中,/ 操作符是做浮点除法,而 // 是做整除(即商没有余数,比如
10 // 3 其结果就为 3,余数会被截除掉,而 (-7) // 3 的结果却是 -3。这个算
法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。而在
Python 2 中,/ 就是整除,即和 Python 3 中的 // 操作符一样,)
"""
3、问题:以下代码将输出什么?
li = [1,2,3,4]
li[10:]
答案:[]
"""
试图访问一个超过列表索引值的成员将导致 IndexError(比如访问以上列表的
list[10])。尽管如此,试图访问一个列表的以超出列表成员数作为开始索引的
切片将不会导致 IndexError,并且将仅仅返回一个空列表。
"""
4、问题:以下代码将输出什么?给出答案并解释。
def multipliers():
return [lambda x : i * x for i in range(4)]
print [m(2) for m in multipliers()]
答案:
[6, 6, 6, 6] (而不是 [0, 2, 4, 6])。
"""
这个的原因是 Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中
的变量是在内部函数被调用的时候被查找。所以结果是,当任何 multipliers() 返回
的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找,到那时,无论哪
个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回的
函数multiplies 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回
一个值 6 (比如: 3 x 2)。
"""
5、问题:以下代码将输出什么?请解释。
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
答案
list1 = [10,a]
list2 = [123]
list3 = [10,a]
"""
许多人会错误的认为 list1 应该等于 [10] 以及 list3 应该等于 ['a']。
认为 list 的参数会在 extendList 每次被调用的时候会被设置成它的默认值 [].
尽管如此,实际发生的事情是,新的默认列表仅仅只在函数被定义时创建一次。随后
当 extendList 没有被指定的列表参数调用的时候,其使用的是同一个列表。这就是
为什么当函数被定义的时候,表达式是用默认参数被计算,而不是它被调用的时候。
因此,list1 和 list3 是操作的相同的列表。而 ````list2是操作的它创建的独立
的列表(通过传递它自己的空列表作为list``` 参数的值)。
"""
函数可以做如下修改,使每次调用都是一个新的列表
def extendList(val, list=None):
if list is None:
list = []
list.append(val)
return list
使用这个改进的实现,输出将是:
list1 = [10]
list2 = [123]
list3 = ['a']