首页 > 技术文章 > 装饰器和单例模式、递归求斐波拉契数列

knighterrant 2019-05-13 21:38 原文

1. 用while 实现 for循环

li =[1,2,3,4]

a = li.__iter__()

while True:
    try:
        print(a.__next__())

    except StopIteration as e:

        break

2. 带参数的装饰器

# fla=True
# 装饰器
def flag(fla):
    def outer(func):

        def inner(*args,**kwargs):

            if fla:

                print('函数执行前')

                res = func(*args,**kwargs)

                print('函数执行后')

                return res

            res = func(*args, **kwargs)

            return res


        return inner

    return outer


fla=False
@flag(fla)

def func2():

    print('执行函数')

func2()

3. 单例模式

1. 装饰器方式实现

# 装饰器实现单例模式

def singlenton(cls):

    _instance ={}

    def _singlenton(*args,**kwargs):

        if cls not in _instance:

            _instance[cls] =cls(*args,**kwargs)

        return _instance[cls]

    return _singlenton

@singlenton

class A():
    def __init__(self,x):
        self.x=x

    pass

a1=A(1)
a2=A(2)
print(id(a1),id(a2))   # 1584069849608 1584069849608

2. 基于 __new__实现单例模式

class Singlenton(object):


    _instance=None
    def __init__(self):
        pass

    def __new__(cls, *args, **kwargs):

        if not hasattr(Singlenton,'_instance'):
            Singlenton._instance=cls

        return Singlenton._instance

s1 =Singlenton()
s2 =Singlenton()
print(id(s1),id(s2))  # 1867687056 1867687056

4 递归求  斐波拉契数列

#  1 1 2 3  5  8

def func(n):

    # n  表示斐波拉契数列第几位数

    if n<=2:

        return 1

    return func(n-1)+func(n-2)


#斐波拉契 数列

n =8

for i in range(1,n+1):
    
    print(func(i))

 5. 内置函数

# map()
li=[4,6,3,1]

def square(x):
    return x*x

print(list(map(square,li)))

# zip()

# filter()
def is_odd(n):

    return n%2==1
li2=[1,2,3,4,5,6]
new_list=filter(is_odd,li2)
print(list(new_list))

#  sorted()
dic=[{'name':'deng','age':12},{'name':'deng','age':16},{'name':'deng','age':2}]
sort_dic=sorted(dic,key=lambda x:x['age'])
print(sort_dic)

 

推荐阅读