假设你现在是一名维修工人,如果你事先已经准备好了工具,当你接收到某个维修任务的时候,那你就可以直接拿上工具去工作,而不是临时去制作。
同理,在程序中,函数其实就是具备某一个功能的工具,事先将工具准备好就是函数的定义,遇到需要使用的应用场景,就是函数的调用。
def 函数名(参数1,参数2): """函数注释""" 函数体代码 return返回值
def my_func(): pass
my_func()
定义函数必须遵循一个原则:先定义后调用
定义函数的代码必须要在调用函数的代码之前先运行
定义函数使用关键字def,调用函数使用函数名加括号(可能需要添加额外的参数)
函数在定义阶段只检测函数体代码的语法,不执行函数体代码,函数只有在调用阶段才会执行函数体代码
什么是函数名
函数名绑定的是一个内存地址,里面存放了函数体代码,要想运行该函数体代码,就需要调用函数>>>函数名加括号
def my_function(x, y): """这是一行简单的注释""" print('这是函数体代码') print(my_function) # <function my_function at 0x000002B2632995E0> def my_function(): print('这是打印的内容') name = 'zs' name = my_function my_function() # 这是打印的内容 name() # 这是打印的内容
空函数,即函数体代码使用pass顶替,暂时没有任何功能,主要用于项目前期的搭建,充当提示功能
def function(): pass
无参函数,在函数定义阶段,括号内没有添加任何参数,无参函数直接使用函数名+括号就可以调用
def function(): print('这是一个无参函数')
有参函数,在函数定义阶段,括号内填写参数,有参函数调用需要函数名+括号,并且要有数据值
def function(name, age): # 可以是任意数据值 print('这是一个有参函数') function('张三', 30) # 这是一个有参函数 function([1, 2], 'lisa') # 这是一个有参函数
返回值就是调用函数之后产生的结果,可有可无,且获取函数返回值的方式是固定的,即变量名 = 函数名()
上述方式如果有则获取,没有则默认返回None
# 1.当函数体代码没有return关键字时:默认返回None def function(): print('这是一个没有return返回值的结果') info = function() # 先执行function函数体代码,然后将函数执行后的返回值赋值给变量名info print(info) # None # 2.当函数体代码没有return关键字时:后面不填写参数,也会返回None def function(): print('这是一个有return返回值的结果') return info = function() print(info) # None # 3.当函数体代码没有return关键字时:return后面写什么,就返回什么 def function(): print('这是一个有return返回值,并且后边跟了参数的结果') return 666 info = function() print(info) # 666 def function(): print('这是一个有return返回值,并且后边跟了参数的结果') # 如果return后面是一个变量名或者是函数名,就需要找到变量名绑定的对应值,然后返回数据 name = '张三' return name info = function() print(info) # 张三 # 4.当函数体代码有return关键字并且后面有多个数据值(名字)用逗号隔开时:默认情况下会自动组织成元组形式返回,也可以是列表,需要自己添加 def function(): return 11, 22, 33, 44, 55 info = function() print(info) # (11, 22, 33, 44, 55) def function(): return [11, 22, 33, 44, 55] info = function() print(info) # [11, 22, 33, 44, 55] def function(): return [11, 22, 33, 44, 55], {'name':'张三'}, 666 info = function() print(info) # ([11, 22, 33, 44, 55], {'name': '张三'}, 666) # 5.当函数体代码遇到return关键字会立刻结束函数体代码的运行,如果return后面有数据值,则返回数据值,这也类似于循环里的break def function(): print('how are you') return print('ok') function() # how are you
函数的参数有两大类:形式参数和实际参数
形式参数:函数在定义阶段括号内填写的参数,简称为形参
实际参数:函数在调用阶段括号内填写的参数,简称为实参
def function(info): # info就是function的形式参数 pass def function(info): # 777就是function的实际参数 pass function(777)
形参与实参的关系
形参相当于是变量名,实参相当于是数据值,在函数调用阶段形参会与实参临时进行绑定,函数体代码运行结束以后,立刻解除关系
def function(info): # 动态绑定 print(info) function(777) # 777 function('李四') # 李四 function('666') # 666 function([11, 22, 33, 44, 55]) # 11, 22, 33, 44, 55 # 当函数在定义阶段的时候,形参info处于一个游离状态,当函数调用实参的时候,形参就会与实参临时进行绑定,函数体代码运行结束以后,形参与实参解绑,之后等待下一次的调用,在进行绑定,获取数据值,以此类推,形参可以和任意数据值进行绑定,给它什么它就输出什么!
位置形参,在函数定义阶段括号内从左往右依次填写的变量名,称之为位置形参
给位置形参传值的时候个数必须一一对应,不能多也不能少
def function(name, age): # name, age就是位置形参 pass
位置实参,在函数调用阶段括号内从左往右依次填写的数据值,称之为位置实参。
实参填写的可以是数据值,也可以是变量名
def function(name, age): print(name) # 老六 print(age) # 23 function('老六', 23) # 形参name对应实参老六 形参age对应实参23
ef function(name, age): print(name) # boy print(age) # 23 gender = 'boy' function(gender, 23)
关键字实参,在函数调用阶段括号内以x=y的方式进行传值,称之为关键字实参
指名道姓的给形参传值,打破了位置的限制
位置实参必须在关键字形参的前面
无论是形参还是实参,都遵循一个传值顺序规律,那就是越短的越靠前,越长的越靠后
同一个形参在函数调用的时候只能绑定一个实参,不能同时接收多个实参
def function(x, y): print(x, y) function(x=666, y=777) # 666 777 def function(x, y): print(x, y) function(y=666, x=777) # 777 666 def function(x, y): print(x, y) function(777, y=666 ) # 777 666 def function(x, y): print(x, y) function(777, x=666 ) # 报错 TypeError: function() got multiple values for argument 'x'
默认值形参,在函数定义阶段括号内以什么等于什么的形式填写的形参称之为默认值形参
在函数定义阶段给形参绑定值,后续调用阶段就可以不用传值
调用阶段不传值使用默认值,传值就使用传了的值
默认值参数也遵循一个传值顺序规律,那就是越短的越靠前,越长的越靠后
def register(name, age, gender='male'): print(f""" ----------------student_info-------------- name:{name} age:{age} gender:{gender} ------------------------------------------ """) register('孙悟空', 999, ) register('猪八戒', 444, ) register('沙悟净', 333, ) register('李天王', 222, ) register('lisa', 18, 'girl') # ----------------student_info - ------------- # name: 孙悟空 # age: 999 # gender: male # ------------------------------------------ # # ----------------student_info - ------------- # name: 猪八戒 # age: 444 # gender: male # ------------------------------------------ # # ----------------student_info - ------------- # name: 沙悟净 # age: 333 # gender: male # ------------------------------------------ # # ----------------student_info - ------------- # name: 李天王 # age: 222 # gender: male # ------------------------------------------ # # ----------------student_info - ------------- # name: lisa # age: 18 # gender: girl # ------------------------------------------
# 定义一个函数,无论接收多少位置实参,都可以执行 def function(*args): print(args) function() # () function(66) # (66,) function(77, 88) # (77, 88) # 定义一个函数,无论接收多少关键字实参,都可以执行 def function(**kwargs): print(kwargs) function() # {} function(name='张三') # {'name': '张三'} function(name='李四', age=20) # {'name': '李四', 'age': 20} function(name='tony',age=22,hobby='running') # {'name': 'tony', 'age': 22, 'hobby': 'running'} # 定义一个函数,无论怎么传值都可以执行,不管是位置实参还是关键字实参 def function(*args,**kwargs): print(args,kwargs) function() # () {} function(22) # (22,) {} function(11, 22) # (11, 22) {} function(a=1) # () {'a': 1} function(a=1, b=2) # () {'a': 1, 'b': 2} function(1, 2, 3, a=1, b=2) # (1, 2, 3) {'a': 1, 'b': 2}