函数
定义:
- 将一件事的步骤封装在一起
- 函数名表示这个函数要做的事
- 函数体是实现函数功能的流程
分类:
- 内置函数
- 自定义函数
通过关键字def定义函数:
def name(agrs...): # 定义一个函数,agrs是函数要传入的参数,可以有0个或多个
do something # 将功能步骤封装到一起
返回值 # 返回值,使用return
return(返回值)
- 将函数结果返回的关键字
- 只能在函数体中使用
- 支持返回任何类型的数据
- 有返回值的函数可以将其赋值给一个变量
- return意味着函数的结束,return之后的代码不再执行
- 若在函数中没有return,那么默认返回的是None
return与print的区别:
- print只是打印,不能赋值
- return是对函数结果的返回,支持赋值
例:
def test():
return '这是一个测试'
# 有返回值的函数可以将其赋值给一个变量
a = test()
print(a)
结果:
函数的传参
- 实参和形参
- 必传参数
- 默认参数
- 不规则参数
实参和形参:
- 在函数名中定义的是形参
- 在函数调用时,给函数名中传递的参事是实参
必传参数:
- 在定义函数时,参数后面没有赋值
- 函数中定义的参数没有默认值,在调用函数时若不传会报错
默认参数:
- 在定义函数时,参数后面有赋值,这个值就是默认值
- 函数调用时,默认参数给与了新的值,函数将优先使用后传入的值
例:
# a和b是默认参数
def add1(a=1, b=2):
return a + b
number_add1 = add1() # 这里的结果是1+2
print(number_add1)
# a和b是必传参数
def add2(a, b):
return a + b
number_add2 = add2(2, 3) # 这里的结果是2+3
print(number_add2)
# a是默认参数,b是必传参数
def add3(a, b=1):
return a + b
number_add3_1 = add3(2) # 这里的2是给参数a赋值,b用默认的1,结果就是1+2
number_add3_2 = add3(2, 3) # 这里的2是给参数a赋值,3是给参数b赋值,结果就是2+3
print(number_add3_1)
print(number_add3_2)
结果:
不规则参数:
- 没有固定的参数名和数量
- *args:表示将无参数的值合并成元组
- **kwargs:表示将有参数与默认值的赋值语句合并成字典
用法:
例1:
# 定义函数
def test(*args, **kwargs):
print(args, type(args))
print(kwargs, type(kwargs))
# 方式一:直接传参
test(1, 2, 'a', name='张三', age=12)
# 方式二:定义一个元组和字典然后将传入函数
test_tuple = (1, 2, 'a')
test_dict = {'name':'张三', 'age':12}
# 这里要注意,传入元组变量添加一个*,字典变量添加2个*
test(*test_tuple, **test_dict)
结果:
命名关键字:
- 在可变参数*args(可变元组参数)后面
- 调用时是:变量名=数值
例:
def t(a,b=1,*args,c=2,**kwargs):
print(a,b)
print(args)
print(kwargs)
print(c)
t(1,2,3,4,c='c',d='d',e='e')
参数的规则
从左到右依次是:必传参数、默认参数、可变元组参数、命名关键字、可变字典参数
例:
def test(a, b=1, *args, c, **kwargs):
print('a是{},b是{},*args是{},c是{},**kwargs是{}'.format(a, b, args, c, kwargs))
test('aa', 'bb', 1, 2, 3, c='cc', name='张三', age=10)
test('bb', c='cc',name='张三', age=10)
test(b=666, c='cc',a=123, name='张三', age=10)
结果:
函数的参数类型定义
注:
- 函数定义在python3.7之后可用
- 这里的参数类型只是说明,函数不会对参数类型进行验证,只有在使用时若是参数不符合使用才会报错,也就是说即使定义的是int类型,但是传入的是字符串类型,只要函数体中的代码块使用字符串不会有问题,那么就是正常的
例:
def add(a:int, b:int):
print(a + b)
add(1, 2)
add('hello', 'world') # 这里传入字符串,也是正常的,函数参数定义的int只是说明,没有其他影响
结果: