用Python刷面试算法面试刷题题是怎样的体验

中国领先的IT技术网站
51CTO旗下网站
Python面试中8个必考问题,你知道吗?
本文分享给大家关于Python面试中的8个必考问题,主要是给一段代码解释出它输出的结果是什么?具体内容见下文。
作者:developers来源:| 15:14
1、下面这段代码的输出结果是什么?请解释。
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&],因为他们以为每次extendList被调用时,列表参数的默认值都将被设置为[].但实际上的情况是,新的默认列表只在函数被定义的那一刻创建一次。
当extendList被没有指定特定参数list调用时,这组list的值随后将被使用。这是因为带有默认参数的表达式在函数被定义的时候被计算,不是在调用的时候被计算。因此list1和list3是在同一个默认列表上进行操作(计算)的。而list2是在一个分离的列表上进行操作(计算)的。(通过传递一个自有的空列表作为列表参数的数值)。
extendList的定义可以作如下修改。
尽管,创建一个新的列表,没有特定的列表参数。
下面这段代码可能能够产生想要的结果。
def&extendList(val,&list=None):&&&if&list&is&None:&&&&&list&=&[]&&&list.append(val)&&&return&list&
通过上面的修改,输出结果将变成:
list1&=&[10]&list2&=&[123]&list3&=&['a']&
2、下面这段代码的输出结果将是什么?请解释。
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闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3。
因此,每次返回的函数乘以传递过来的值3,因为上段代码传过来的值是2,它们最终返回的都是6(3*2)。碰巧的是,《The Hitchhiker&s
Python》也指出,在与lambdas函数相关也有一个被广泛被误解的知识点,不过跟这个case不一样。由lambda表达式创造的函数没有什么特殊的地方,它其实是和def创造的函数式一样的。
下面是解决这一问题的一些方法。
一种解决方法就是用Python生成器。
def&multipliers():&&&for&i&in&range(4):&yield&lambda&x&:&i&*&x&
另外一个解决方案就是创造一个闭包,利用默认函数立即绑定。
def&multipliers():&&&return&[lambda&x,&i=i&:&i&*&x&for&i&in&range(4)]&
还有种替代的方案是,使用偏函数:
from&functools&import&partial&from&operator&import&mul&&def&multipliers():&&&return&[partial(mul,&i)&for&i&in&range(4)]&
3、下面这段代码的输出结果将是什么?请解释。
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中,类变量在内部是以字典的形式进行传递。
如果一个变量名没有在当前类下的字典中发现。则在更高级的类(如它的父类)中尽心搜索直到引用的变量名被找到。(如果引用变量名在自身类和更高级类中没有找到,将会引发一个属性错误。)
因此,在父类中设定x = 1,让变量x类(带有值1)能够在其类和其子类中被引用到。这就是为什么第一个打印语句输出结果是1 1 1
因此,如果它的任何一个子类被覆写了值(例如说,当我们执行语句Child1.x = 2),这个值只在子类中进行了修改。这就是为什么第二个打印语句输出结果是1
最终,如果这个值在父类中进行了修改,(例如说,当我们执行语句Parent.x =
3),这个改变将会影响那些还没有覆写子类的值(在这个例子中就是Child2)这就是为什么第三打印语句输出结果是3 2 3
4、下面这段代码在Python2下输出结果将是什么?请解释。
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.)&
在Python3下结果会有怎样的不同?(当然,假设上述打印语句被转换成Python3的语法)
在Python2中,上述代码输出将是
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
注意,在Python2中,你可以通过增加以下引用来覆写这个行为。
from&future&import&division&
同时要注意的是,//操作符将总是执行整形除法,不管操作符的类型。这就是为什么即使在Python
2中5.0//2.0的结果是2.0。然而在Python3中,没有此类特性,
例如,在两端都是整形的情况下,它不会执行整形除法
因此,在Python3中,将会是如下结果:
5/2&=&2.5&5.0/2&=&2.5&5//2&=&2&5.0//2.0&=&2.0&
注: 在 Python 3 中,/ 操作符是做浮点除法,而 // 是做整除(即商没有余数,比如 10 // 3 其结果就为 3,余数会被截除掉,而
(-7) // 3 的结果却是 -3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。而在 Python 2 中,/ 就是整除,即和
Python 3 中的 // 操作符一样)
5、下面代码的输出结果将是什么?
list&=&['a',&'b',&'c',&'d',&'e']&print&list[10:]&
下面的代码将输出[],不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。
例如,尝试获取list[10]和之后的成员,会导致IndexError.
然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表。
这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致bug很难被追踪到。
6、考虑下列代码片段:
list&=&[&[&]&]&*&5&list&&#&output?&list[0].append(10)&list&&#&output?&list[1].append(20)&list&&#&output?&list.append(30)&list&&#&output?&
2,4,6,8行将输出什么结果?试解释。
输出的结果如下:
[[],&[],&[],&[],&[]]&[[10],&[10],&[10],&[10],&[10]]&[[10,&20],&[10,&20],&[10,&20],&[10,&20],&[10,&20]]&[[10,&20],&[10,&20],&[10,&20],&[10,&20],&[10,&20],&30]&
解释如下:
第一行的输出结果直觉上很容易理解,例如 list = [ [ ] ] * 5 就是简单的创造了5个空列表。然而,理解表达式list=[ [ ] ] *
5的关键一点是它不是创造一个包含五个独立列表的列表,而是它是一个创建了包含对同一个列表五次引用的列表。只有了解了这一点,我们才能更好的理解接下来的输出结果。
list[0].append(10) 将10附加在第一个列表上。
但由于所有5个列表是引用的同一个列表,所以这个结果将是:
[[10],&[10],&[10],&[10],&[10]]&
同理,list[1].append(20)将20附加在第二个列表上。但同样由于5个列表是引用的同一个列表,所以输出结果现在是:
[[10,&20],&[10,&20],&[10,&20],&[10,&20],&[10,&20]]&
作为对比, list.append(30)是将整个新的元素附加在外列表上,因此产生的结果是:
[[10,&20],&[10,&20],&[10,&20],&[10,&20],&[10,&20],&30]&
7、Given a list of N numbers。
给定一个含有N个数字的列表。
使用单一的列表生成式来产生一个新的列表,该列表只包含满足以下条件的值:
(b)元素为原始列表中偶数切片。
例如,如果list[2]包含的值是偶数。那么这个值应该被包含在新的列表当中。因为这个数字同时在原始列表的偶数序列(2为偶数)上。然而,如果list[3]包含一个偶数,
那个数字不应该被包含在新的列表当中,因为它在原始列表的奇数序列上。
对此问题的简单解决方法如下:
[x&for&x&in&list[::2]&if&x%2&==&0]&
例如,给定列表如下:
list&=&[&1&,&3&,&5&,&8&,&10&,&13&,&18&,&36&,&78&]&
列表生成式[x for x in list[::2] if x%2 == 0] 的结果是,
[10,&18,&78]&
这个表达式工作的步骤是,第一步取出偶数切片的数字,
第二步剔除其中所有奇数。
8、给定以下字典的子类,下面的代码能够运行么?为什么?
class&DefaultDict(dict):&&&def&__missing__(self,&key):&&&&&return&[]&&
d&=&DefaultDict()&d['florp']&=&127&
能够运行。
当key缺失时,执行DefaultDict类,字典的实例将自动实例化这个数列。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条热点头条原创
24H热文一周话题本月最赞
讲师:248848人学习过
讲师:91936人学习过
讲师:12667人学习过
精选博文论坛热帖下载排行
本书将全面介绍C#编程的所有知识,共分为5篇:第1篇是C#语言:介绍了C#语言的所有内容,从基础知识到面向对象的技术,应有尽有。第2篇是Win...
订阅51CTO邮刊2017最新python面试题长啥样?你见过吗?
2017最新python面试题长啥样?你见过吗?
观点妞仔控
今天和同事在一起聊了下python方面的问题,发现最多的还是出现在面试上。下面和小伙伴们分享下我们总结的一些python面试题,希望能帮助到你们。如果你有Python基础或者已经学过一段时间的Python了,那就恭喜你继续往下面看和鄙视面试题目吧。当然如果您已经在从事Python方面的工作了,或者对Python比较精通也欢迎您补充和纠正下文中的题目。以下所有题目答案在搜索引擎中均可以查到因此不再放上答案,请大家自行搜索。1,Do you know the difference between range and xrange?2,Tell me a few differences between Python 2.x and 3.x3,What are decorators and what is their usage?4,How are arguments passed – by reference of by value?5,Do you know what list and dict comprehensions are? Can you give an example?6,What is PEP 8?7,Do you use virtual environments?8,Can you sum all of the elements in the list, how about to multuply them and get the result?9,Do you know what is the difference between lists and tuples? Can you give me an example for their usage?10,The with statement and its usage.11,说说你对zen of python的理解,你有什么办法看到它12,github上都fork过哪些python库,列举一下你经常使用的,每个库用一句话描述下其功能13,你调试python代码的方法有哪些14,什么是GIL15,什么是元类(meta_class)16,对比一下dict中 items 与 iteritems17,是否遇到过python的模块间循环引用的问题,如何避免它18,有用过with statement吗?它的好处是什么?19,说说decorator的用法和它的应用场景,如果可以的话,写一个decorator10,inspect模块有什么用11,写一个类,并让它尽可能多的支持操作符12,说一说你见过比较cool的python实现13,python下多线程的限制以及多进程中传递参数的方式14,如何用Python删除一个文件?15,Python如何copy一个文件?16,python程序中文输出问题怎么解决?17python代码得到列表list的交集与差集18,写一个简单的python socket编程19,python如何捕获异常20,在Python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景?21, 静态函数, 类函数, 成员函数的区别?22,a=1, b=2, 不用中间变量交换a和b的值23,Python是如何进行内存管理的?24,什么是lambda函数?它有什么好处?25,如何用Python输出一个Fibonacci数列?26,介绍一下Python中webbrowser的用法?27,解释一下python的and-or语法28,Python是如何进行类型转换的?29,Python如何实现单例模式?其他23种设计模式python如何实现?30,如何用Python来进行查询和替换一个文本字符串?31,如何用Python来发送邮件?32,有没有一个工具可以帮助查找python的bug和进行静态的代码分析?33,描述出3中python常用框架,并简要描述这些框架的优缺点34,reactor是什么? 有什么作用?请简要描述。35,请描述2种不同语言间数据流转通用格式。36,简述我们使用多线程编程时,锁与信号量之间的关系。37,通常在python编写tcp服务时,我们使用拆、粘包的模块是什么?如何加载这个模块?38,两个整数数组各有100亿条数据,并已经排序,保存在磁盘上,内存10M。问:(1)如何取得交集?时间和空间效率分别是多少?Python 集合set()操作方法(2)如果其中一个数组只有100条数据,如何优化算法取得交集?时间和空间效率分别是多少?(3)用自己熟悉的语言实现第2个问题,要求可以正确运行;假设已经提供函数read_elt(arrary_name, index)可以用来读取某个数组的第index个元素,元素个数分别用m=100和n=10^10表示。39,假设fd是一个socket,read(fd, buf, 1024)问:可能返回哪些值?其代表什么含义?40,假设网络会丢失消息,进程可能意外终止,磁盘可靠(写入数据后不会丢失);如何构建一个可靠的分布式key-value存储系统?答题要求如下:1.客户端向系统发送1条写入请求(例如key=x, value=1),系统返回'成功',客户端一定可以正确读取到key=y的值2.在你设计的系统中,要满足上面第1条,并有一定对故障的容错能力。3.如果要尽可能提高写入或读写成功率,如果改进系统设计?分别会有哪些问题?41,Python语言的有哪些缺陷?42,What are some key differences to bear in mind when coding in Python vs. Java?43,有哪些CPython的替代实现?什么时候,为什么会使用他们?44,Python是解释型的还是编译型的?45,为什么要用函数装饰器?请举例46,现在有一个 dict 对象 adict,里面包含了一百万个元素,查找其中的某个元素的平均需要多少次比较?一千万个元素呢?
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
观点妞仔控
百家号 最近更新:
简介: 左手一个妞啊,右手一个仔啊
作者最新文章}

我要回帖

更多关于 算法刷题网站排行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信