Shell's Home

Jan 4, 2011 - 2 minute read - Comments

python试题

前两年在公司用过的试题,不知道发过没有。在我的blog上搜了搜,没找着。大家可以看看玩。

1.py文件在运行时会产生pyc文件,用于缓存编译后代码(3分):
a.正确
b.错误
c.不完全正确
—————————-
c
2.python支持多线程,能够单进程无缝发挥多路CPU的优势(4分):
a.支持,能够
b.支持,不能够
c.不支持,能够
d.不支持,不能够
—————————-
b
3.在python中,使用for从列表中删除元素是错误的做法,会导致___________。
正确的做法是使用python内置的____________函数(4分)。
—————————-
漏删元素,filter。(一空2分)
4.请改正以下程序中的错误,并写出结果(12分,本题禁止使用python运行):
a=10
def test (*b):
print (a,type(b));
a = 20;
print a;
print b[0](b[0])
if __name__ == “__main__“:
print test (*[test]);
—————————-
答对一处错误给3分,答对结果给6分,结果其他部分对但type(b)错误给4分。
答其他错误倒扣2分,扣完为止。
a = 10;
def test (*b):
global a;
print (a, type(b));
a = 20;
print a;
if __name__ == “__main__“:
print test (*[test]);
以下是结果。
(10, <type ‘tuple’>)
20
None
5.下面代码是否有错,如果有,请修改错误。
如果没有,写出以下代码的运行结果(15分,本题禁止使用python运行):
def wrap_info (f):
b = {“b”:10};
def inner_func (*p, **k):
print b[‘b’], p, k;
b[‘b’] += 1;
f(*p, **k);
return inner_func;
def info (s):
print “func info: %s” % s;
if __name__ == “__main__“:
f1 = wrap_info (info);
f1 (“a”);
f2 = wrap_info (info);
f1 (“b”);
f2 (“c”);
—————————-
代码没有错误(回答有错全题不得分)。
10 (‘a’,) {}
func info: a
11 (‘b’,) {}
func info: b
10 (‘c’,) {}
func info: c
三个数,全部答对得15分,错一个扣5分,扣完为止。
以下题目可以使用python上机测试
—————————-
6.请写出一个python程序,能够打印自身(15分,允许使用python上机)。
—————————-
本题没有标准答案,将结果在python中运行即可,以下为一个可行答案。
a=“a=%s%s%s;print a%%(chr(34),a,chr(34));”;print a%(chr(34),a,chr(34));
全题15分,答对给分,答错无分。
7.补完以下函数,使得继承此类的对象具有单例特性(10分,允许使用python上机):
class singleton (object):
”“” 单例模式的实现 “””
def __new__ (cls, **kargs):
”“” “””
以下填空。
—————————-
以下为一种实现,其中_instance可以改为其他名称。
if ‘_instance’ not in cls.__dict__:
cls._instance = object.__new__ (cls, **kargs);
return cls._instance;
全题答对给10分,以其他方式实现单例给4分。
8.yield通常在python中被用做生成器,但实际上,这一实现是一种被称为协程的多线程交互模式。
请补全下面的代码,使得两个虚拟的线程能够互相交互运行(12分,允许python上机)。
def thread_1 ():
for i in range (0, 10):
print i;
yield i;
def thread_2 ():
for i in range (20, 30):
print i;
yield i;
def run (thread_pool):
if __name__ == “__main__“:
thread_pool = [];
thread_pool.append (thread_1 ());
thread_pool.append (thread_2 ());
run (thread_pool);
结果为0-9和20-29交替出现,不用考虑多函数的生成器停止不同步问题。
—————————-
该题也为多种答案,运行通过即可。
def run (thread_pool):
try:
while True:
for i in thread_pool:
i.next ();
except StopIteration:
pass
其他答案亦可,但结果不能交替出现不算分。未能捕获StopIteration扣6分。
9.指定加载问题(21分)
假定目前有一个正在工作的业务系统,其中一个抽象类大致如下:
class IfaceWorkspace:
….
系统的总体框架为django,系统内有该抽象类的一个实现,可能有客户在使用该实现工作。
此时,管理员需要动态的更换一个新的实现到服务器上,但不能重启django服务。
而且由于权限问题,因此系统仅仅对~/.temp具备写权限。代码不在此处,因此替换文件的思路是不可行的。
另外,由于新老实现对资源的操作方式不一致,因此同时运行的时候可能会出错。
因此,程序员编写了一个函数,接受输入的文件提交,将其载入系统并替换当前实现。
该实现不触发系统的重启,不会引发死机。请简述这个函数的实现机理,并用伪代码描述关键步骤。
—————————-
本题为主观题,任何理论上可以通过的步骤和方法都得分。下面是本题一种最简单的思路。
首先将上传文件内容保存到~/.temp下的某个文件中,而后使用imp.load_module加载到当前实例空间中。
使用全局静态工厂方法产生实例,因此在加载后可以向全局静态工厂方法注册替换。
当新的类注册时,阻塞工厂方法的调用。当工厂清理方法调用时,判断使用中列表是否为空。
空则完成实现的替换,并且向工厂方法发送信号,释放所有阻塞的线程。
使用动态载入,全局静态工厂,替换阻塞,三个点各7分,未用伪代码描述清楚得4分,总分21分。
10.柯西计数问题(24分):
#理论上,可以将自然数使用函数序列来表达,例如:
def zero ():
return lambda f:lambda x:x;
def one ():
return lambda f: lambda x:f (x);
def two ():
return lambda f:lambda x:f (f (x));
#请补完代码,判断一个函数对应自然数中的多少。
def show_num (n):
以下为补完。
#请补完以下函数,使得最