Python学习笔记——函数
本文最后更新于:2022年5月23日 凌晨
本文章用到的语言:Python
函数作为对象
在Python中,函数也是对象,所以我们可以把函数分配给变量、存储在数据结构中、作为参数传递给其他函数,也能作为其他函数的返回值。
初次看到这些内容的时候,我是挺惊讶而且发自内心的“すごい!”并且迫不及待地想要理解和掌握。
感觉写文章就是一个非常不错的方式,所以在这里我会尝试用自己所理解到的东西来完成这篇文章。
如果有什么问题的话可以尝试联系我~ 联系我
怎么理解函数是对象
现在有这样一个东西:
1 |
|
这就是一个加法函数,传入 a 和 b 的值然后返回二者相加的值,我们可以在控制台调用它得到这样一个结果:
1 |
|
如果我现在这么做的话(可以思考一下这段代码做了什么以及输出的结果):
1 |
|
没错,输出的结果就是5
接下来我们把原来定义的add
函数用del删除,再调用another_add
试试看:
1 |
|
现在add
用不了了,但是another_add
还能用,为什么呢?因为函数对象及其名称是相互独立的实体:指向函数的变量和函数本身实际上是彼此独立的。
这边可以了解一下下面这些东西(引用[1]):
变量是标签
变量常被描述为可用于存储值的盒子。
一种好得多的定义是,变量是可以赋给值的标签,也可以说变量指向特定的值。
以下是扩展
Python在创建函数时都会为每个函数附加一个用于调试的字符串标识符,使用__name__属性来访问它:
1
2
3
4
>>> add.__name__
'add'
>>> another.__name__
'add'PS:当然是在
add
没被删除之前调用的,删除后调用了会报错:NameError: name 'add' is not defined
由于是在创建函数的时候给出的标识符,所以即使把这个函数分配给了另一个变量,这个标识符也不会变
把函数存储在数据结构中!
由于函数是个对象,所以可以把函数也存储在数据结构当中,并且访问或使用他们。
比如把他们塞进列表里:
1 |
|
你也可以把它们塞进字典里,同样的,我们尝试访问这个字典,然后试着遍历这个字典并调用这些函数:
1 |
|
并且,在这些数据结构里的函数对象都可以直接调用,不需要特意为他们分配一个变量:
1 |
|
本小节的补充
<built-in function max>
指出max
函数是python的一个内置函数,所以给出的不是地址max
函数用于查找可迭代的最大值,关于可迭代,在之后的文章可能会介绍(也是python特性哦)pow(x, y)
函数就是平方函数了,将x的值返回为y的幂
将函数传递给其他函数
由于函数是对象,因此可以将其作为参数传递给其他函数。
让我们通过一个例子来理解下:
1 |
|
get_max_or_min
函数获取一个函数参数,并调用这个函数得到一个值,然后将它打印出来,在这里可以由函数的名称看出来,我们可以向其中传入max
或min
函数
让我们尝试一下:
1 |
|
可以看到都输出了正确的结果
“将函数对象作为参数传递给其他函数的功能非常强大,可以用来将程序中的行为抽象出来并传递出去。”[2]
扩展[2]
“能接受其他函数作为参数的函数称为高阶函数。”
“比如map
函数,map
接受一个函数对象和一个可迭代对象,然后在可迭代对象中的每个元素上调用该函数来生成结果。”
这里我们调用我们的add
函数来看看map
函数做了什么:
1
2
>>> list(map(add, [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]))
[2, 4, 6, 8, 10]可以看出,
map
函数遍历了整个列表并将add
函数应用于每个元素,而且得到了一个新列表对象,存储两数相加后的结果。
嵌套函数
在Python中,甚至可以在函数中定义函数,就是之前写多道系统作业调度模拟程序提到过的东西(戳我跳转文章)
在这里我们定义一个用来计算的函数,根据传入字符串的不同返回不同的结果:
1 |
|
但是需要注意的是嵌套函数的作用域:仅在创建它的函数的内部
如果我们想在函数外部使用这个函数的话,可以像我上边提到的那篇文章中那样,创建一个变量,并把嵌套函数返回给父函数的调用者。
在这里,我就写个根据会员等级判断打折力度的函数来作为例子吧:
1 |
|
然后再测试一下:
1 |
|
“这意味着函数不仅可以通过参数接受行为,还可以返回行为。”[2]
日后计划
以后学到的有关函数这部分的内容也会一起在这里更新。
希望本文章能够帮到您~