一、得到固定位数斐波那契数列列表
def get_fb(num):
#初始化数列
fb_list = [1,2]
for i in range(0,num-2):
#初始化列表最后一位为0,防止报错
fb_list.append(0)
fb_list[i+2] = fb_list[i] + fb_list[i+1]
return fb_list
从上我们得到了一个固定位数的斐波那契数列,由此引申出一个问题:求斐波那契数列第n项的值
以下是对上述问题的几种解法:
- 递归函数
def get_value(n):
if n <= 1:
return 1
return get_value(n-1) + get_value(n-2)
递归可以解决当n值不大的情况,当n值过大时,由于多次重复计算,导致运行速度太低
构造缓存
def get_value(n,cache=None): #若缓存不存在,则创建缓存 if cache is None: cache = {} #在缓存中查找值 if n in cache: return cache[n] if n<= 1: return n #缓存中没有,则向缓存添加值 cache[n] = get_value(n-1,cache) + get_value(n-2,cache) return cache[n]
使用函数装饰器
def momo(func):
cache = {}
def warp(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return warp
@momo
def get_value(n):
if n <= 1:
return 1
return get_value(n-1) + get_value(n-2)
二、列表字符串替换
将a = [‘abc01’,’abc02’,’abc03’,’abc04’]中所有’abc’替换为’000’
- map函数 + 列表生成式 + lambda 表达式
#map + 列表生成式 + lambda表达式
a = list(map(lambda x:x.replace('abc','000'),[i for i in a]))
- for循环
def change_str(c):
b = []
for i in c:
i = i.replace('abc','000')
b.append(i)
return b
change_str(a)
三、修改内置不可变类型实例化方法
当对同一数据在需要进行过滤时,我们一般采用以下几种方法
- 添加装饰器
- 封装代码段
重做构造方法
装饰器和代码段,在函数种可用,但对于基础数据类型而言,并不实用。
举例修改python内置不可变数据类型tuple,做其派生类。要求输出一个元组,对传入其中的不是int类型,且值小于零的单项进行过滤
继承tuple类,做tuple派生类
class IntTuple(tuple): def __new__(cls,iterable): g = (i for i in iterable if isinstance(i,int) and i > 0) return super(IntTuple,cls).__new__(cls,g) def __init__(self,iterable): super(IntTuple,self).__init__()
实例化派生tuple类
s = IntTuple([1,[2,3],-2]) #---> (1,)
四、如何在大量实例化对象时,节省内存
在对类进行大量实例化时,__dict__对象自身占用了1024字节的内存
__dict__是动态为对象增加属性
为了减少内存的使用,采用预先声明属性的方法__solts__
class Person:
__solts__ = ['uid','name','sex']
def __init__(self, uid, name, move, sex='男')
self.eat = eat
self.speak = speak
self.move = move
实例化一个Person类
p1 = Person('01','jack')
p1.eat = 'yes'
此时不能动态添加方法,会报错,但是节省了内存空间