python面试题(转)
下面的代码输出什么?
list = ['a', 'b', 'c', 'd', 'e']
print list[10:]
上面的代码输出[]
,并且不会导致IndexError
错误
跟你想的一样,当取列表元素的时候,如果索引值超过了元素的个数(例如在上面的列表中,取list[10])将会导致IndexError
错误。但是,取一个列表的切片的时候,如果起始索引超过了元素个数,将不会引起IndexError
错误,仅返回一个空列表。
这一特性将会导致一些非常难于追踪的bug,因为在运行时根本没有错误产生。
下面的代码在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中上面的代码的输出有何不同(假设代码中的print语句都转化成了Python3中的语法结构)?
在Python2中,代码的输出是:
5/2 = 2
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0
默认情况下,如果两个操作数都是整数,Python2默认执行整数运算。所以,5/2
结果是2
,而5./2
结果是2.5
注意你可以通过下面的import语句来覆盖Python2中的这一行为
from __future__ import division
还要注意“双斜杠”(//
)操作符将会一直执行整除,忽略操作数的类型。这就是为什么5.0//2.0即使在Python2中结果也是2.0
但是在Python3并没有这一行为。两个操作数都是整数时,也不执行整数运算。在Python3中,输出如下:
5/2 = 2.5
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0
下面代码的输出是什么?请解释你的答案
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
函数的list
参数在每一次函数被调用时都会被设置为默认值[]
但是,真实的情况是,默认的list
只在函数定义的时候被创建一次。之后不指定list
参数地调用extendList
函数时,使用的都是同一个list
。这是因为带默认参数的表达式是在函数定义的时候被计算的,而不是在函数调用时。
question:既然Python的默认参数都是在定义时计算的,下次调用时会调用统一个list,那最后一个怎么不得24呢???
所以,list1
和list3
都是在操作同一个默认list
,而list2
是在操作它自己创建的一个独立的list
(将自己的空list
作为参数传递过去)
extendlist
的定义可以这样定义来达到我们预期的效果:
def extendList(val, list=None):
if list is None:
list = []
list.append(val)
return list
调用修改后的函数,输出是:
list1 = [10]
list2 = [123]
list3 = ['a']
下面代码的输出是什么?请解释你的答案
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 1
而是3 2 3
. 为什么修改了Parent.X的值会影响到Child2.x
,但是同时又没有改变Child1.x
的值呢?
这个问题的关键在于,在Python中,类中的变量在内部被当作字典处理。如果一个变量名在当前类的字典中没有被发现,系统将会在这个类的祖先(例如,它的父类)中继续寻找,直到找到为止(如果一个变量名在这个类和这个类的祖先中都没有,那么将会引发一个AttributeError
错误)
因此,在父类中将变量x赋值为1,那么x变量将可以被当前类和所有这个类的子类引用。这就是为什么第一个print语句输出为1 1 1
.
接下来,如果它的子类覆盖了这个值(例如, 当我们执行Child1.x = 2
),那么这个变量的值仅仅在这个子类中发生了改变。这就是为什么第二个print语句输出1 2 1
最后,如果父类改变了这个变量的值(例如,我们执行Parent.x = 3
),所有没有覆盖这个参数值的子类(在这个例子中覆盖了参数的就是Child2
)都会受到影响,这就是为什么第三个print语句的输出为3 2 3
下面代码的输出是什么?请解释你的答案
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
。因此,所有返回的函数都要乘以传递过来的3
,因为上面的代码传递了2
作为参数,所以他们都返回了6
(即,3 * 2
)
(顺便提一句,正如在书《The Hitchhiker’s Guide to Python》中提出来的一样, 有一种广泛传播的误解认为这个问题和lambda表达式有关,事实并非如此。通过labda表达式产生的函数并没有什么特别之处,使用普通的def
定义的函数的行为和lambda表达式产生的函数的行为是一样的.)
下面是一些可以绕过这个问题的方法。
方法一是像下面一样使用Python的生成器(generator)
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)]
或者,你也可以使用functools.partial函数:
from functools import partial
from operator import mul def multipliers():
return [partial(mul, i) for i in range(4)]
考虑下面的代码片段:
1. list = [ [ ] ] * 5
2. list # output?
3. list[0].append(10)
4. list # output?
5. list[1].append(20)
6. list # output?
7. list.append(30)
8. 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
并没有创建一个包含5个不同列表的列表。创建的这个列表里的5个列表,是对同一个列表的引用(a a list of 5 references to the same list)。理解了这些,你就能更好地理解余下的输出。
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]
.
有一个拥有N个元素的列表,用一个列表解析式生成一个新的列表,元素的值同时满足以下条件:
(a) 偶数,以及
(b) 在原列表中,索引为偶数
例如,如果list[2]的值是偶数,那么这个元素应该也被包含在新列表中,因为它在原列表中的索引也是偶数(即 2). 但是, 如果list[3]是偶数,那这个值不应该被包含在新列表中,因为它在原列表中的索引是一个奇数。
一个简单的解法如下:
[x for x in list[::2] if x%2 == 0]
例如,给出下面的列表:
# 0 1 2 3 4 5 6 7 8
list = [ 1 , 3 , 5 , 8 , 10 , 13 , 18 , 36 , 78 ]
列表解析式[x for x in list[::2] if x%2 == 0]
会生成:
[10, 18, 78]
这个表达式首先取列表中索引是偶数的数字,然后过滤掉所有的奇数.
转自:http://blog.csdn.net/ialexanderi/article/details/69388571
python面试题(转)的更多相关文章
- Python面试题 —— 获取列表中位数
中位数是一个可将数值集合划分为相等的上下两部分的一个数值.如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数:如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的中位 ...
- python公司面试题集锦 python面试题大全
问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...
- 【Python】【面试必看】Python笔试题
前言 现在面试测试岗位,一般会要求熟悉一门语言(python/java),为了考验求职者的基本功,一般会出 2 个笔试题,这些题目一般不难,主要考察基本功.要是给你一台电脑,在编辑器里面边写边调试,没 ...
- Python面试题整理-更新中
几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路 ...
- python 面试题4
Python面试题 基础篇 分类: Python2014-08-08 13:15 2071人阅读 评论(0) 收藏 举报 最近,整理了一些python常见的面试题目,语言是一种工具,但是多角度的了解工 ...
- 一道Python面试题
无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun(): temp = [lambda x : i*x for i in range(4)] return ...
- 很全的 Python 面试题
很全的 Python 面试题 Python语言特性 1 Python的函数参数传递 看两个例子: Python 1 2 3 4 5 a = 1 def fun(a): ...
- SQL + Python 面试题:之二(难度:中等)
SQL + Python 面试题:之二(难度:中等)
- Python面试题之一:解密
Python面试题之一: 说明:就是Python工程师面试题 一.字典转换与正则提取值 1:key与Value交换 a = {'a':1,'b':2} print({value:key for key ...
- 震惊!几道Python 理论面试题,Python面试题No18
本面试题题库,由公号:非本科程序员 整理发布 第1题: 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候 ...
随机推荐
- C#使用WebService 常见问题处理
C#使用WebService 一.新建webservice 新建项目→asp.net Web服务应用程序 或者在现有项目中 点击右键 新建web服务程序asmx 只要在webservice类里面 ...
- js阻止默认事件、拖拽等等
1.自定义右键菜单: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> &l ...
- 廖雪峰Java1-2程序基础-5浮点数运算
1.浮点数运算的特点 很多浮点数无法精确表示 计算有误差 整型可以自动提升到浮点型 如0.1用二进制表示会是一个无限循环的小数.计算机不可能在有限内存中表示一个无限小数.因此浮点数不能精确表示.也造成 ...
- centos7 设置系统时间与网络同步
1.安装ntpdate工具 yum -y install ntp ntpdate 2.设置系统时间与网络时间同步 ntpdate cn.pool.ntp.org 3.将系统时间写入硬件时间 hwclo ...
- Lua C++互传结构体实例
转自:http://bbs.csdn.net/topics/350261649 =====main.cpp======= #include "stdio.h" extern &qu ...
- Scrapy框架——CrawlSpider爬取某招聘信息网站
CrawlSpider Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页, 而Craw ...
- OpenGL 多线程共享纹理
1:opengl 多线程共享纹理纹理: //解码时候使用opengl进行绘制,需要构建队列和两个线程,分别用于解码数据并且填充纹理和渲染. 主线程常见两个共享上下文: main() { ⋯⋯⋯⋯ gH ...
- 管理oracle 11g RAC 常用命令
1).检查集群状态: [grid@rac02 ~]$ crsctl check cluster CRS-4537: Cluster Ready Services is online CRS-4529: ...
- CSS Web安全字体组合
常用的字体组合 font-family属性是多种字体的名称,作为一个"应变"制度,以确保浏览器/操作系统之间的最大兼容性.如果浏览器不支持的第一个字体,它尝试下一个的字体. 你想要 ...
- 开发组件:REST API
REST API 最佳入门指南 https://blog.csdn.net/px01ih8/article/details/78674685