几道python面试题

前几天去笔试,这里记录一下遇到的几个编程题,比较基础。

生成斐波那契数列并取前10项


def func(m):
  n,a,b = 0,1,1
  while n < m:
    yield a
    a,b = b,a+b
    n += 1

for one in func(10):
  print one

这个可以说是一道常见的简单算法题了,关键点就是理解a,b=b,a+b以及yield的作用。

扩展一个列表,列表中的元素可能也包含列表

def myextend(alist):
    tmp = []
    for one in alist:
        if isinstance(one,list):
            tmp.extend(myextend(one))
        else:
            tmp.append(one)
    return tmp

t = [1,2,5,[3,[],5,2,[57]],90]

print t
print myextend(t)

考察递归调用的思想。

有如下代码,请写出输出

def test(x,l=[]):
    for o in range(x):
        l.append(o)
    print l

test(3)
test(1,[3,2,1])
test(3)

输入如下:

[0,1,2]
[3,2,1,0]
[0,1,2,0,1,2]

可变类型作为参数在不显示传递参数时,每次函数调用时候都是共用的;如果传递了参数(比如第二种)则不会互相影响。

已知某列表中包含重复数据,保持列表中元素第一次出现的顺序并去重,要求复杂度为O(n)。

def fun(alist):
    result = []
    temp = set()
    for o in alist:
        if o not in temp:
            result.append(o)
            temp.add(o)
    return result

考察列表、集合等常见操作的复杂度。

已知如下函数,请写出输出,并写出正确写法:

z = [lambda x:x*i for i in range(3)]

x = [o(2) for o in z]

print x

输出为[4,4,4]

这里主要考察python中闭包、返回值为函数时候的知识点。由于lambda函数共用了i变量,当调用时候i已经变成了2,所以输出都是4。

改正:

def func():
    def m(x):
        def n(y):
            return x * y
        return n
    return [f(one) for one in range(3)]

z = func()

x = [o(2) for o in z]

print x

输出[0,2,4]

创建一个类,并输出某个属性。如果这个属性存在则输出值,否则输出这个属性名的字符串

class Mycls(object):
    a = 0
    def __getattr__(self,name):
        print name

z = Mycls()
print z.a,z.b

输出为0,b。

主要考察python的反射机制,以及类相关的__getattr__方法。

注意__getattr__方法和__getattribute__方法的区别,前者只有在属性不存在时候调用,返回一个值或者引发异常。而后者是每次都会被调用的。

另外可以看看getattr(),hasattr()这种内置函数。

简答题

  1. 简述py2和py3的区别
  2. python的垃圾回收机制
  3. python中多线程的方法,局限,以及有什么其他方式进行并发处理
  4. 简述epoll、select、poll三种模型