小癖好~爱做面试题,感觉每次做份面试题总能在其中复习了很多基础知识和一些算法~
用规定的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