问题一:以下的代码的输出将是什么? 说出你的答案并解释。
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 中,期望的输出是:
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
每次被调用的时候会被设置成它的默认值[]
。
相关推荐
“python面试题搜集(四): 最常见的 35 个 Python 面试题及答案(2018 版).md”则包含了2018年最常问的35个问题,这些问题可能反映了当年的热点和行业趋势,对于了解面试趋势有很大帮助。 最后,“python面试题...
省时省力:读者可以在一个地方找到大量的Python面试题,避免了自己花费大量时间和精力去收集和整理。 适合不同层次:文章中的面试题分为不同的难度级别,适合不同层次的读者进行学习和练习。 附有答案和解析:文章...
### Python企业面试题详解:序列平衡问题 在探讨Python企业面试题时,我们经常会遇到一些经典问题,旨在考察应聘者对于算法的理解以及编程能力。其中一个典型的问题是关于两个序列的平衡,具体而言,如何通过交换两...
【Python面试题解析】 在Python面试中,常常会遇到各种问题,从基础知识到高级概念,以下是一些常见的面试题及答案: 1. **Python的特点和优点** Python是一门易于学习、面向对象、动态类型的解释型语言。它具有...
### 110道Python面试题精解 #### 一、基础知识点概览 这份文档包含110道Python面试题,旨在帮助Python初学者掌握基础语法和编程技巧。题目来源于真实的笔试和面试场景,每一道题都是经过实战检验的重要知识点。...
Python是一种广泛使用的高级编程语言,以其易读性、简洁的语法和强大的功能而闻名。对于初学者和寻求在IT行业..."python基础面试题.zip"中的题目可能会涵盖这些领域,通过练习和解答,你可以更好地巩固你的Python技能。
Python是一种广泛使用的高级编程语言,尤其在Web开发、数据分析、人工智能等领域有着广泛应用。这份文档整理了12页的...这份文档提供的练习题和面试题是一个很好的学习资源,可以帮助开发者巩固和提升Python技能。
### Python语言特性详解 #### 1. Python的函数参数传递 在Python中,函数参数的传递遵循特定的规则。...这些知识点涵盖了Python面试中经常出现的一些核心概念和技术点,对于深入理解和高效使用Python语言至关重要。
### 经典Python面试题知识点解析 #### 1. 为什么学习Python? - **易学性**: Python 的语法简洁明了,易于上手,适合初学者快速入门编程。 - **广泛应用**: 在数据科学、Web 开发、自动化脚本、网络爬虫等领域有着...
以下将详细解释在2018年BAT(百度、阿里巴巴、腾讯)Python面试中可能会遇到的知识点。 1. Python的函数参数传递: Python采用的是“命名参数传递”,而非像C++那样的值传递或引用传递。在Python中,所有的变量本质...
Python面试回答的技巧和常见面试题对于求职者来说至关重要,特别是在大数据和人工智能领域,Python语言的应用日益广泛,相应的职位需求也在不断增加。为了在竞争激烈的市场中脱颖而出,掌握一些面试策略和核心知识点...
以下是根据标题、描述和部分内容提取的五个Python面试问题及其详细解答: **问题一:类变量的继承与修改** ```python class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass ...
基于Python的华为OD算法面试题——Huawei-OD-Python-master。 本项目主要基于Python语言,使用很多Python语言的标准库,希望大家能通过题目,更好地熟悉Python语法,并灵活运用语法特性。 在推荐资料部分,给出了...
这对于初学者来说是一个很好的学习工具。 `print()`函数是Python中的基本输出函数,用于在控制台或输出窗口显示文本。它可以用来打印变量的值,字符串,或其他数据类型的表示。 在Python中,乘法运算符是`*`。在...
Python 爬虫面试题总结 Python 爬虫作为一门技术,对于互联网行业的发展起到了极大的推动作用。在爬虫领域中,面试是一道很重要的考验,而本文总结了爬虫面试的常见问题,旨在帮助爬虫小伙伴更好地备战面试。 一、...
【标题】:“用python实现剑指offer等python面试编程题(写着玩).zip”指出这是一个包含Python编程实践的资源包,重点在于解决常见的面试编程题目,如《剑指Offer》中的问题。这个压缩包可能是为了帮助Python开发者...
了解以上知识点对于初级Python开发者是非常重要的,这些知识点是Python编程语言的基础,对于准备面试或者快速上手Python开发工作具有很大的帮助。掌握这些知识点,能够帮助开发者更好地理解和运用Python,编写出更加...
【标题解析】 "python-leetcode面试题解之第31题下一个排列-python题解.zip" 这个标题表明这是一个关于Python编程...同时,它还提醒我们,LeetCode是一个很好的资源,可以帮助我们锻炼编程技能,为面试做好充分准备。
Freestyle题5. 场景实战题6. 致谢 各位读者朋友们大家好!我是爬虫领域的职业段子手。这篇文章今天在CSDN首发,后续我会持续维护更新。希望能帮助每一位读者减少掉坑的机率,也祝愿每位读者都能拿到心仪的offer!...