zoukankan      html  css  js  c++  java
  • 不同语言在函数内部定义函数

    在 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 才能修改外部函数的变量,其他语言默认就是可以修改外部函数的变量的

  • 相关阅读:
    《ML in Action》笔记(2) —— ID3决策树
    《ML in Action》笔记(1) —— kNN分类器
    MYSQL笔记
    Javascript代码摘录
    初试mysql存储过程&触发器
    百度地图API应用实践(一) —— 栅格图(草稿)
    2020年8月9日, 网吧, 歌单, 极客时间, 龙岩网络图书馆, 正则, WPS, Python
    2020年8月3日, 网吧 ,
    2020年7月13日,想在网吧搞学习,实属想多了
    账号被盗,什么原因呢?是我的操作系统太脆弱,还是博客园存在安全隐患?
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/13724173.html
Copyright © 2011-2022 走看看