Python函数
函数简介
- 什么是函数
假设你现在是一名维修工人,如果你事先已经准备好了工具,当你接收到某个维修任务的时候,那你就可以直接拿上工具去工作,而不是临时去制作。
同理,在程序中,函数其实就是具备某一个功能的工具,事先将工具准备好就是函数的定义,遇到需要使用的应用场景,就是函数的调用。
函数的作用
- 减少代码的冗余,增加程序的可扩展性和维护性
- 提高应用的模块性和代码的重复利用率
- 避免重复的编写代码,函数的编写更容易理解
- 保持代码的一致性,方便修改,更易于扩展
函数的基本使用
函数的本质
- 结合上面的例子,我们可以把函数看做是一个工具,提前定义好,之后就可以进行反复的使用,函数的使用必须遵循一个原则:即先定义,后调用!!!
函数语法结构
def 函数名(参数1,参数2):
"""函数注释"""
函数体代码
return返回值
语法参数说明
- def:是定义函数的关键字
- 函数名:与变量名的命名一致,尽量做到见名知意
- 括号:在定义函数的时候函数名后面必须要有括号
- 参数:定义函数括号内可以写参数也可以不写参数,写参数的时候,个数不固定,用于接收外界传给函数体代码内部的数据
- 函数注释:类似于用户说明书,用于介绍函数的主体功能和具体用法
- 函数体代码:函数最核心的区域,即逻辑代码
- 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() # 这是打印的内容
- PS:函数名加括号执行优先级最高(定义阶段除外,因为定义阶段不会执行函数体代码)
函数的分类
内置函数
- python解释器提前定义好的函数,用户可以直接进行使用,如input()、len()等等
- 内置函数可以直接调用,但是数据类型的内置方法(函数)必须使用数据类型点的方式才可以调用,相当于是数据类型独有的一些内置方法
自定义函数
-
空函数,即函数体代码使用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}
原创文章,作者:端木书台,如若转载,请注明出处:https://blog.ytso.com/272580.html