函数的定义
函数:是组织好的、可重复使用的,是实现某个功能的代码块。
当你在写代码的过程中,发现某一块代码在血多地方都用得到,一直重复的使用,就可以考虑封装成一个函数或是类。
函数可以提高代码的复用性,可读性
函数定义格式
def 函数名称(参数1,参数2…)
‘’’ 文档字符串 docstring’’’
函数的注解,这个函数是干嘛用的
函数体(函数的执行逻辑)代码块
return 返回值
def add(a,b):
'''两个数相加'''
c = a + b
return c
函数的调用
def add(a,b):
'''两个数相加'''
c = a + b
return c
print(add(5,6))
结果:11
1,函数遇到 return 就终止
def add(a,b):
'''两个数相加'''
c = a + b
return c ==》到这一行就结束了
print('hello world') # 不会执行
2,函数的返回值 return,函数调用后可以通过变量接收 return 的值
def add(a,b):
'''两个数相加'''
c = a + b
return c
add(5,6)
打印是空
# 通过变量接收
result = add(5, 6)
print(result)
结果:11
练习:
之前在 if 条件控制写过一个计算bmi指数,可以试着把他封装成一个函数
def bmi (height,weight):
'''计算BMI指数'''
print('您输入的身高是:{}m'.format(height))
print('您输入的体重是:{}kg'.format(weight))
bmi = weight / height ** 2
if bmi < 18.5:
return ('您的bmi指数为:{:.2f} ==> 过轻'.format(bmi))
elif bmi >= 18.5 and bmi < 25:
return('您的bmi指数为:{:.2f}==> 正常'.format(bmi))
elif bmi >= 25 and bmi < 28:
return('您的bmi指数为:{:.2f} ==> 过重'.format(bmi))
elif bmi >= 28 and bmi < 32:
return('您的bmi指数为:{:.2f} ==> 肥胖'.format(bmi))
else:
return('您的bmi指数为:{:.2f} ==> 严重肥胖'.format(bmi))
print(bmi(1.76,60))
结果:
您输入的身高是:1.76m
您输入的体重是:60kg
您的bmi指数为:19.37 ==> 正常
函数的参数
形式参数: 函数在定义的时候写的参数==>变量名
def add(a,b): ==> a,b 就是形式参数
'''两个数相加'''
c = a + b
return c
实际参数: 函数在调用的时候写的参数==>传入函数的值
def add(a,b):
'''两个数相加'''
c = a + b
return c
print(add(5,6)) ==>这里的5,6就是实际参数
位置参数: 形式参数和实际参数一一按照顺序对应 “顺序一一对应”
def get_name(firstname,middle,lastname''):
'''获取名字'''
return firstname + middle + lastname
print(get_name('田')) ==>报错,有三个位置参数,你只填了一个
默认参数: 在函数定义的时候,给形式参数一个缺省值,可以简化调用过程
当你在调用的时候:
- 没有传入参数的值,则直接使用这个缺省值
- 如果有传入新的值,缺省值就不会生效
def add(a,b=0): ==> b=0就是默认参数,默认参数要放到位置参数后面,放前面会报错
'''两个数相加'''
c = a + b
return c
print(add(5)) ==>结果为:5+0=5,不传就直接取缺省值
print(add(5,6)) ==>结果为:5+6=11,有传缺省值不生效
关键字参数:
作用:相对于位置参数讲的,可以知道变量的意思
可以提高函数调用时候的可读性,更加容易理解实际参数的意思
可以交换调用参数的顺序,并且提高可读性
关键字参数区别位置参数:可以不按照顺序进行调用,可以交换顺序
TODO :关键字参数要放到位置参数的后面,不然会报错
def get_name(firstname,middle,lastname=''):
'''获取名字'''
return firstname + middle + lastname
print(get_name('田',lastname='最帅',middle='某某')) ==> 可以不按顺序填写
print(get_name(lastname='最帅','田',middle='某某')) ==> 报错,关键字参数要放到位置参数的后面
运行结果:
田某某最帅
不定长参数:
*args,在函数内部的表现形式:args是一个元祖
TODO:
- *args 可以只有一个,*args,*args 报错
- *args 加在其他位置参数的后面
关键字不定长参数:
**kwargs:打印的是dict
def get_name(firstname,*args):
'''获取名字'''
print(firstname)
print(args) ==> 是一个元祖
return firstname
get_name('tian','gan','handsom') ==>可以传多个参数
运行结果:
tian
('gan', 'handsom')
=====================================================================================
def get_name(*args):
'''获取名字'''
print(args)
return args
get_name('tian','gan','handsome')
运行结果:
('tian', 'gan', 'handsome')
=====================================================================================
def get_name(*args,**kwargs):
'''获取名字'''
print(args)
print(kwargs)
get_name('tian','gan',middle = 'handsome', end = '666') ==> 带关键字就是关键字不定长参数
运行结果:
('tian', 'gan')
{'middle': 'handsome', 'end': '666'}