python面试题目

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

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.)

5/2 = 2
5.0/2.0=2.5
5/2=2
5/2=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‘]

  

python面试题目,布布扣,bubuko.com

时间: 2024-10-12 01:19:15

python面试题目的相关文章

Python面试题目--汇总

原文链接-https://github.com/taizilongxu/interview_python Python语言特性 1 Python的函数参数传递 2 Python中的元类(metaclass) 3 @staticmethod和@classmethod 4 类变量和实例变量 5 Python自省 6 字典推导式 7 Python中单下划线和双下划线 8 字符串格式化:%和.format 9 迭代器和生成器 10 *args and **kwargs 11 面向切面编程AOP和装饰器

selenium+python面试题目总结

1. WebDriver原理 webDriver是按照client/server模式设计,client就是我们的测试代码,发送请求,server就是打开的浏览器来打开client发出的请求并做出响应. 具体的工作流程: ·webdriver打开浏览器并绑定到指定端口.启动的浏览器作为remote server. ·client通过commandExecuter发送httpRequest给remote server的的侦听端口(the      webdriver wire control通信协议

Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration

# result 是一个字典, 把里面属性值是None的属性删除 for key in result: if not result[key]: del result[key] continue 但是报错信息如下 RuntimeError: dictionary changed size during iteration # 字典在迭代的时候改变了字典大小 python 遍历一个dict.set类型的同时,并且在改变这个变量的长度或者一边遍历一边修改,这时候就会抛出这错误: 我查了一些资料之后, 

8个Python面试必考的题目,小编也被坑过 ToT

写在前面 小编学习Python已经三年多了,现在稳定在一家公司快一年了,回想起来一年以前的面试经历真的有点胆战心惊啊! 因为面试题目一不小心就会被坑啊~ 你经历过绝望么? 当你被Python面试题目坑到的时候内心真的一万个草泥马徘徊在心中啊o(╥﹏╥)o 下面小编就分享一些小编亲身经历过的一些Python神坑面试题哦~ 干货来了 1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list lis

PYTHON 一些基础面试题目总结

PYTHON 一些基础面试题目总结http://www.bieryun.com/1191.html 1.       Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数. 引用计数增加的情况: 1,一个对象分配一个新名称 2,将其放入一个容器中(如列表.元组或字典) 引用计数减少的情况: 1,使用del语句对对象别名显示的销毁 2,引用超出作

java相关的面试题目

1.java/c++/ruby/python集中语言的对比 java和c++ java和ruby java和python java相关的面试题目,布布扣,bubuko.com

PHP面试题目搜集

搜集这些题目是想在学习PHP方面知识有更感性的认识,单纯看书的话会很容易看后就忘记. 曾经看过数据结构.设计模式.HTTP等方面的书籍,但是基本看完后就是看完了,没有然后了,随着时间的推移,也就渐渐忘记了. 所以通过这次搜集题目,可以复习复习一些知识点.而且自己动手写写,动脑思考,能更好的记住这些知识点. 留份记录也方便以后自己查看.题目基本都来自网络,如果有不正确的地方欢迎指出或补充. 一.理论知识 1.1.PHP里面是区分大小写的吗? PHP对于系统函数.用户自定义函数.类名称等是不区分大小

Java面试题目整理

一.引言:本文主要整理遇到的面试题目,以及提供自己的见解,将会持续更新,如有问题,可评论交流,一起进步. 二.问题及我的见解: 1. n个结点可以组合成多少棵不同的二叉树? 答:2^n-n棵 2. 什么是bean? 答: bean本质上就是可复用的类,比如在spring中的bean就是表示组件的意思. 3. String.StringBuffer.StringBuilder的有什么区别? 答:String是内容和长度固定的类 StringBuffer是内容和长度可变的类,并且线程安全 Strin

C/C++面试题目一

C/C++开发工程师面试题目(一)(附答案分析) 推荐:自己根据在面试中碰到做过的一些题目以及总结的题目,希望对面试的同学有所帮助. 一. 选择题 1. 下列类中(  )不是输入输出流类iostream的派生类. A. fstream      B. ofstream     C. strstream    D. ostrstream 答案:BD 解析:ofstream和ostrstream派生自ostream,而不是iostream.