03函数
函数使用def关键字,后面跟上函数名,函数名命名规则一般使用英文单词命名,多个单词之间使用_隔开,()可以存放参数
函数的定义
def test(): print('in the test funcation') return 0 def #定义函数的关键字 test #函数名 ()#定义形参 return#定义返回值
注:函数定义好以后,一定要调用才能被执行
函数的打印
思考:如下的函数,执行的时候,会打印出结果吗?
答案:没有输出结果,因为没有print函数,函数相当于z=3,在pycharm中,直接定义一个z=3,是输出不了任何结果的,因为缺少print函数
def add(x,y): return x+y z=add(1,2)
函数的调用
def find_data(): print('开始查找数据') def exec_code(): print('开始执行代码') find_data() #在exec_code()函数中,调用了find_data()
函数的返回值return
在函数中使用return关键字可以将结果返回给函数的调用者。
return其实有两个作用:
需要用一个变量来接受程序结束后返回的结果
它是一个结束符,终止程序运行
def test():
print('in the test_1')
return 0
print('程序结束了吗?') #结果中没有打印这句话
x = test()
print(x)
#输出结果
in the test_1
0
return 0之后的代码就不执行了,只执行return前面的代码;变量x接受了test()函数结束后的返回结果。
没有返回值的函数
思考:如下的函数,会打印出什么结果?是10吗?
结果:输入的是None
def f(x): x=10 z=f(100) print(z)
因为:def f(x) 没有返回值,只要函数没有返回值,都显示None
函数的参数
为函数设置参数,可以让函数的功能更加灵活。
def login(name): print(f"{name}登录成功") login('xiaoming') login('xiaohong') login('admin') #输出结果为: xiaoming登录成功 xiaohong登录成功 admin登录成功
函数的必填参数
函数中定义参数,如果没有默认值,则为必填参数;必填参数只要在函数中定义,不管在函数内部有没有被调用到都无所谓;但是在外部调用的时候一定是有多少个参数,传入多少个参数。
def f(x, y, z): return True f(1)
f(x,y,z)函数定义了三个参数,所以在调用的时候也要传3个参数,否则就会报错
函数传参
定义的函数参数默认传参按照位置进行传参
def study(name,place="凡猫"): print(f'{name}在{place}学习Python自动化') study('xiaoming') study('xiaoming','51testing') #输入结果 xiaoming在凡猫学习Python自动化 xiaoming在51testing学习Python自动化
也可以指定参数名进行传参
def study(name,place="凡猫"): print(f'{name}在{place}学习Python自动化') study(name='xiaoming',place='51testing') study(name='wanggang',place='Office') #输出结果为: xiaoming在51testing学习Python自动化 wanggang在Office学习Python自动化
也可以第一个参数不指定参数名
def study(name,place="凡猫"): print(f'{name}在{place}学习Python自动化') study('xiaohong',place='51testing') #输入结果为: xiaohong在51testing学习Python自动化
如果第一个参数传参的时候指定了参数名,那么后面的参数也都要需要指定参数名,否则会报错
def study(name,place="凡猫"): print(f'{name}在{place}学习Python自动化') study(name='fubeibei','51testing')
函数参数的默认值
如果函数有默认值,传参的时候默认值处不传参,则使用默认值;如果传参,则会把默认值覆盖掉;
def study(name,place="凡猫"): print(f'{name}在{place}学习Python自动化') study('xiaoming') #如果函数中,参数有默认值,调用的时候不传参数。会自动使用默认值 #输出结果为: xiaoming在凡猫学习Python自动化
在定义函数参数的时候,必填项一定要放到首位,有默认值的参数要放到后面,否则会报错
def study(place="凡猫",name): print(f'{name}在{place}学习Python自动化') study('xiaoming')
总结:
必填项必须放到前面
有默认值参数放在后面
*args可变长度元组参数
当参数名前面使用*来装饰的时候,这个参数在函数中为元组类型,可以传多个参数,也可以不传,如果传多个参数,那么这些参数会放到元组中;args:是argument的缩写,argument<数,逻>自变数
def desc(name,hometown,age,*likes): print(type(likes)) print(f'我的名字是{name},来自{hometown},今年{age}岁,我的爱好{likes}') desc('小明','上海',20) desc('小张','背景',21,'游戏','爬山')
输入结果:
<class 'tuple'> 我的名字是小明,来自上海,今年20岁,我的爱好() <class 'tuple'> 我的名字是小张,来自背景,今年21岁,我的爱好('游戏', '爬山')
当定义的函数中有用到必填项,可变长度参数,有默认值参数的时候,定义参数的顺序参考如下代码:
def f(name,*likes,age=10): print(name,age,likes) f('xiaoming') f('xiaoming',age=15) f('xiaohong','sports')
输出结果如下:likes输出的都是元组的形式
xiaoming 10 () xiaoming 15 () xiaohong 10 ('sports',)
**kwargs可变长度的字典类型数据
带有**类型的参数,表示参数类型为字典,传参的时候需要使用关键字=value的方式进行传参,在函数内部转化为{key:value}数据格式;可以不传,也可以传多个数据;
def desc(name,hometown,age,*lies,**kwargs): print(type(kwargs),kwargs) desc('小明','上海',20) desc('小明','广州',21,project='自动化测试',workyear=3)
输出结果为:
<class 'dict'> {} <class 'dict'> {'project': '自动化测试', 'workyear': 3}
如果一个函数中有多种参数类型,定义的时候参数顺序如下:
def f(name,*likes,age=10,**others): print(name,likes,age,others) f('xiaoming') f('xiaoming','games','sports',age=11,username='xiaowang')