您的位置:首页 > 编程语言 > Python开发

Python:递归和装饰器

2016-05-14 12:44 549 查看

递归

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

#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(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


View Code

[b]冒泡排序:


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

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



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

示例:

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函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: