早上刚出门,热浪席卷而来,但我好像并没有什么情感波动,只是想着吃饭、上班、下班…
![](https://i-blog.csdnimg.cn/blog_migrate/a6000b71afd584763ad7b19a5e00001e.jpeg)
序言
简单地说,函数就是一种用来把多条语句组合在一起的特殊设备,这样这些语句就可以通过函数名被多次调用,从而避免了代码的冗余,避免了我们未来的工作量。同时,函数也是python提供的用于最大化代码复用的基本程序结构并且将我们引导向更大的程序设计主题,我们将会看到,函数让我们能够将复杂的系统分解为一个个小的易于管理的模块。通过将每一个部分实现为函数,我们能够复用这些函数,同时让代码编写更容易。
下面是函数相关的一些语句和表达式
函数调用;def;return;global;nonlocal;yield;lambda;
为什么要使用函数
这个问题看起来好像有点智障,但你仔细想想,你写了那么多代码,到底有没有考虑过函数是用来干嘛的,或者即使你理解它是怎么用的,也感受过它的用处,但是你有没有通过文字语言将它的这种作用清晰地表达出来,正如我在读《思维》有感那篇博客中写的那样,也许你的大脑十分地擅于随机应变,但我相信,你很难对一件事情持续地进行水晶般的思考,所以把你的想法写下来,说出来。下面我们就来总结一下python中函数的作用。
- 最大化代码复用和最小化冗余:函数是python中打包逻辑的最简单的方法。
- 过程分解:函数为过程分解提供了一个最基本的工具,独立地实现一个个小目标然后将它们组合在一起要比一次性实现整个大目标容易得多。
编写函数前的一些概念理解
python中的函数在行为上和其它一些编译型语言(例如C语言)有着非常大的区别,下面是对python函数背后的概念的一些简单的介绍。
- def 是可执行代码:也就是说,在python到达这个函数之前,这个函数是不存在的,我们可以将函数嵌套在if、while、或者其它的def。但最好不要这样定义函数,我们一般的做法是将函数写在模块(module)文件中,然后通过import将其导入。
- def 创造一个对象并且将它与一个名字关联起来:当python到达一个def的时候,它会生成一个函数对象并将它分配给一个名字,函数对象的名字和其它对象的名字没有什么区别,我们可以通过名字来引用函数对象,也可以将函数对象分配给其它名字。
- lambda表达式创造一个匿名对象:函数对象也可以通过lambda表达式创造,这种方式让我们可以在一些def失效的场合使用内联函数。
- return返回一个结果对象给调用者:当函数被调用的时候,调用会一直持续到函数结束,并且把控制权交给调用者。return会返回一个对象给调用者,如果没有return语句,函数还是会返回以None给调用者。
- yield 发送一个对象给调用者,但是会记住离开时函数的状态:高级主题,后面再说
- global:将函数中的局部变量标识为全局变量
- nonlocal:将函数外部的变量标识为来自函数内部的变量
- 元素通过赋值传递给函数:在python中调用者与函数通过引用来共享对象
- 除非特别指定,参数传递是位置式的:这个我们后面用示例来介绍
上面的这些基本概念,有些你可能理解,有些你可能不理解,理解的可以再思考一下它为什么要这样设计,不理解的也没关系,反正我们一时半会儿也不会用到。下面我会用一个示例来介绍这些概念。
一个示例
1、定义
>>> def times(x, y): # Create and assign function
... return x * y # Body executed when called
...
当python到达并且运行def的时候,它会创造一个包含代码块的函数对象,这并把这个对象分配给times。
2、调用
直接调用
>>> times(2, 4) # Arguments in parentheses
8
我们直接调用了函数,它返回一个8,我们也可以将值保存起来
>>> x = times(3.14, 4) # Save the result object
>>> x
12.56
当我们传递不同的参数进去函数会如何处理呢
>>> times('Ni', 4) # Functions are "typeless"
'NiNiNiNi'
我们看到了很有意思的东西,‘Ni’被重复了三次,换句话说,我们的times函数的意义和行为取决于我们传递给它的参数,者再Python中是一个核心的概念,我们称之为多态。
测试你对知识的理解
1、编写函数的重点在哪里?
- 函数是代码分解避免冗余的最基本方法
- 函数是代码复用的基本单元
- 函数可以允许我们把复杂问题分解为一个个小问题,从而降低解决问题的难度
2、python在什么时候创建一个函数?
- 当python到达并且运行def的时候,函数对象被创建
3、如果函数没有return语句,函数会返回什么?
- 默认会返回一个None
4、函数定义中的代码在什么时候运行?
- 在函数被调用的时候,函数体中的代码会被运行