# python3小白课:函数入门 ### 函数的定义和调用 定义一个函数很简单,用到def关键字来定义。我们来看一下语法: ```python def 函数名([形参们]): [执行体] [return [返回值]] ``` 上述语法中的`[]`表示里面的内容是可选的,可以填可以不填,不是列表的意思。 使用def来声明这是一个函数,接下来写函数的名字,跟变量的命名规则类似,这里就不赘述了,需要注意的是,函数名不要跟一些系统保留关键字、类型名等相同,否则会报错或者覆盖内置的函数,使内置函数在脚本中无法使用。所以函数名尽量有意义一些,根据你的业务场景来命名有意义的,你能理解的命名。 接下来是一个小括号,里面可以设定要传入的参数在执行体中的名字(这样在执行体中可以获取到传入的参数),也可以是一个不需要参数的函数。 函数的内里部分需要缩进(否则不算函数的一部分),这一点需要大家注意一下。 当需要这个函数在调用完成后对外返回内容的时候,可以使用`return`关键字来进行返回,但它不是必须的。如果没有返回值就不写,如果有返回值就写。可以是什么都不返回,也可以在一个空格之后填写返回值,返回值可以是各种我们之前学习的数据类型。 执行体和return语句不能同时不存在。如果你还没想好这个函数要做什么,可以使用学过的`pass`占位符占位。 > [!danger] > > 在函数中,一旦碰到return语句函数就会立即结束调用并返回,即时在return语句的后面还有执行的语句也是不会执行的。所以它也可以用于`结束循环结构的循环体`。 我们来尝试定义一个十分简单的函数,并且调用它来理解: ```python # coding:utf-8 def add_1(num): return num + 1 a = add_1(1) print(a) ``` 这个例子是定义一个函数,这个函数可以让传入的值加上1之后返回。从这个简单的例子我们还能看到一些小知识点。 比如这是一个没有执行体部分的函数,但计算的逻辑代码写在了return语句的部分,所以return语句是支持表达式的。 形参传入了一个叫做num的变量,它是不允许为空的变量,必须传入值,否则调用函数时会报错。 函数返回之后,可以用变量接收结果进行进一步处理。函数的定义代码在调用之前,调用函数跟我们之前调用系统内置函数似乎区别不大。 同理,定义函数时不设定形参,就是一个不需要传入参数即可直接调用的函数,我们看个例子: ```python # coding:utf-8 def print_3(): text = "重要的事情说三遍!" for i in range(3): print(text) print_3() ``` 这个函数是`重要的事情说三遍`的函数实现,今后,你只需要带上这个函数,就可以一条命令调用这个功能了,十分方便。当然,如果你需要实现传入任意的话语都能自动说三遍,你也可以设定一个形参,传入你要说的话。 这个函数没有return语句,也是可以的。具体怎么写,你可以根据你的业务需要,灵活思考变动,举一反三。 --- ### 函数多个返回值 刚才我们举的小例子都是返回一个返回值或者不返回的。 > [!question] > > 那么同一个函数支持多个返回值吗? 在python中,是支持的。我们直接来看个例子: ```python # coding:utf-8 def get_fruits(): return "apple", "banana", "orange" print(get_fruits()) ``` 这个例子返回了三种水果的名字字符串,我们注意到在return语句中使用了`,`分隔,这样就可以返回多个返回值了,返回的返回值会自动组装成一个列表。 > [!tip] > > 你可以使用一个变量接收后使用索引访问,也可以定义多个变量,用序列解包的方式赋值给每个变量。 --- ### 为函数提供帮助文档 之前的课程中,我们学习过使用`help`命令来查看函数命令的帮助文档,这些文档是哪儿来的呢?其实这都是这些函数在创建之初,就定义好的供人查询用的。如果开发者懒一点没有定义,那么有可能你是看不到这个文档的。 > [!question] > > 那么你自己编写的函数呢?可以自己定义文档吗? 答案是可以的,而且非常简单。 我们来看个例子。 ```python # coding:utf-8 def get_fruits(): """ 我就是函数的文档,使用多行文本的写作方式就可以,写在函数执行体的前面 这个函数是支持中文的。 因为是多行文本,某一行你也可以选择不缩进,总之怎么方便怎么来。 你可以写任意的内容到文档里面 通常的写法是: 函数作用:获取几种水果的名字 参数:没有参数。如果有多个参数可以分多行写 返回值:没有返回值可以不写 你还可以写一些使用范例等等 写好之后,可以使用help命令来查看你写的效果,如果不喜欢,还可以修改 """ return "apple", "banana", "orange" print(get_fruits()) print("*" * 40) print(help(get_fruits)) print("*" * 40) # 你还可以使用函数的__doc__属性查看帮助文档,注意前后各有两个_ print(get_fruits.__doc__) ``` 可见,有的时候定义一个函数的文档,内容甚至可能比代码的量还大,当然,如果你不想写那么多,也没有强制要求,你可以不写文档或者只写一两行,一切看你自己。 如果你写的函数文档是怕自己忘了或者给别人看的,还记得我们讲过的注释的好处吗?一个好的帮助文档是可以帮助团队省事的,要写多少,看你咯。 ### 单词释义 | 单词 | 释义 | | ------ | --------------------------------- | | def | define定义这个单词的简写 | | return | 返回 | | add | 加,加法 | | num | number数字的简写 | | text | 文本 | | get | 获取 | | fruits | fruit是水果的意思,这里是复数形式 | | apple | 苹果 | | banana | 香蕉 | | orange | 橙子,柑橘 | | help | 帮助 | | doc | document文档这个单词的简写 |