万能的函数(三)

本文深入探讨了Python中的高阶函数概念,包括闭包和装饰器的使用,解释了如何利用装饰器在不修改原函数的情况下进行功能扩展,提高了代码的可维护性和灵活性。

1.高阶函数

  • 所谓高阶函数就是使用一个或多个函数作为参数,或者是将函数作为返回值返回
    在这里插入图片描述
    在这里插入图片描述

  • map 是一个在 Python 里非常有用的高阶函数,它接受一个函数和一个序列(迭代器)作为输入然后对序列(迭代器)的每一个值应用这个函数,返回一个序列(迭代器),其包含应用函数后的结果
    在这里插入图片描述
    在这里插入图片描述

2.闭包

  • 将函数作为返回值也是高阶函数,也称之为闭包
  • 闭包的好处
    • 创建只有当前函数可以访问的变量
    • 可以将一些私有数据隐藏到闭包中
  • 形成闭包的条件
    • 函数嵌套
    • 将内部函数作为返回值返回
    • 内部函数必须使用外部函数的变量
      在这里插入图片描述

3.装饰器的引入

  • 可以直接通过修改函数中的代码来完成需求,但是会产生以下的问题:

    • 如果修改的函数多,这样的操作会非常麻烦
    • 不便于后期维护
    • 会违反开闭原则(OCP)
      • 程序的设计,要求开发对程序的扩展,关闭对程序的修改
  • 在之前的文章中看到过这样描述装饰器的话,很形象。

    • 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办? 我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤,在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后宝宝再也不冷了。装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效。

4.装饰器的使用

  • 通过装饰器,可以在不修改原函数的情况下对函数进行扩展
  • 在开发中,可以通过装饰器来对函数进行扩展

先来个简单的装饰器
在这里插入图片描述
在这里插入图片描述

上面的例子传入的是无参数的函数。如果我们想要传入带参数的函数怎么办?
def add(a ,b):

     return a + b
    # print(a + b)

def fn():
    print('Hello World')

def demo():

    def new_func():
        print('函数开始执行')

        s = add(1, 20)


        print('函数执行结束')
        return s
    
    return new_func()
r = demo()
print(r)



虽然传入了参数,但是函数还是自己手写的,这样很麻烦,有什么解决方法么?

def add(a ,b):

     return a + b
    # print(a + b)

def fn():
    print('Hello World')
# 创立一个参数来接收想要传入的函数
def demo(old):

    def new_func():
        print('函数开始执行')

        s = old(1, 2)


        print('函数执行结束')
        return s

    return new_func()
r = demo(add)

这样依旧不太完美,add()函数需要参数,而fn()函数不需要参数,有需要对old进行修改,有什么好的解决方法么

def add(a ,b):

     return a + b
    # print(a + b)

def fn():
    print('Hello World')
# 创立一个参数来接收想要传入的函数
def demo(old):

    def new_func(*args, **kwargs):
        print('函数开始执行')

        s = old(*args, **kwargs)


        print('函数执行结束')
        return s

    return new_func
r = demo(add)
f = r(555,666)
print(f)




在这里插入图片描述

在C++里,`<bits/stdc++.h>` 通常被叫做万能头文件,它几乎包含了所有标准库的头文件,下面介绍一些该万能头文件中常用函数: ### 数学运算函数 - `sqrt()`:用于计算一个数的平方根。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { double num = 16.0; double result = sqrt(num); cout << "The square root of " << num << " is " << result << endl; return 0; } ``` - `pow()`:用于计算一个数的指定次幂。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { double base = 2.0; double exponent = 3.0; double result = pow(base, exponent); cout << base << " raised to the power of " << exponent << " is " << result << endl; return 0; } ``` - `abs()`:用于计算一个数的绝对值。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int num = -5; int result = abs(num); cout << "The absolute value of " << num << " is " << result << endl; return 0; } ``` ### 字符串处理函数 - `strlen()`:用于计算字符串的长度。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { char str[] = "Hello"; int length = strlen(str); cout << "The length of the string is " << length << endl; return 0; } ``` - `strcmp()`:用于比较两个字符串。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { char str1[] = "Hello"; char str2[] = "World"; int result = strcmp(str1, str2); if (result == 0) { cout << "The two strings are equal." << endl; } else if (result < 0) { cout << "str1 is less than str2." << endl; } else { cout << "str1 is greater than str2." << endl; } return 0; } ``` ### 容器相关函数 - `push_back()`:在向量(`vector`)末尾添加元素。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { vector<int> vec; vec.push_back(10); vec.push_back(20); for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } cout << endl; return 0; } ``` - `size()`:返回容器的元素数量。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { vector<int> vec = {1, 2, 3, 4, 5}; int size = vec.size(); cout << "The size of the vector is " << size << endl; return 0; } ``` ### 算法相关函数 - `sort()`:对容器内的元素进行排序。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { vector<int> vec = {5, 3, 1, 4, 2}; sort(vec.begin(), vec.end()); for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } cout << endl; return 0; } ``` - `find()`:在容器中查找元素。例如: ```cpp #include <bits/stdc++.h> using namespace std; int main() { vector<int> vec = {1, 2, 3, 4, 5}; auto it = find(vec.begin(), vec.end(), 3); if (it != vec.end()) { cout << "Element found at position " << (it - vec.begin()) << endl; } else { cout << "Element not found." << endl; } return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值