python面试题目
python面试题目
原文地址:https://www.usblog.cc/blog/post/justzhl/b5cc9a05c7d2
问题一:以下的代码的输出将是什么? 说出你的答案并解释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 muldef 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']
转载于:https://www.cnblogs.com/anzhangjun/p/9911009.html
python面试题目相关推荐
- 转-python面试题目集锦(100道部分附答案)
Python爬虫人工智能教程:www.python88.cn 编程资源网:www.python66.cn 最近收集整理了100道python真实面试笔试题,并自己做了一些,希望能帮助大家,顺利早日找到 ...
- selenium+python面试题目总结,完整度80%,看看你会多少?
1. WebDriver原理 webDriver是按照client/server模式设计,client就是我们的测试代码,发送请求,server就是打开的浏览器来打开client发出的请求并做出响应. ...
- Python面试题目--汇总
原文链接-https://github.com/taizilongxu/interview_python Python语言特性 1 Python的函数参数传递 2 Python中的元类(metacla ...
- absolute如果找不到定位父元素那么会相对于谁进行定位_selenium+python面试题目总结,完整度80%,看看你会多少?...
很多小伙伴会经常私信来问我问题,有些来不及回答,实在抱歉! 本篇有点长!看到最后,给自己一个学习的地方! 1. WebDriver原理 webDriver是按照client/server模式设计,cl ...
- python 面试题目嗯哼
1.不用运算符计算加法 def Add(self, num1, num2):# write code herel=[]l.append(num1)l.append(num2)return sum(l) ...
- 数据仓库面试题集锦(附答案和数仓知识体系),小红书Python面试题目
2.数据仓库和数据库的区别? 从目标.用途.设计来说 1)数据库是面向事务处理的,数据是由日常的业务产生的,并且是频繁更新的:数据仓库是面向主题的,数据来源多样化,经过一定的规则转换得到的,用于分析和 ...
- 工行python面试题目和答案_工商银行科技菁英笔试:完全平方数问题和共线点问题...
第二题:完全平方数 最近刷leetcode,做到了279,然后就想到了笔试题,然后就想分享一下思路,因为没有学过算法,所以可能解法是不对的,希望有同学可以帮忙给出更好的解法. 这道题目要求给出可以组成 ...
- 工行python面试题目和答案_迟到的面经,谢谢努力谢谢你
原标题:迟到的面经,谢谢努力谢谢你 作者:想回学校躺尸
- python考试题目及答案-python面试真实笔试题,带答案(1-10题)
最近从各种python微信群收集了100多道真实的python面试笔试题,因为都是真实题目,故没有答案,为了给那些即将面试的好友提供一份帮助,也为了给广大好友巩固基本python语法知识,最近将把收集 ...
最新文章
- 浪潮服务器开始虚拟化,(浪潮服务器-虚拟化解决方案.ppt
- 销售订单抬头与行项目数据的关系
- 程鑫峰:1.23日央行推行负利率政策,伦敦金后市行情解析
- c#爬虫-1688官网自动以图搜图
- OpenCV实战5: LBP级联分类器实现人脸检测
- 11月3日 迅雷白金会员vip账号分享 91freevip 23:00更新
- linux文件系统基础知识--目录项 dirent、inode 和数据块
- app图标圆角角度_iOS和安卓APP启动图标的尺寸和圆角大小详解
- vue函数@click.prevent使用纪要
- 产品经理的职业规划及绩效评估
- Android 10 SystemUI 如何隐藏状态栏耳机图标和定位图标
- 40款用于简洁网页设计的光滑英文字体【上】
- WebRTC系列--视频编码控制之BALANCED(分辨率与帧率平衡模式)
- Laravel 5.8 前瞻
- 2015版本的pdf文件合并拆分软件
- 十年技术进阶路,让我明白了三件要事(8000字长文)
- spring bean实现init/destory生命周期方法的三种方式
- 1.1、云计算HCIP服务器基础知识
- 5.4 文本分析与加密
- 【.NET】网站的打包与发布
热门文章
- java与.net比较学习系列(7) 属性
- SAD和SATD的区别[摘]
- java 模拟get登录_java 模拟get请求
- python nltk book_NLTK学习笔记(一):语言处理和Python
- 计算机电缆线对成缆系数,计算机电缆绞合系数 - 无图版
- class转java_[拒绝套路,纯干货]这一百多道 Java 基础问题你掌握了吗?
- mysql查询日期胜负_MySQL面试题:查询每个日期的胜负次数
- oracle 跑旧的文件,移动datafile以后,旧的datafile是否还被Oracle使用
- php solr 更新数据类型,Solr更新文档数据
- android 停用应用的命令,免Root使用ADB命令_停用手机系统应用