函数的分类
目录
函数的定义与调用
1.函数遵循先定义后调用的原则
func1() # 报错,name 'func1' is not defined
def func1():
print('stydy hard')
2.函数在定义阶段只检测语法,不执行代码
def func2():
sjjaxxnncnnks
askjjamdnxnncnn
asjdjkjdkjsan
dsjdjfjsk
return # 不调用函数执行不会报错
3.函数体代码只有在调用函数的时候才会执行
def func2():
sjjaxxnncnnks
askjjamdnxnncnn
asjdjkjdkjsan
dsjdjfjsk
return
func2() # 不调用函数执行不会报错,一旦调用后执行函数体代码之后才会报错
4.函数名其实相当于是变量名,函数名指向的是函数体代码在内存中的位置
def func2():
pass
return
print(func2) # 指代函数体代码内存地址0x0000023AD7381EA0>
函数的分类
一、内置函数
python解释器提前定义好可以直接调用的函数
eg:len、open... # 如何查看代码的内部源码ctrl+鼠标左键
二、自定义函数
简而言之就是程序员自己编写的函数
1.无参函数
def func3(): # 无参函数:在函数定义阶段括号内没有参数
print('读过一本好书,像交了一个益友')
print('学必求其心得,业必贵其专精')
func3() # 调用无参函数:括号内也不需要写参数
2.有参函数
def func4(writer): # 有参函数:在函数定义阶段括号内有参数,类似于变量名
print('尺有所短;寸有所长。物有所不足;智有所不明。》', writer.rjust(10, '-'))
func4('屈原《卜居》') # 调用有参函数:在函数调用阶段括号内也必须传参数,类似于变量值
3.空函数
# 空函数:在定义阶段函数体代码是用pass或者...占位,搭建功能框架
# 例如写一个自动驾驶系统,先罗列出程序中大致的功能
def auto_start():
pass
def auto_brake():
pass
def auto_drive():
pass
函数的返回值
# 函数的返回值其实就是在调用函数之后返回的结果
str1 = 'hello world'
res = str1.count('l') # 将count函数的返回值赋值给变量res
print(res)
# 如何设定返回值
# 1.当函数体代码没有return关键字的时候,返回值是None
def func5():
print('生活的理想,就是为了理想的生活')
res = func5()
print(res) # None
# 2.当函数体代码后面有return关键字,但是return后面为空,返回值也是None
def func5():
print('生活的理想,就是为了理想的生活')
return
res = func5()
print(res) # None
# 3.当函数体代码后面有return,并且后面有元素,返回该元素
# 如果该元素是值那么直接返回值,值可以是任意数据类型
# 如果该元素是变量名那么返回变量名指向的值
def func5():
print('生活的理想,就是为了理想的生活')
writer = '张闻天'
return writer
res = func5()
print(res) # 张闻天
# 4.return后面还可以跟多个元素,用逗号隔开,返回值的形式是元组
def func5():
print('生活的理想,就是为了理想的生活')
return '作者', '张闻天'
res = func5()
print(res) # ('作者', '张闻天')
# 5.函数体代码遇到return会立刻结束函数运行
def func5():
print('生活的理想,就是为了理想的生活')
return '作者', '张闻天'
print('盛年不重来,一日难再晨。及时当勉励,岁月不待人') # 不会执行
res = func5() # 生活的理想,就是为了理想的生活
print(res) # ('作者', '张闻天')
函数的参数
一、函数的参数可以分为两大类
- 函数在定义阶段括号内写的参数
我们称之为'形式参数', 简称为形参 - 函数在调用阶段括号内写的参数
我们称之为'实际参数' ,简称为实参
二、形参与实参的关系
形参类似于是变量名、实参类似于是变量的值,在调用函数的时候传入实参,会与形参临时绑定,函数运行结束之后自动解除绑定。
位置参数
- 位置形参
在函数定义阶段括号内从左往右依次填写的变量名
def info_func(name,age,hooby): # name,age,hooby就是位置形参
pass
- 位置实参
在函数调用阶段括号内从左往右依次传入的值
info_func('yashuo','20','swim') # 'yashuo','20','swim'就是位置实参
- 位置参数的特征
- 位置形参与位置实参在绑定关系的时候就是按照从左往右的顺序依次绑定
- 位置形参与位置实参的个数要一致
def info_func(name,age,hobby):
print(name,age,hobby)
info_func('yashuo','20','swim') # 正常打印
# info_func() # 调用的时候不传实参报错
# info_func('yashuo','20') # 传少了报错
index('yashuo','20','swim','qaq') # 传多了报错
关键字参数
def info_func(name, age, hobby):
print(name, age, hobby)
info_func(age='20', hobby='swim', name='yasuo') # 关键字一一对应
# info_func(name = 'yasuo',age='20', 'swim') # 报错 positional argument follows keyword argument
info_func('yasuo', hobby='swim', name='jeyce') # 报错 info_func() got multiple values for argument 'name'
info_func('yasuo', '20', hobby='swim') # 相当于位置参数
默认参数
在函数定义阶段就已经给一些形参赋值,后续如果不传值则使用默认的,后续如果传值则使用传入的值
def inp_info(name, age, gender, position ='普通员工'):
'''员工信息输入'''
print("""
员工姓名:%s
员工年龄:%s
员工性别:%s
员工职位:%s
""" % (name, age, gender, position))
inp_info('marial', 18, 'female')
inp_info('jack', 32, 'male', '老板')
inp_info('tom', 28, 'male')
inp_info('Jack', 22, 'male', '保安队长')
可变长参数
def func(*args,**kwargs):
print(args,kwargs)
func() # () {}
func(11, 22, 33, 44, 55,66, 77, ame='yasuo', age='20', name='swim') # (11, 22, 33, 44, 55, 66, 77) {'ame': 'yasuo', 'age': '20', 'name': 'swim'}