Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

面试 | Python面试题目及答案(一)

$
0
0
面试 | python面试题目及答案(一)

一点号书圈4小时前


php?url=0FjY4YHlbv" alt="面试 | Python面试题目及答案(一)" />

题目整理来自网络。

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


面试 | Python面试题目及答案(一)

答案

以上代码的输出是:

使你困惑或是惊奇的是关于最后一行的输出是 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

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


面试 | Python面试题目及答案(一)

答案

这个答案实际依赖于你使用的是 Python 2 还是 Python 3。

在 Python 3 中,期望的输出是:

5/2=2.55.0/2=2.55//2 = 25.0//2.0 = 2.0

在 Python 2 中,尽管如此,以上代码的输出将是:

5/2=25.0/2=2.55//2 = 25.0//2.0 = 2.0默认,如果两个操作数都是整数,Python 2 自动执行整型计算。结果,5/2 值为 2,然而 5./2值为 ```2.5``。

注意,尽管如此,你可以在 Python 2 中重载这一行为(比如达到你想在 Python 3 中的同样结果),通过添加以下导入:

也需要注意的是“双划线”(//)操作符将一直执行整除,而不管操作数的类型,这就是为什么 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 ,并且这个问题是难以追踪的,因为它在运行时不会引发错误。

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


面试 | Python面试题目及答案(一)

答案

以上代码的输出是 [6, 6, 6, 6] (而不是 [0, 2, 4, 6])。这个的原因是 Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用的时候被查找。所以结果是,当任何 multipliers 返回的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找,到那时,无论哪个返回的函数被调用,for 循环都已经完成了,i3,因此,每个返回的函数 multiplies 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x 2)。(顺便说下,正如在 The Hitchhiker’s Guide to Python 中指出的,这里有一点普遍的误解,是关于 lambda 表达式的一些东西。一个 lambda 表达式创建的函数不是特殊的,和使用一个普通的 def 创建的函数展示的表现是一样的。)

这里有两种方法解决这个问题。

最普遍的解决方案是创建一个闭包,通过使用默认参数立即绑定它的参数。例如:

另外一个选择是,你可以使用 functools.partial 函数 问题五:以下的代码的输出将是什么? 说出你的答案并解释?
面试 | Python面试题目及答案(一)

以上代码的输出为:

许多人会错误的认为 list1 应该等于 [10] 以及 list3 应该等于 ['a']。认为 list 的参数会在 extendList 每次被调用的时候会被设置成它的默认值 尽管如此,实际发生的事情是,新的默认列表仅仅只在函数被定义时创建一次。随后当 extendList 没有被指定的列表参数调用的时候,其使用的是同一个列表。这就是为什么当函数被定义的时候,表达式是用默认参数被计算,而不是它被调用的时候。因此,list1 和 list3 是操作的相同的列表。而 ````list2是操作的它创建的独立的列表(通过传递它自己的空列表作为list``` 参数的值)。extendList 函数的定义可以做如下修改,但,当没有新的 list 参数被指定的时候,会总是开始一个新列表,这更加可能是一直期望的行为。
面试 | Python面试题目及答案(一)
使用这个改进的实现,输出将是:list1=[10]list2=[123]list3=['a']

问题六:Python如何实现单例模式?

方法一:


面试 | Python面试题目及答案(一)

方法二:


面试 | Python面试题目及答案(一)

方法三:


面试 | Python面试题目及答案(一)

方法四:


面试 | Python面试题目及答案(一)

问题七:Python是如何进行内存管理的?

Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的
malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的
整数,用于缓存这些整数的内存就不能再分配给浮点数。
在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一
级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响

总结:Python的内存管理是由Python得解释器负责的,开发人员可以从内存管理事务中解放出来,致力于应用程序的开发,这样就使得开发的程序错误更少,程序更健壮,开发周期更短

问题八:Python里面如何实现tuple和list的转换?

函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tuple, 元素不变,排序也不变。例如,tuple([1,2,3])返回(1,2,3), tuple(’abc’)返回(’a’.’b',’c').如果参数已经是一个tuple的话,函数不做任何拷贝而直接返回原来的对象,所以在不确定对象是不是tuple的时候来调用tuple函数也不是很耗费的。函数list(seq)可以把所有的序列和可迭代的对象转换成一个list,元素不变,排序也不变。例如 list([1,2,3])返回(1,2,3), list(’abc’)返回['a', 'b', 'c']。如果参数是一个list, 她会像set[:]一样做一个拷贝
问题九:Python里面search和match的区别?

match函数只检测RE是不是在string的开始位置匹配, search会扫描整个string查找匹配, 也就是说match只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match就返回none

例如:
print(re.match(’super’, ’superstition’).span)会返回(0, 5)
而print(re.match(’super’, ‘insuperable’))则返回None

search会扫描整个字符串并返回第一个成功的匹配

例如:print(re.search(’super’, ’superstition’).span)返回(0,5)

print(re.search(’super’, ‘insuperable’).span)返回(2, 7)

问题十:谈谈你用过的Python库?

大家自由发挥,可以在本文留言


面试 | Python面试题目及答案(一)

作者 | 图文来自网络、如涉及版权问题,请联系我们以便处理。文章内容纯属作者个人观点,不代表本网观点。

读书吧| QQ群:543839145

----后台回复对应字母,获取相关精彩内容----

【C1】最新教育、大数据、编程、科技文章和资料

【C2】往期公众号精彩文章

【C3】教学视频、直播、教学论坛回顾


Viewing all articles
Browse latest Browse all 9596

Trending Articles