内容简介:在 LeetCode 刷题的时候,题解有的大佬给出的答案很优秀,是 python 的,想抄作业发现有的功能函数都定义在答案函数的内部,主要是闭包操作外部变量方便。不同语言在函数内部定义函数稍有不同,于是记录下自己可能用到的语言在函数中定义函数的方式。python 定义内部函数加个 def 就行,和使用变量差别不大,可以在参数列表后跟->指定返回值。C++主要是使用 Lambda 函数来实现,可以在参数列表后跟->指定返回值。在函数前有个
在 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 才能修改外部函数的变量,其他语言默认就是可以修改外部函数的变量的
以上所述就是小编给大家介绍的《不同语言在函数内部定义函数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Python 函数调用&定义函数&函数参数
- Shell编程—【04】函数的定义、参数、变量作用域、函数库
- Laravel 增加自定义全局函数
- 在 Go 语言中定义函数
- Golang中的自定义函数
- HIVE自定义函数的扩展
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。