Python经典面试题(持续更新...)

经典面试题

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']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值