python版本3.8.1
函数详解
一、函数
1.函数是就是一个对象,有自己的属性
def bmi(height,weight):
#双或三引号中输入的注释,可以通过 函数名.__doc__ 得到
#使用 print(bmi.__doc__)打印
"计算BMI的值"
bmi_value = round(weight/(height*height),1)
#如果返回多个值,多个值被包在元组里
if(bmi_value < 18.5):
return bmi_value,'多吃点'
elif(bmi_value <= 24):
return bmi_value,'你真棒!'
else:
return bmi_value,'多运动'
print(bmi) #<function bmi at 0x000001E7FAD161F0>
print(bmi.__name__) #bmi
print(bmi.__doc__) #计算BMI的值
2.可以被赋值
f = bmi
print(f(1.72,50)) #(16.9, '多吃点')
print(f.__name__) #bmi
print(f.__doc__) #计算BMI的值
3.可以被传递
def main(check):
height = float(input('输入身高'))
weight = float(input('输入体重'))
print(check(height,weight))
main(bmi)
二、函数参数
1.位置参数
def calc(a,b,c):
print(a*a + 2*b + c)
calc(3,5,8) #27
2.关键词参数
calc(b=5, c=8, a=3) #27
3.混搭
先位置,后关键词
calc(3,5,c=8) #27
4.强制关键词参数
def c2(*, a, b, c):
print(a*a + 2*b + c)
c2(a=3,b=5,c=8) #27
#如果输入c2(3,5,8)会报错
#TypeError: c2() takes 0 positional arguments but 3 were given
#c2(3, 5, 8)
5.默认参数
先非默认参数,后默认参数
def c3(a, b, c=0): #不传c的时候,默认为0,传的话按传入的值
print(a*a + 2*b + c)
c3(3,5) #19
6.可变参数(位置)
先固定参数,再可变参数
#定义方法时,参数前加了*,表示是一个可变参数,参数个数可以是0到无穷多个的位置参数
def hello(msg, *names):
print('Hello',names,msg)
print('Hello',*names,msg) #*names对元组进行拆包
hello('新年好','zhangsan','lisi','wangwu','zhangliu')
#输出
#Hello ('zhangsan', 'lisi', 'wangwu', 'zhangliu') 新年好
#Hello zhangsan lisi wangwu zhangliu 新年好
7.可变参数(关键词)
def hello(msg, **names):
print('老大是: ',names['BOSS'],msg)
print('老二是: ',names['BOSS2'],msg)
hello('新年好',BOSS='张三',BOSS2='李四')
#输出
#老大是: 张三 新年好
#老二是: 李四 新年好
8.进一步混搭
#顺序必须是:必选参数、可变位置参数、命名关键字参数和可变关键字参数
def f(a,b,c,d,*args,e,f,**kwargs):
print(a,b,c,d,e,f)
print(args)
print(kwargs)
f(1,2,3,4,5,99,e=6,f=7,x=8,y=9,z=10)
#输出
#1 2 3 4 6 7
#(5,99)
#{'x': 8, 'y': 9,'z':10}
9.强制位置参数
/ :python版本在3.8以后才有
#/前面的参数一定是位置参数
#a,b一定是位置参数,c,d可以是位置参数也可以是关键字参数
#e,f一定是关键字参数
#kwargs是可变关键字参数
def f(a, b, /, c, d, *, e, f, **kwargs):
print(a, b, c, d, e, f)
print(kwargs)
f(3,4,5,6,e = 7,f = 8,x = 9,y = 10)
#输出
#3 4 5 6 7 8
#{'x': 9, 'y': 10}
10.函数调用 - 开包列表和元组
使用*进行开包、打包
#列表
def hello(msg,name1,name2,name3):
print('Hello',name1,name2,name3,msg)
names_param = ['张三','李四','王五']
hello('您好',*names_param) #输出:Hello 张三 李四 王五 您好
def hello(msg, *names): #*names会将传过来的数据打包
print('Hello',*names,msg) #打印时将names拆包
names_param = ['张三','李四','王五']
hello('您好',*names_param) #调用之前首先拆掉元组
#输出:Hello 张三 李四 王五 您好
#元组
def hello_1(msg, *names): #*names会将传过来的数据打包
print('Hello',names,msg)
names_param = ('张三','李四','王五')
hello_1('您好',*names_param) #调用之前首先拆掉元组
#输出:Hello ('张三', '李四', '王五') 您好
def hello_2(msg, *names): #*names会将传过来的数据打包
print('Hello',*names,msg) #打印时将names拆包
names_param = ('张三','李四','王五')
hello_2('您好',*names_param) #调用之前首先拆掉元组
#输出:Hello 张三 李四 王五 您好
11.函数调用 - 开包字典
使用**进行开包、打包
def hello(msg, **names):
print(names)
print('老大是: ',names['BOSS'],msg)
print('老二是: ',names['BOSS2'],msg)
data = {'BOSS':'张三','BOSS2':'李四'}
hello('新年好',**data)
#输出
#{'BOSS': '张三', 'BOSS2': '李四'}
#老大是: 张三 新年好
#老二是: 李四 新年好
三、全局变量
在函数内改写全局变量,需要用global关键词
count = 8
def work():
global count #这个count就是外面的count
count = 10
print(count)
work()
print(count)
输出
10
10