一、默认值参数和关键字参数
1.默认值参数
- 形参设定默认值 称为 默认参数。调用函数时,可以使用比定义时更少的参数。
- 调用函数时,如果没有传入默认参数对应的实参,则实参使用默认值
- 默认参数在调用的时候可以不传递,也可以传递
def say_hello(name='林青霞'):# 形参
"""
给女神打招呼
:param name:
:return:
"""
print('hello ', name)
# 调用时不传递参数,使用默认值
say_hello()
# 调用时传递参数
say_hello('高圆圆')
注意:默认参数一定要在参数的最后
def say_hello(score, name='林青霞'):# 默认参数放在参数最后面
"""
给女神打招呼
:param name:
:return:
"""
print('hello %s'%(name))
say_hello(60, '高圆圆')
2.关键字参数
- 调用函数时,实参可以指定对应的形参,称为 关键字参数
def say_hello(name, age, score):
print('姓名:%s,年纪:%d,分数:%f'%(name,age,score))
say_hello(name='林青霞',age=60,score=70.5)
- 使用关键字参数调用可以改变传递参数的顺序
# 改变参数传递的顺序
say_hello(score=70,age=30,name='高圆圆')
二、可变参数
1. 可变参数args
可变参数需要添加*
,用于接收任意数量的参数
这里的args
代指arguments
,可以写其他任意名称
def sum(*args):# 形参能够接收任意个长度的数据
pass
# 调用可变参数的函数
sum(10,20,30)
sum(10,20,30,40)
可变参数的本质是 将传递的参数包装成了元组
实现多个参数的sum
函数
def sum(name, *args):# 形参能够接收任意个长度的数据 args为元组类型
result = 0
for ele in args:
result += ele
return result
还有其他参数时,*args
要放最后
2. 可变参数kwargs
可变参数还有一种形式 可以接收不存在的关键字参数
定义参数时需要在变量名前添加两个*
,这里的kwargs
代指keywords
,可以写其他任意名称
def func(**kwargs):# kwargs 接收不存在的关键字参数
pass
# 调用不存在的关键字参数函数
func(name = '张三', age = 30, score = 70)
不存在的关键字参数包装成字典
def func(a,**kwargs):# kwargs 接收不存在的关键字参数 kwargs为字典类型
name = kwargs['name']
age = kwargs['age']
# 调用不存在的关键字参数函数
func(name = '张三',age = 30,a=10,score=70)
3. 传递元组/列表给可变参数args
可以传递元组、列表给可变参数args
,需要在元组/列表前加上*
进行解包操作
def func(*args):
print(args)#(10,20,30)
t = (10,20,30)
# 传递元组
func(*t)
4. 传递字典给可变参数kwargs
在字典的前面加上**的作用是将字典中的元素解包成一个一个的不存在的关键字参数传递给函数
def func(**kwargs):
print(kwargs)
d = {'name':'张三', 'age':40}
# 传递字典给可变参数kwargs
func(**d)
5. 组合使用
**kwargs
形参可以与 *args
形参组合使用(*args
必须在 **kwargs
前面), *args
形参接收一个元组。
例如,定义如下函数:
def milk_tea_shop(kind, *arguments, **keywords):
print("-- 老板,给我来杯", kind, "!")
print("-- 对不起,我们的 %s 已经卖完啦!" % kind)
for arg in arguments:
print(arg)
print("-" * 40)
for kw in keywords:
print(kw, ":", keywords[kw])
则可使用如下方式调用:
milk_tea_shop(
"QQ咩咩好喝到爆的咩噗茶",
"加糖", "少冰", "加奶", "加珍珠",
price="10元", address="北京市朝阳区望京SOHO",
phone="010-12345678"
)
输出如下:
-- 老板,给我来杯 QQ咩咩好喝到爆的咩噗茶 !
-- 对不起,我们的 QQ咩咩好喝到爆的咩噗茶 已经卖完啦!
加糖
少冰
加奶
加珍珠
----------------------------------------
price : 10元
address : 北京市朝阳区望京SOHO
phone : 010-12345678
三、递归函数
1. 递归简介
递归指的是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
如果 一个函数在内部调用其本身,这个函数就是 递归函数
递归的好处是:只需少量的程序就可描述出解题过程所需要的多次重复计算
我们先来看看生活中递归的场景:
从前有座山,山里有个庙,庙里有个老和尚,给小和尚讲故事。故事讲的是:
从前有座山,山里有个庙,庙里有个老和尚,给小和尚讲故事。故事讲的是:
从前有座山,山里有个庙,庙里有个老和尚,给小和尚讲故事。故事讲的是:
从前有座山,山里有个庙,庙里有个老和尚,给小和尚讲故事…
2. 递归求阶乘
递归最经典的案例是求n的阶乘
5的阶乘:5*4*3*2*1
def func(n):
'''
求n的阶乘
:param n: 需要求的阶乘
:return: n的阶乘
'''
if n==1:
return 1
else:
return n*func(n-1)
分析:
如果传递的是1,则1的阶乘为1
如果传递的是大于1的数,n的阶乘就等于n乘以n-1的阶乘