递归&冒泡&装饰器

  • 递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

#lambda:
func = lambda x,y:9+x
参数:x,y
函数体:9+x
函数名:func

扩展:函数名可以当做参数传递 

函数名():执行函数

函数名:代指函数

def f1():
    return "F1"

#f1 ==>代指函数
#f1() ==>执行函数

示例:

复制代码
def f3(arg):
    arg()

def x():
    print("xxx")

f3(x)
#打印结果:xxx
复制代码
复制代码
def f1():
    return "F1"

def f2(arg):
    arg()
    return "F2"

r = f2(f1)
print(r)
#打印结果:F2

# #f1 =>函数
# #f2 =>执行函数
# #f2(f1) =>执行f2函数,实际参数是f1函数
复制代码
复制代码

#斐波那契
def f(a1,a2):
if a1 > 100:
return
print(a1)
a3 = a1 + a2
f(a2,a3)
f(0,1)
#打印结果:
1
2
5
13
34
89

复制代码
练习:写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者。
复制代码
def f(depth,a1,a2):
    if depth == 10:
        return a1
    a3 = a1 + a2
    r = f(depth+1,a2,a3)
    return r
ret = f(1,0,1)
print(ret)
#打印结果:34
复制代码

 

冒泡排序:

    冒泡,原理是临近的数字两两进行比较,按照从小到大的顺序进行交换,这样交换一次之后,最大的数字就被交换到了最后一位。

    将列表中的数字按从小到大的顺序排列:

    然后再从头开始进行两两比较。

示例:

复制代码
li = [33,2,10,1]
for j in range(1,len(li)):
    for i in range(len(li) - j):
        if li[i] > li[i + 1]:
            temp = li[i]
            li[i] = li[i + 1]
            li[i + 1] = temp
print(li)
#打印结果:[1, 2, 10, 33]
复制代码
  •  装饰器

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。也就是说装饰器的作用就是为已经存在的对象添加额外的功能。 当使用@将装饰器附加到函数上时,就会调用此方法。

单层装饰器:

复制代码
def outer(func):
    def inner():
        print("hello")
        r = func()
        print("end")
        return r
    return inner
@outer
def f1():
    print("F1")
f1()
#打印结果:
hello
F1
end


#1、执行outer函数,是将下面的函数名,当做outer函数的参数
#2、将outer的返回值重新赋值给f1,意思就是f1 = outer的返回值
复制代码

 

双层装饰器:

注:对参数数量不确定的函数进行装饰,参数用(*args,**kwargs),自动适应参数数量。

和单层装饰器原理一样,只是在原有基础上又多了一个装饰器。示例:

复制代码
def outer1(func):
    def inner(*args,**kwargs):
        print("123")
        ret = func(*args,**kwargs)
        print("123")
        return ret
    return inner
def outer2(func):
    def inner(*args,**kwargs):
        print("456")
        ret = func(*args,**kwargs)
        print("456")
        return ret
    return inner
@outer1
@outer2
def f():
    
    return "ok"

r = f()
print(r)

#打印结果:
123
456
456
123
ok

# 1、执行outer2函数,将f作为outer2函数的参数,将f赋值给func
# 2、得到返回值inner,重新赋值给f:f = inner  ==>  f() = inner()
# 3、执行outer1函数,将整个inner函数作为outer1函数的参数
# 4、得到返回值inner,再重新赋值给f:f == inner  ==> f() = inner()
# 5、因为装饰器只有两层,就不用再执行下一个装饰器函数,如果更多层就继续循环以上程序过程
# 6、下面就执行最终的inner函数,执行func函数时,就是执行最原始的f函数
posted @ 2018-09-11 18:58  Shadow_Y  阅读(118)  评论(0编辑  收藏  举报