开发者学堂课程【Python入门 2020年版:高阶函数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10344
高阶函数
内容介绍
一、一个函数作为另一个函数的参数
二、一个函数作为另一个函数的返回值
三、函数套函数
一、一个函数作为另一个函数的参数
一个函数作为另一个函数的参数之前已经说过,lambda表达式里基本上都是把一个函数作为另一个函数的参数。
二、一个函数作为另一个函数的返回值
1、
def foo():
print
('我是foo,我被调用了’)
return 'foo'
def bar():
print
('我是bar,我被调用了')
return foo
()
如果现在运行的话,什么都不会打印,因为这个函数没有任何的调用,最后一行的foo 虽然被调用了,但是 bar 从来没有调用过,如果调bar:bar()
,打印的结果肯定是‘我是 bar 我被调用了’,然后会打印‘我是 foo,我被调用了’。
2、x=bar()
它的返回值是调 foo,foo 返回的结果是 foo,如果打印一下x
x = bar()
print
('x的值是()'.format(x))
运行 x 的值是 foo,因为这个 x 是调 bar 的结果,bar 的结果是调的 foo,foo 的结果是 foo,所以打印的结果是 foo。
3、现在把最后一行foo后面的括号去掉
def foo():
print
('我是foo,我被调用了’)
return 'foo'
def bar():
print
('我是bar,我被调用了')
return foo
x = bar()
print
('x的值是()'.format(x))
如果运行,print
('我是bar,我被调用了')会被打印,print
('我是foo,我被调用了’)是不会打印的,因为这个foo函数从来没有被调用过,x = bar()返回的结果是foo,foo 后面没有加括号,其实用的就是这个函数, x其实是指向了 foo,是 foo函数的别名,如果想要调用foo函数可以写个x()
print
(‘---------’)
x()
这个时候foo才会被调用,现在这个结果是foo这个函数变成了bar这个函数的返回值,一个函数作为另一个函数的返回值,这也是一种形式。
4、如果要调也可以这样写:bar()(),bar
拿到的结果是 foo,然后再调一下foo,这个打印出来会是‘我是 bar,我被调用了’,然后‘我是 foo,我被调用了’。
5、 y= bar()()
print
(y)
最后y的结果就是foo,就是先调用 bar,拿到 bar 的结果,它是一个函数,然后再加个括号再调用这个函数,所以先会调 bar 函数打印‘我是 bar,我被调用了’,然后再调用 foo,告诉‘我是 foo,我被调用了’,最后拿到 foo 的执行结果给到y,y的结果就是 foo。
三、函数套函数
1、这个是更高级的,有些难理解。
def outer():
m = 100
def inner():
n = 90
print
( 我是inner函数‘)
print
('我是outer函数’)
有一个外部函数,函数内部又定义了函数,这个叫函数套函数。
在外面可以调 outer 函数,调完之后,只会执行‘我是 outer 函数’,
print( 我是inner函数‘)这一段函数它是不会调用的,inner 函数是定义在 outer 函数里的,在外面是访问不到的,因为在 outer 里定义的变量是一个局部变量,没有局部函数的概念,但是它是一个内部函数,内部函数也只有在 outer 函数内部才能够使用,除了这个范围,在外面是不能够使用, 一般情况下会 return inner,把它给反馈回去,再来运行 outer
def outer():
m = 100
def inner():
n = 90
print
( 我是inner函数‘)
print
('我是outer函数’)
return inner
outer()()
调 outer 拿到 outer 的执行结果,outer 把自己内部的 inner 函数给返回去,这个时候再运行时可以的。
2、这个是函数套函数,然后再在这个函数里再返回一个这个函数,这就是它的一个结构,这是挺复杂的一个结构,先了解一下下节课会再讲,这里涉及到一个概念叫闭包,是跟装饰器有关系的,装饰器这个语法只做介绍不会详细讲。