本篇内容是记录廖雪峰老师的python教程笔记。
原教程网址为:https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888#0
使用def定义函数,格式如下:
def f_name(f_para1,f_para2,…):
#此处缩进4格书写函数体
def empty():
pass
def test(x,y=2)
此时默认y的值为2,在调用函数时,可以同时传入两个数分别赋给x,y,例如:test(3,3)
也可只传一个参数,赋给x,y此时取默认值2 ,例如:test(3)
默认参数必须指向不变对象(不变对象一旦创建,对象内部的数据就不能修改,减少了由于修改数据导致的错误)
在参数前面加入==*==号,表示传入参数个数不确定,可以传入任意个参数,包括0个参数。
这些可变参数,在函数调用时自动组装为一个tuple。
允许传入0/人一个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
在参数前面加入==**==号,表明这是一个关键字参数。
闲置关键字参数的名字,例如只接受city和job作为关键字参数,定义的函数如下:
def person(name, age, , city, job):
*后面的参数被视为命名关键字参数。
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符了。
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:
命名关键字参数可以有缺省值,从而简化调用;
5种参数可以组合使用,但是,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
为了防止栈溢出,将递归优化为尾递归,在return时不返回表达式,仅返回递归函数本身。
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。
优点:逻辑简单清晰
缺点:过深调用会导致栈溢出