+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-03(54)

2020-04(62)

2020-05(27)

2020-06(44)

2020-07(35)

study 15 装饰器的加载顺序、函数递归及匿名函数

发布于2020-06-25 21:19     阅读(1028)     评论(0)     点赞(5)     收藏(2)


0

1

2

3

4


在这里插入图片描述

1、装饰器:

1.1、叠加多个装饰器的加载、运行分析
def deco1(func1):  # func1 = wrapper2的内存地址
    def wrapper1(*args, **kwargs):
        print('正在运行===>deco1.wrapper1')
        res1 = func1(*args, **kwargs)
        return res1
    return wrapper1

def deco2(func2):  # func2 = wrapper3的内存地址
    def wrapper2(*args, **kwargs):
        print('正在运行===>deco2.wrapper2')
        res2 = func2(*args, **kwargs)
        return res2
    return wrapper2

def deco3(x):
    def outter3(func3):  # func3=被装饰对象index函数的内存地址
        def wrapper3(*args, **kwargs):
            print('正在运行===>deco3.outter3.wrapper3')
            res3 = func3(*args, **kwargs)
            return res3
        return wrapper3
    return outter3

# 加载顺序自下而上(了解)
@deco1  # index=deco1(wrapper2的内存地址)        ===> index=wrapper1的内存地址
@deco2  # index=deco2(wrapper3的内存地址)        ===> index=wrapper2的内存地址
@deco3(111)  # ===>@outter3===> index=outter3(index) ===> index=wrapper3的内存地址
def index(x, y):
    print('from index %s:%s' % (x, y))

# 执行顺序自上而下的,即wraper1 -> wrapper2 -> wrapper3
index(1, 2)  # wrapper1(1,2)

结论:
1、装饰器的加载顺序是自下而上的
2、装饰器的执行顺序是自上而下的

2、函数的递归调用:

2.1、定义与使用
函数的递归调用:指的是在调用一个函数的过程中又直接或者间接地调用了自己
函数的递归调用就是一个循环的过程
一段代码的循环运行的方案有两种:
方式一(whilefor循环):
while True:
    print(1111)
    print(2222)
    print(3333)

方式二(递归的本质就是循环):
def f1():
    print(1111)
    print(2222)
    print(3333)
    f1()
f1()
需要强调的的一点是:
递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用
2.2、递归调用经历两个阶段
函数的递归调用:是函数嵌套调用的一种特殊形式
递归调用应该遵循的一个大前提是:必须在满足某种条件下结束递归调用,然后向上一层一层返回
递归调用经历两个阶段:
1、回溯:向下一层一层地调用
2、递推:在某一层终止调用,开始向上一层一层返回

age(5) = age(4) + 10
age(4) = age(3) + 10
age(3) = age(2) + 10
age(2) = age(1) + 10
age(1) = 18

def age(n):
    if n == 1:
        return 18
    return age(n-1) + 10

res=age(5)
print(res)
2.3、递归的应用
l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]

def f1(list1):
    for x in list1:
        if type(x) is list:
            # 如果是列表,应该再循环、再判断,即重新运行本身的代码
            f1(x)
        else:
            print(x)
f1(l)

3、二分法:

3.1、传统的方法(效率低)
# 有一个有序排列的数字列表,查找某个值是否存在
nums = [-3, 1, 5, 7, 11, 13, 21, 37, 45]
find_num = 45
for num in nums:
    if find_num == num:
        print('找到啦')
        break
else:
    print("不存在")
3.2、二分法解决
nums = [-3, 1, 5, 7, 11, 13, 21, 37, 45] # 该列表必须是有序的

find_num = 47
def search(find_num,nums):
    print(nums)
    if len(nums) == 0:
        print('不存在')
        return
    mid_index = len(nums) // 2
    if find_num > nums[mid_index]:
        # 查找范围:右半部分
        new_nums = nums[mid_index + 1:]
        search(find_num,new_nums)
    elif find_num < nums[mid_index]:
        # 查找范围:左半部分
        new_nums = nums[:mid_index]
        search(find_num,new_nums)
    else:
        print("找到啦")

search(find_num,nums)

4、匿名函数:

4.1、定义与使用
匿名函数:就是没有名字的函数
匿名函数只用于临时使用一次的场景
# 1、def用于定义有名函数
func=函数的内存地址
def func(x,y):
    return x+y
print(func)

# 2、lamdab用于定义匿名函数
print(lambda x,y:x+y)
4.2、调用匿名函数的方式
# 方式一:
res=(lambda x,y:x+y)(1,2)
print(res)

# 方式二:
func=lambda x,y:x+y
res=func(1,2)
print(res)

总结:匿名用于临时调用一次的场景,更多的是将匿名与其他函数配合使用
4.3、匿名函数的应用
salaries = {
    "allen": 3600,
    "lily": 3000,
    "lucy": 4000
}
# 取薪资最高的那个人的名字
# max的应用
def func(k):
    return salaries[k]

res=max(salaries,key=func)
print(res)

res=max(salaries,key=lambda k:salaries[k])
print(res)

# min的应用
res=min(salaries,key=lambda k:salaries[k])
print(res)

# sorted排序
res=sorted(salaries,key=lambda k:salaries[k],reverse=True)
print(res)

原文链接:https://blog.csdn.net/wcg920212/article/details/106917659

0

1

2

3

4



所属网站分类: 技术文章 > 博客

作者:一切都会好起来over

链接: https://www.pythonheidong.com/blog/article/430593/13e170dd2dd8dbf581e7/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0
收藏该文
已收藏

评论内容:(最多支持255个字符)