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

玖零儛 · · 2732 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在 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();

不同之处

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

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:玖零儛

查看原文:不同语言在函数内部定义函数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2732 次点击  
加入收藏 微博
上一篇:leetcode_384
下一篇:leetcode_394
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传