位置参数:
计算x的平方的函数
>>> def power(x): ... return x * x ... >>> power(3) 9 >>> power(88) 7744 >>>
对于power(x)函数,参数x就是一个位置参数。
当我们调用power函数时,必须传入一个有且仅有的一个参数x:
把power(x)修改为power(x,n),用来计算x的n次方
def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s
>>> from q3 import power >>> power(2,3) 8 >>> power(3,3) 27 >>> power(2,4) 16 >>>
修改后的power(x,n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参x和n。
默认参数
缺少参数n,报错
>>> power(9) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: power() missing 1 required positional argument: 'n' >>>
这个时候,默认参数就派上用场了。由于我们经常计算x2,所以,完全可以把第二个参数n的默认值设定为2:
def power(x,n=2): s = 1 while n > 0: n = n - 1 s = s * x return s
只输入一个参数时,第二个参数默认为2,可计算出结果。
>>> from q3 import power >>> power(9) 81 >>> power(9,2) 81 >>> power(9,4) 6561 >>>
设置默认参数时,需要注意:
1、必选参数在前,默认参数在后,否则Python的解释器会报错
(思考一下为什么默认参数不能放在必选参数前面)
2、如何设置默认参数。
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
使用默认参数最大的好处是能降低调用函数的难度
例子1:
def enroll(name,gender): print('name:',name) print('gender:',gender)
>>> from q3 import enroll >>> enroll('wf','t') name: wf gender: t >>>
例子2:
def enroll(name,gender,age=6,city='luoyang'): print('name:',name) print('gender:',gender) print('age:',age) print('city:',city)
>>> from q3 import enroll >>> enroll('ww','f','5') name: ww gender: f age: 5 city: luoyang >>> enroll('ww','f') name: ww gender: f age: 6 city: luoyang >>> enroll('ww','f','3','shanghai') name: ww gender: f age: 3 city: shanghai >>> enroll('ww','f','city=beijing') name: ww gender: f age: city=beijing city: luoyang >>> enroll('ww','f',city='beijing') name: ww gender: f age: 6 city: beijing >>>
后两个为默认参数,前两个参数可变,后两个参数没有提供时使用默认值。可以按顺序传入默认参数,不按顺序时需把参数名加上。
例子3:
def add_end(L=[]): L.append('END') return L
>>> add_end([1,2,3,4]) [1, 2, 3, 4, 'END'] >>> add_end() ['END'] >>> add_end() ['END', 'END'] >>> add_end() ['END', 'END', 'END'] >>> add_end() ['END', 'END', 'END', 'END'] >>>
Python函数在定义的时候,默认参数L
的值就被计算出来了,即[]
,因为默认参数L
也是一个变量,它指向对象[]
,每次调用该函数,如果改变了L
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
默认参数必须指向不变对象
修改例子3:
def add_end(L=None): if L is None: L = [] L.append('END') return L
>>> from q3 import add_end >>> add_end() ['END'] >>> add_end() ['END'] >>> add_end() ['END'] >>> add_end([1,2,3,4]) [1, 2, 3, 4, 'END'] >>>
程序设计时,尽量设计为不变参数。
可变参数
可变参数就是传入的参数个数是可变的,可以是1个,也可以是多个,也可以0个
例子,计算a的平方+b的平方+c的平方+d的+。。。
调用的时候,需要先组装一个list或tuple
def cacl(numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
>>> from q3 import cacl >>> cacl([1,2,3]) 14 >>> cacl((1,2,3)) 14 >>>
利用可变参数,进行简化。把函数的参数改为可变参数。
def cacl(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
>>> from q3 import cacl >>> cacl(1,2,3,4) 30 >>> cacl(1,2,3) 14 >>> cacl(1) 1 >>> cacl() 0 >>>
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是调用该函数时,可以传入任意个参数,包括0个参数。
如果已经有一个list或者tuple,要调用一个可变参数可以这样做
>>> nums = [1,2,3] >>> cacl(nums[0],nums[1],nums[2]) 14
Python 允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1,2,3] >>> cacl(*nums) 14 >>>
*nums表示把nums这个list的所有元素作为可变参数传进去
关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。