Python面试常考的代码编程题(快速排序、二分查找、装饰器、单例模式、斐波那契数列)
小白一个,有错误欢迎指正,谢谢
1.快速排序
递归算法
def QuickSort(arr,start,end):
if start < end:
i,j = start,end
temp = arr[i]
while i < j:
while (i<j) and arr[i] <= temp:
i += 1
arr[j] = arr[i]
while (i<j) and arr[j] > temp:
j -= 1
arr[i] = arr[j]
arr[i] = temp
QuickSort(arr,start,i-1)
QuickSort(arr,i+1,end)
return arr
QuickSort = lambda arr : arr if len(arr) <= 1 else QuickSort([item for item in arr[1:] if item < arr[0]]) + [arr[0]] + QuickSort([item for item in arr[1:] if item > arr[0]])
2.二分查找
递归算法
def BinarySearch(arr,start,end,key):
if start > end:
return -1
mid = start + (end - start)//2
if key > arr[mid]:
return BinarySearch(arr,mid+1,end,key)
elif key < arr[mid]:
return BinarySearch(arr,start,mid-1,key)
else:
return mid
非递归算法
def BinarySearch(arr,key):
low = 0
high = len(arr)-1
while low <= high:
mid = low + (high-low)//2
if key > arr[mid]:
low = mid + 1
elif key < arr[mid]:
high = mid - 1
else:
return mid
return -1
3.装饰器
def A_Outer(func):
print(2)
def A_Inner(*args,**kwargs):
print(3)
func(*args,**kwargs)
print(7)
return A_Inner
def B_Outer(func):
print(1)
def B_Inner(*args,**kwargs):
print(4)
func(*args,**kwargs)
print(6)
return B_Inner
@A_Outer
@B_Outer
def func(*args,**kwargs):
print("5:我是func")
func()
'''
要注意的是,装饰器在被装饰的函数运行前就已经运行了,可以试一下把func()注释掉,结果会显示
1
2
也即装饰器调用顺序:先调用B_Outer,再调用A_Inner,A_Outer装饰器传入的func其实是
@B_Outer
def func(*args,**kwargs):
print("5:我是func")
也就是被B_Outer装饰了的func,而不是def 后面的func本身,B_Outer装饰器里传入的func才是def func 也即字面上的func本身
可以看一下下面这张图
'''
# 装饰器是怎么工作的?
def A_Outer(func):
def A_Inner(*args,**kwargs):
return A_Inner
"""
函数def A_Outer的返回值是函数A_Inner,也就是说执行了函数A_Outer后,结果是A_Inner
var = A_Outer(func) # var=A_Inner
func = var
这样也就实现了装饰器@的功能即 func=A_Outer(func)=A_Inner
# 1、注释掉上面代码中的func()后的执行结果
1
2
# 2、正常执行func()后的执行结果(打印顺序):
1
2
3
4
5:我是func
6
7
4.单例模式
4.1 Python自带的模块实现
Python中的模块是天然的单例模式,模块在生成时会自动生成一个.pyc文件,下次再使用这个模块的时候,只需要加载.pyc文件即可,不会再次执行模块代码
调用时,只需 from mySingleton import Singleton,就可以使用里面的类Singleton
#这是一个文件名为mySingleton.py的py文件
class Singleton:
def func(self)
pass
singleton = Singleton()
4.2 使用装饰器实现
def Singleton(func):
_instance = {}
def _Singleton(*args,**kwargs):
if func not in _instance:
_instance[func] = func(*args,**kwargs)
return _instance[func]
return _Singleton
@Singleton
class A:
def __init__(self,x=0):
self.x = x
a1 = A(1)
a2 = A(2)
print(a1 is a2) #结果为True,说明a1和a2的地址相同
4.3使用类实现
class Singleton(object):
def __init__(self):
pass
@classmethod
def instance(cls,*args,**kwargs):
if not hasattr( Singleton,"_instance")
Singleton._instance = Singleton(*args,**kwargs)
return Singleton._instance
5.斐波那契数列
def Fib(num):
if num in (1,2):
return 1
return Fib(num-1)+(num-2)