python面试题精选


小癖好~爱做面试题,感觉每次做份面试题总能在其中复习了很多基础知识和一些算法~

用规定的Python方法,在一行中对给定的任意整数数列,按照如下规则排序:

a) 非负数在前,负数在后;
b) 非负数部分按照从小到大排序;
c) 负数部分按从大到小排序。
如: 数列 foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4]
希望排序后为[0,2,4,8,8,9,-2,-4,-4,-5,-20]

解答:

>>> foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4]
>>> sorted(foo, key=lambda x: (x>=0 and -abs(1/float(x+1)) or abs(x)))
[0, 2, 4, 8, 8, 9, -2, -4, -4, -5, -20]
>>>

给出用递归的方式求斐波那契数列的第n项的方法:

(斐波那契数列指的是这样一个数列0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,…)
特别指出:第0项是0,第1项是第一个1。这个数列从第2项开始,每一项都等于前两项之和。

解答:

# test.py
def fib(n):
    if n <= 1:
        return n
    else:
        return(fib(n - 1) + fib(n - 2))
if __name__ == '__main__':
    n = 10
    print fib(n)

求大于正整数n的最小质数

import math

def func_get_prime(n):
    return filter(lambda x: not [x % i for i in range(2, int(math.sqrt(x)) + 1) if x % i == 0], range(2, n + 1))
if __name__ == '__main__':
    print min(func_get_prime(100))

在不声明新变量的情况下,让变量a和变量b的值互换?

解答:

>>> a = 1
>>> b = 9
>>> a = a + b
>>> b = a - b
>>> a = a - b
>>> a
9
>>> b
1
>>>

Python是如何进行内存管理的?

解答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制
一、对象的引用计数机制
python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值
sys.getrefcount( )函数可以获得对象的当前引用计数
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
二、垃圾回收
1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
三、内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

什么是lambda函数?它有什么好处?

解答:

lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
lambda函数:首要用途是指短小的回调函数

lambda [arguments]:expression
>>> a=lambda x,y:x+y
>>> a(3,11)

现在有一个文件url.txt,每一行都是一个网站名(例如:map.baidu.com)请用Python读取这个文件并且使用正则表达式匹配简单的以“www.”,以“.com”或者”.edu”或者”.gov”作结尾的web域名,然后输出到另一个文件中

解答:
coding:utf-8
import re
sch = re.compile(r”^www.*[com,edu,gov]$”)
listt = []
with open(‘C:\Users\test\Desktop\test.txt’, ‘r’) as f:
file_list = f.readlines()
for i in file_list:
listt.append(sch.match(i).group())

with open('C:\Users\test\Desktop\\chen.txt', 'a') as f:
    for i in listt:
        f.write(i + '\n')

写一个装饰器,计算这个函数运行了多长时间?

1.复杂

import time
from functools import wraps
import random


def fn_timer(function):
    @wraps(function)
    def function_timer(*args, **kwargs):
        t0 = time.time()
        result = function(*args, **kwargs)
        t1 = time.time()
        print ("Total time running %s: %s seconds" %(function.func_name, str(t1-t0)))
        return result
    return function_timer


@fn_timer
def random_sort(n):
    return sorted([random.random() for i in range(n)])


if __name__ == "__main__":
    random_sort(2000000)

2.简单

# coding:utf8
import time

# clock()方法返回当前的处理器时间,以秒表示Unix上一个浮点数。
# 精度取决于具有相同名称的C函数,但在任何情况下,
# 这是使用于基准Python或定时的算法函数。

def suan(fn):
    def wrapper():
        start = time.clock()
        print start
        fn()
        end = time.clock()
        print end
        return end - start
    return wrapper


@suan
def func():
    return range(100000)

print func()

django查询取出数据库”User表”中字段”name”为”chen”和”ning”的数据?

# django查询方法
query = Author.objects.filter(first_name__in=["chen", "ning"])

# Q查询
query = Author.objects.filter(Q(first_name__contains="chen") | Q(first_name__contains="ning"))
query = Author.objects.filter(Q(first_name="chen") | Q(first_name="ning"))

考面向对象的一道题

#coding:utf-8

class Parent(object):
    x = 1
    def __init__(self, v):
        self.x = v


class Child(Parent):
    def __init__(self, v, m):
        # 调用父类的__init__,填上空缺的
        self.y = m


p = Parent(2)

print p.x, Parent.x

c = Child(2,3)
print c.x, Parent.x, Child.x


Parent.x = 3

print Parent.x , Child.x

热评文章