Python函数定义及参数详解
函数定义
首先我们来创建一个函数,输出指定范围内的斐波拉契数列(Fibonacci series)。
输出结果如下:
由第一行可知 Fibonacci函数输出了2000以内的斐波拉契数列。
由第二行可知 Fibonacci函数在内存中的地址
由第三行可知 将Fibonacci函数的地址值赋给另外一个变量f之后,f也就是一个函数了,这类似于重名机制
由第四行可知 虽然Fibonacci函数没有return
语句,但是如果我们使用print
输出的时候可以发现还是有返回值的,只是这个返回值是None
,这是Python的內建名称。
我们也可以写一个函数,不输出斐波拉契数列的值,而是把值作为返回值返回。
输出结果:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
参数详解
Python 的内建标准类型有一种分类标准是分为可变类型与不可变类型
- 可变类型:列表、字典
- 不可变类型:数字、字符串、元组
上面函数定义中的参数都是属于不可变类型的。
可变参数三种情况:默认参数,位置参数*args
关键字参数**kwargs
。
默认参数
默认参数的好处就是在调用函数的时候写上去的参数比在函数定义时的参数少。例如:
这个函数的调用方法有很多,比如:
- 只给必选参数:
ask_ok('OK to overwrite the file?')
- 给一个可选参数:
ask_ok('OK to overwrite the file?', 2)
- 给所有的可选参数:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
关于默认值,应该注意的是默认值只会在函数定义的时候被python解析一次。因此
这段代码输出的应该是5,而不是6,就是因为i是在函数定义的时候解析的,这个时候i=5。
重要警告:默认值只会解析一次。当默认参数是可变对象时,影响比较大,比如列表,字典或者类的对象。下面演示的这个函数会把参数积累并传到随后的函数调用里面:
这段代码会输出
如果不想默认参数在后面的函数调用中共享,可以把函数写成这种形式
这段代码会输出
位置参数*args
位置参数需要在参数前面加一个星号。把参数收集到一个元tuple中,作为变量args。至于为什么叫位置参数,这个是因为各个参数是按照顺序接收的。
这段代码会输出
args被解释为包含多个变量的元组tuple。因此也可用如下写法:
关键字参数**kwargs
函数也能够按照kwarg=value
这种形式的关键字参数来调用。关键字参数需要在参数前面加两个星号。其作用是把参数收集成一个字典类型,包含参数名和值。
这段代码会输出
参考资料
Python官网-defining-functions
Passing arguments to Python functions1.pdf
Python中*args与**args的区别