python核心扩展

一、得到固定位数斐波那契数列列表

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'

此时不能动态添加方法,会报错,但是节省了内存空间


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值