本节书摘来自华章计算机《树莓派Python编程指南》一书中的第3章,第3.4节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.4 使用函数复用代码
我们已经使用过一些函数,如print()和input()。这些都是Python内置函数。你还可以自己定义函数。第2章中你已经定义过自己的函数,这里我们来复习一下。看下这个:
![e0af539cf7c69b92dc4abbf5fec9727856564c05](https://i-blog.csdnimg.cn/blog_migrate/caec6849dae78cdd1f1c1cb4ef197685.png)
这段代码定义了一个名叫square(平方)的函数,然后使用这个函数计算了4的平方。使用它的时候需要在名字后面跟一个包含在小括号里的数字——我们称为参数。函数运行时,参数名(本例中是num)将会被赋值为你给定的数字。return语句可以出现在程序中的某个地方,用来给主程序返回数据。如果有多个return语句,Python将在第一次遇到return时返回。
你也可以创建包含多个参数的函数。例如,下面的程序就有一个函数需要两个参数并返回其中较大的一个。
" >
至此为止,它们都工作地很好。然而如果需要在函数中改变了变量的值呢?看看下面的程序:
![6ffb1ab42f52c5a5fd7decbe78acc2b9aee3b856](https://i-blog.csdnimg.cn/blog_migrate/0bf39aa37811243f1529aa52fb22c23e.png)
运行这段程序之前,先想一下运行结果。可以肯定的是,number_2将会是2,但number_1呢?它应该是1么?因为我们在主程序中给它赋值为1。还是2呢?因为我们把它传递给函数add_one()并在里面改变了它的值。
运行后,你会发现number_1是1。这是因为这一行:
" >
你告诉Python不想让num继续保持原来的值(和number_1一样),而是给它一个加1后的新值。
然而,可变数据类型如列表、集合和对象就不一样了。如果它们中的一种数据类型传入函数并改变它,那么作为参数传入的原始值也会跟着变化。比如:
![c1d834d208d4c16e7332b5777f35b42f713684cd](https://i-blog.csdnimg.cn/blog_migrate/265f697ae88dcdfc21fe242a3ee2797a.png)
运行之后将得到:
" >
通常情况下,这样做没有什么问题,但有时你并不想让作为参数传入的原始值发生变化。这种情况下,你需要使用copy.deepcopy(),不过首先你得导入copy模块。如果你把上个例子改为:
![3acd480e2bd7176486f26e4defd8cf36e1c9098f](https://i-blog.csdnimg.cn/blog_migrate/38d5870de3ec5e91bd5b53df0dc7a79b.png)
你将得到:
![c7985d00810be63d4832bc2efb7830577692cbbe](https://i-blog.csdnimg.cn/blog_migrate/7d225f9288e20564683bbd2a82b893c8.png)
可选参数
有时你需要创建这样一个函数,它有时候需要参数,有时候不需要。比如,你可能需要创建函数increment(),该函数接受两个参数并将它们相加。当只给一个参数时,该函数就把这个参数加上1。这时候你就可以使用默认值(本例中为1)作为参数:
![fdbafff2cc6ac88e4ea402d2d6661d48dbeec545](https://i-blog.csdnimg.cn/blog_migrate/8eccb9a173c1421face78df203cb7532.png)
这里唯一需要注意的就是可以省略的参数必须放在其他参数之后。