第五章 函数
1. 函数定义与使用
1. 基本语法
def 函数名([参数列表])
'''注释'''
函数体
def需要注意的问题:
- 不需要说明形参类型,Python会根据实参的值自动推断参数类型
- 不需要指定函数返回值类型,由其中的return语句的值来确定
- 即使函数不需要接受任何参数,也必须保留一对空的圆括号
- 函数头部括号后面的冒号必不可少
- 函数体相对于def关键字必须保持一定的空格缩进
2. 递归函数
一个函数中直接或者间接地又调用了该函数自身,叫做递归调用。
函数递归通常用来把一个大型的复杂问题层层转化为一个与原来问题本质相同但规模很小、很容易解决或描述的问题,只需要很少的代码就可以描述解决问题过程中需要的大量重复计算。要注意:
- 每次递归应保持问题性质不变
- 每次递归应使用更小或更简单的输入
- 必须有一个能够直接处理而不需要再次进行递归的特殊情况来保证递归过程可以结束
- 函数递归深度不能太大,否则引起内存崩溃
2. 函数参数
函数定义时圆括号中的是逗号分隔开的形参列表,函数可有可无参数但是定义和调用时的圆括号不可少。
1. 位置参数
调用函数时实参和形参的顺序必须一致,并且数量相同。
2. 默认值参数
在定义函数时,可以为形参设置默认值。在调用带有默认值参数的函数时,可以不用为设置了默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,当然也可以通过显式赋值来替换其默认值。
注意,在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置函数,否则会提示语法错误。
def 函数名(..., 形参名 = 默认值):
函数体
>>> def demo(string, times = 1):
print((string+' ')*times)
>>> demo('Hello') #当不显式赋值时,则使用默认值
Hello
>>> demo('Hello', 3)
Hello Hello Hello
3. 关键参数
通过关键参数可以按参数名字传递值,明确指定哪个值传递给哪个参数,实参顺序可以和形参顺序不一致,但不影响参数值的传递结果,避免了用户需要牢记参数位置和顺序的麻烦,使得函数的调用和参数传递更加灵活。
>>> def demo(string, times = 1):
print((string+' ')*times)
>>> demo(times = 5, string = 'World')
World World World World World
4. 可变长度参数
定义时有两种形式:*parameter
、**parameter
,前者用来接受任意多个位置实参并将其放在一个元组中,后者接收多个关键参数并将其放在字典中。
>>> def demo(*p):
print(p)
>>> demo(1, 2, 3)
(