2011年1月3日星期一

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):
    以下为补完。

#请补完以下函数,使得最终的输出结果如后文所描述。
def add_1 (n):
    以下为补完。

def add (m, n):
    以下为补完。

def mul (m, n):
    以下为补完。

three = add_1 (two);
five = add (two, three);
fifteen = mul (three, five);

if __name__ == "__main__":
    print show_num (zero);
    print show_num (one);
    print show_num (two);
    print show_num (three);
    print show_num (five);
    print show_num (fifteen);

输出为:
1
2
3
5
15

----------------------------
该问题有多种解答。可以将答案输入系统,运行后正确即可。
答对一个函数得6分,下附上可行答案。
def show_num (n):
    return n () (lambda x:x+1) (0);

def add_1 (n):
    return lambda :lambda f:lambda x:f (n () (f) (x));

def add (m, n):
    return lambda :lambda f:lambda x:m () (f) (n () (f) (x));

def mul (m, n):
    return lambda :lambda f:m () (n () (f));

没有评论: