![Python 3.7从入门到精通(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/212/31476212/b_31476212.jpg)
6.4 函数的参数
Python函数的参数传递都是使用传址调用的方式。所谓传址调用,就是将该参数的内存地址传过去,若参数在函数内被更改,则会影响到原有的参数。参数的数据类型可以是模块、类、实例(instance),或者其他的函数,用户不必在参数内设置参数的数据类型。
调用函数时可使用的参数类型包括必需参数、关键字参数、默认参数、可变参数和组合参数。下面分别介绍它们的使用方法和技巧。
6.4.1 必需参数
必需参数要求用户必须以正确的顺序传入函数。调用时的数量必须和声明时的一样,设置函数的参数时,须依照它们的位置排列顺序。例如:
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P126_57392.jpg?sign=1738860876-feQC0xbNhtwKAlUXxTZNwhLyrYOT8XLJ-0-2b6c7bf169d6fad6b6d2bd388fd95f80)
运行结果如图6-17所示。从结果可以看出,调用gg(200, 50)时,x参数等于200,y参数等于50,因为Python会根据参数排列的顺序来取值。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P126_12203.jpg?sign=1738860876-enJ6eRmhSqgNCFMs2Dod52OkXw35pceo-0-61a070e59918239985611e561ae58cc8)
图6-17 运行结果
如果调用gg ()函数时没有传入参数或传入参数与声明不同,就会出现语法错误。例如:
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P127_57394.jpg?sign=1738860876-Bj09quwSzq9F6BMBh40butIaSbkgDUe1-0-c9f28a950d351531e1034aad2b854a69)
运行结果如图6-18所示。从结果可以看出,无论是不传入参数还是传入的参数多于两个,都会提示报错信息。第一个错误信息表示需要传入x和y的值;第二个错误信息表示传入的参数为三个,多于规定的两个参数。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P127_12237.jpg?sign=1738860876-3u8dFcY5vvAX0KyU6YHp0yI8Zu6aQQjM-0-d4e86d79c09502381650e1e8202430cb)
图6-18 运行结果
由此可见,对于包含必需参数的函数,在传递参数时需要保证参数的个数正确无误。
6.4.2 关键字参数
用户可以直接设置参数的名称及其默认值,这种类型的参数属于关键字参数。
在设置函数的参数时,可以不依照它们的位置排列顺序,因为Python解释器能够用参数名匹配参数值。例如:
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P127_57395.jpg?sign=1738860876-iI0I2XNoJag1zPNVlNeh2yobAb1tZ89M-0-302187b79871198616c7364e6b37340a)
运行结果如图6-19所示。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P127_12285.jpg?sign=1738860876-LO51eAyHfnzM2sUATV5f2YHo8yV7AMo0-0-d842ac449bfe64b4cc65d2bdd9da07df)
图6-19 运行结果
用户可以将必需参数与关键字参数混合使用,但必须将必需参数放在关键字参数之前。例如:
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P127_57396.jpg?sign=1738860876-Hh2jsSm2TuEEt4dltR00g9sPVczCJyn0-0-e1ba63f9b52bdf3dc75495608b916d95)
运行结果如图6-20所示。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P128_12346.jpg?sign=1738860876-kqADKbLizd8o4SLItisLBd9SEXNYKicM-0-47cefe662a50b3f61caff93086a6775d)
图6-20 运行结果
6.4.3 默认参数
调用函数时,若没有传递参数,则会使用默认参数值。例如:
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P128_57398.jpg?sign=1738860876-FUZWCHbRTRrvDoZGtj8DRgQDJAqMRxti-0-6bf0d42f951e2108255284c5c06abf25)
运行结果如图6-21所示。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P128_12406.jpg?sign=1738860876-jP0qIy7TLJ3S5tLu3RqXU99X8jMLvTqT-0-e47514f03b42a914557dd2ccd3828586)
图6-21 运行结果
在本示例中,首先定义一个函数gg( name, price=6000),这里变量price的默认值为6000。当第一次调用该函数时,因为指定了变量price的值为3880,所以输出值也为3880;第二次调用该函数时,因为没有指定变量price的值,所以结果将会输出变量price的默认值(6000)。
当使用默认参数时,参数的位置排列顺序可以任意改变。若每个参数值都定义了默认参数,则调用函数时可以不设置参数,使用函数定义时的参数默认值。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P128_57400.jpg?sign=1738860876-W2vgZ7I9hFX1C9S0pke7N2j8X2RWP8z2-0-7530f74f3be2c6ddbfb0282a0c45b717)
运行结果如图6-22所示。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P129_12449.jpg?sign=1738860876-GWzrF1uDu77vkLo3VCbvkNsOyQ34oUKB-0-f01c33a3855ff72f66c3831606708a92)
图6-22 运行结果
6.4.4 可变参数
如果用户在声明参数时不能确定需要使用多少个参数,就使用可变参数。可变参数不用命名,其基本语法如下:
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P129_57401.jpg?sign=1738860876-aLQXqiwaS9VE9l7J3Og0zWuun7nLzjLa-0-a996f5cc4dcc4a0366d44cd749ebed61)
加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。用户也可以不向函数传递未命名的变量。
【例6.1】可变参数的综合应用(源代码\ch06\6.1.py)。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P129_57402.jpg?sign=1738860876-ZY0ZJ8DBm8zxUwCI0HhIQl3cEIGP1jNM-0-93454b5d2a4898e74d86ceb8849aa0d8)
保存并运行程序,结果如图6-23所示。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P129_12557.jpg?sign=1738860876-nnVg175XVdFbKIpo34tlY1zzj1woYAtu-0-92adbd3600b68b54d6acf7abf0c9d4c9)
图6-23 运行结果
从结果可以看出,用户无法预定参数的数目时,可以使用*arg类型的参数,*arg代表一个元组对象。在定义函数时,只定义两个参数,调用时可以传入两个以上的参数,这就是可变参数的优势。
用户也可以使用**arg类型的参数,**arg代表一个字典对象。
【例6.2】**arg类型的应用(源代码\ch06\6.2.py)。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P130_57403.jpg?sign=1738860876-hxI4sINQiuV9RT02mZWiEF7r1oW96kZp-0-d309264b72edfd97083640273c7f626c)
保存并运行程序,结果如图6-24所示。
![](https://epubservercos.yuewen.com/5D8A8A/17035792904285406/epubprivate/OEBPS/Images/Figure-P130_12629.jpg?sign=1738860876-8XoQUHDbHgJanOL3RQ7rEHi50cSIyAh7-0-30e408b4ad7ecafe570fb5c4a3f89b4c)
图6-24 运行结果