【懒懒的Python学习笔记七】
在本章节中将学习编写函数,所谓函数是带有名字的完成特定功能的代码块。要执行函数定义的特定任务,可以调用该函数,所以在程序中将完成特定功能的部分写成函数,这样在多次执行同一任务的时候就无需反复编写代码了。
定义简单的函数
下面是一个打印‘Hello world!’的简单函数:
这里演示了最简单的函数结构,首先使用def关键字来告诉Python定义一个函数,在上例中定义了一个greet()的函数,括号()的作用是给出函数完成指定工作的时候需要传递的参数,在这里greet()函数不需要任何信息就能完成工作,因此括号内为空(即使如此,括号也不能省略),定义以冒号(:)结尾。
紧跟定义行之后的所有缩进构成函数体,在这里print ‘Hello world!’是唯一的函数体,完成的工作也就是打印这段话。要使用这个函数,可调用它,函数调用让Python执行这段代码,要调用函数,可依次指定函数名以及括号和括号里面传递的参数。
向函数内传递参数
如果在上例函数中添加一个姓名的参数,可以根据不同姓名输出不同语句,现在我们做如下修改:
运行的结果如下:
实参和形参
在定义greet()函数的时候,要求给变量name一个值,调用函数的时候提供一个人名并打印相应的问候语!在函数的定义中,变量name是一个形参,它是函数完成工作所需要的必要信息。而在调用函数语句中的‘Lucy’,‘Naz’是实参,所谓实参是调用函数的时候传递的信息。在我们调用函数的时候,将要让函数使用的信息放在括号内。例如:greet(‘Lucy’)中,实参‘Lucy’传递给了函数greet(),并且这个值存储在了变量name中。
实参的传递
某些函数可能有多个形参,这时候要求我们在调用函数的时候传递多个实参。向函数传递实参的方式很多种,下面我们一一介绍:
位置实参
从这个函数的定义我们知道这个函数需要三个形参,分别是姓名、年龄和电话,那么按照位置实参的调用方式,我们调用的时候传递的实参要与形参一一对应,如果调用位置不正确可能会发生令人意想不到的情况。比如:
为了避免发生上述可笑的错误,请确认函数调用的实参顺序和函数定义中形参顺序一致!
关键字实参
关键字实参是才调用函数的时候直接指定名称和值,这样就可以不用担心实参调用出错了。
关键字实参的顺序无关紧要,因为Python知道哪个值存储在哪个形参里。
默认值
编写函数的时候,可以给每个形参赋予一个默认值,这样如果当函数调用的时候给形参提供了实参就使用实参的值,否则就使用默认值。需要注意的是,使用默认值的时候必须在形参列表中先列出没有默认值的形参,再列出有默认值的形参,这样才能让Python准确读取实参。
其实调用函数的方式有很多种,有时候可以混合使用位置实参、关键字和默认值等,对于一个函数,可能存在多种的调用方式。
函数返回值
有时候函数并非只是完成诸如打印这样的简单的功能,更多的时候是对一些数据进行处理,最后返回一个或者多个值。函数返回的值就是返回值,在Python函数中用return语句将值返回到函数调用的代码行。
简单的返回值
调用有返回值的函数时候需要一个变量来存数返回值。
让实参变得可选
有的时候需要将实参变得可选,比如有的人名他不仅仅有first_name和last_name,他还可能有中间名,而有用的人则没有中间名,这种时候就可以将中间名设置成可选项。
传递任意数量的实参
有时候可能预先不知道需要接收多少个实参,不过Python允许函数的调用语句中收集任意数量的实参。
形参*fruits中的(*)号让Python创建一个名为fruits的空元组,并将收到的所有实参都存储到元组中,所以不管实参多少个,这种方法都管用。
结合使用位置实参和任意数量实参
如果要让函数接受不同类型的实参,就必须在函数的定义中将接纳到的任意数量的形参放在最后, Python先匹配位置实参和关键字实参,再将余下的实参都收集到一个最后一个实参中。
使用任意数量的关键字实参
有时候需要接受任意数量的实参,但是又不知道传递给函数的是什么养的信息,这种情况下,可以将函数编写成能够接受任意数量的键-值对,调用预计提供多少就接受多少,在下面的例子中,user_info函数不仅仅接受姓名,还接受其他用户信息。
形参**info中的两个星号(**)让Python创建了一个名为info的空字典,并将收到的所有名称-值对都存储在其中。