开发者学堂课程【Python入门 2020年版:高阶函数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10345
高阶函数
内容介绍:
二、 加深理解一
三、 把一个函数当作另一个函数的参数
一、把一个函数当作另一个函数的返回值
1、
def test():
print
('我是test函数’)
return'hello'
def demo()
:
print
('我是demo函数’)
return test
def bar()
:
print
('我是bar函数’)
return test()
如果这样写:x=test()
,加了括号后会调用这个函数,也就是‘我是test函数’会被打印,而且如果此时打印x的话,x的值是拿到 test 函数的执行结果,也就是 hello,x hello,所以这个地方肯定会打印 hello 的。
2、除了这个之外,再写一个y= demo()
,这个地方如果这样写的话,这个代码只会打印‘我是 demo 函数’, y是 test 的函数,所以这个时候y既然是这个函数的,写 y() 就相当于调的是 test 这个函数,再来写一个z=y(),y=demo()
,
然后就是调用 demo 函数拿到 demo 的执行结果,它的执行结果又是一个 test 函数,也就是 y 是 tes t函数,加一个括号是调test函数,调test函数肯定打印‘我是 test 函数’,同时拿到 test 函数的返回值结果,返回值结果是个 hello,所以打印的结果肯定就是 hello。
y=demo
print(y)
z=(y)
print(z)
3、再写个a=bar()
,如果打印的话,’我是 bar 函数’肯定要执行,bar 里面写的是test(),直接就调过来了,还会接着打印’我是 test 函数’。
a的值就是 hello, a 拿到 bar 的执行结果, bar 的结果是 test 执行的结果,test 的执行结果是 hello,也就是bar的结果是调 test, test 的结果是 hello,那 a 就是hello。
不可以直接写a(),因为a是字符串,不是函数,不能直接这么写。
a=bar()
print(a)
二、加深理解一
def test():
print
('我是test函数’)
return'hello'
def demo()
:
print
('我是demo函数’)
return test
def bar()
:
print
('我是bar函数’)
return test()
1、现在有三个函数,一个叫test,一个叫 demo,还有一个叫 bar,这里 tests 的话。
test 会打印‘我是 test 函数’,然后 demo 会打印‘我是 demo 函数’,这个 bar 它会打印’我是 bar 函数‘。
它们各自都有返回值,test 执行结果是 hello,是一个字符串,demo它的执行结果是 test,它指向的是 test 函数,bar 的结果是 test(),括号就是拿到这个函数的执行结果,也就是拿到test的函数的执行结果,test 的执行结果是 hello。
2、a=bar()
print(a)
a=bar()
是调用一下 bar,调完之后,把bar的执行结果给到 a。调 bar 函数首先会打印‘我是 bar 函数‘,然后再往下它会调test, test()的意思就是会调 test 函数,只要一调 test 函数,test 的里的函数内容就会执行,会打印’我是 test 函数‘。
所以写完 a=bar 的时候它会打印’我是bar函数‘,同时还会打印’我是 test的函数‘,因为这里写的是 test(),它会调这个 test,这个代码就出来了,最后 bar 函数执行的结果是 test 的结果,test 的结果是 hello,所以 a 的结果就是 hello。
3、x=test
print(x)
x等于test,也就是把 test 执行了一下,执行 test 会打印’我是 test 函数’,然后这个地方return hello
,这个结果就是 x 等于 hello
4、y=demo()
print(y)
z=y()
print()
调 demo 会执行 demo 里的代码,它首先肯定会打印‘我是这个 demo 函数’,现在这个时候函数已经执行完了,执行完之后,这个 demo 返回的结果是个函数,返回 test 的时候 test 后面没有加括号也就是这个地方函数没有被调用,这时候y就是 test 函数,如果打印 y,结果就是 test 函数。
如果再写个 z= y(),就是调这个 test 函数,会告诉’我是 test 函数’。
z等于y执行的结果,也就是 test的执行结果,test 的执行结果是 hello。所以这个z就是 hello.
5、答疑
(1)a=bar()
,a不是bar的别名,而是a执行bar,并把bar的结果赋值给a,如果想给这个bar起别名应该是a=bar,不能加括号,只要加括号就是调用这个函数。(2)return test
是没有执行的,y=demo
的时候是调这个 demo 拿到这个demo 函数执行结果,它的执行结果是一个 test 函数,也就是 y 是一个函数。
调不调y都指向了 test 函数,现在想要执行这个东西得写个 y(),才可以执行这个test。
打印y的结果会打印函数的类型和内存地址,它会告诉它是一个函数,然后它的内存地址是什么,以后讲面向对象的时候会讲这个东西。
三、把一个函数当做另一个函数的参数
比如说 sort、filter、map、reduce,主要是 lambda 表达式的使用,这只是一种使用场景。