• 不同语言在函数内部定义函数


    在 LeetCode 刷题的时候,题解有的大佬给出的答案很优秀,是 python 的,想抄作业发现有的功能函数都定义在答案函数的内部,主要是闭包操作外部变量方便。不同语言在函数内部定义函数稍有不同,于是记录下自己可能用到的语言在函数中定义函数的方式。

    python

    python 定义内部函数加个 def 就行,和使用变量差别不大,可以在参数列表后跟->指定返回值。

    def outerFunc() -> None:
        a: int = 1
        def innerFunc(b: int) -> int:
            nonlocal a  #不加的话不会修改外部变量的值
            a = 2
            return a + b
        print("ans:{ans}, a:{a}".format(ans=innerFunc(3), a=a)) #不加nonlocal ans:5, a:1; 加上nonlocal ans:5, a:2
    
    if __name__ == '__main__':
        outerFunc()

    C++

    C++主要是使用 Lambda 函数来实现,可以在参数列表后跟->指定返回值。在函数前有个 [] 的引出符,不同符号对于外部变量的处理方式不同:

    [a],表示以值传递方式捕捉变量 a

    [=],表示值传递捕捉所有父作用域变量,以值传递的形式捕获的变量如果要修改,需要在函数参数列表后面加上 mutable

    [&a],表示以引用传递方式捕捉变量 a

    [&],表示引用传递捕捉所有父作用域变量

    [this],表示值传递方式捕捉当前的 this 指针

    [=,&a],表示以引用传递方式捕捉 a,值传递方式捕捉其他变量

    #include <iostream>
    using namespace std;
    
    void outerFunc() {
        int a = 1;
        auto innerFunc = [&a](int b)->int {
            a = 2;
            return a + b;
        };
        cout << "ans:" << innerFunc(3) << ", a:" << a;  //ans:5, a:2
    }
    
    int main(int argc, char* argv[]) {
        outerFunc();
        return 0;
    }

    golang

    golang 和 python 差不多,函数返回值直接写在参数后边。不过内部定义不能写函数名,调用可以通过变量来使用。

    package main
    import "fmt"
    
    func outerFunc() {
        a := 1
        // innerFunc := func innerFuncTest(b int) int { //error
        innerFunc := func (b int) int {
            a = 2
            return a + b
        }
        fmt.Printf("ans:%d, a:%d", innerFunc(3), a) //ans:5, a:2
    }
    
    func main(){
        outerFunc()
    }

    js

    js 参数和返回值不用指定,箭头函数连接参数和返回的对象。

    function outerFunc() {
        a = 1;
        innerFunc = (b) => {
            a = 2;
            return a + b;
        };
        console.log('ans:', innerFunc(3), ', a:', a); //ans: 5 , a: 2
    }
    
    outerFunc();

    豌豆资源搜索网站https://55wd.com 广州vi设计公司http://www.maiqicn.com

    不同之处

    只有 python 需要加个 nonlocal 才能修改外部函数的变量,其他语言默认就是可以修改外部函数的变量的

  • 相关阅读:
    Ozone数据探查服务的增量数据更新机制
    HDFS的块Topology位置重分布
    聊聊更为高效的ACL认证方式
    YARN Federation的架构设计
    Confluence 6 用户宏示例
    Confluence 6 用户宏示例
    Confluence 6 用户宏示例
    Confluence 6 用户宏最佳实践
    Confluence 6 编辑和删除用户宏
    Confluence 6 创建一个用户宏
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/13724173.html
Copyright © 2020-2023  润新知