【目录】
一、什么是函数
二、为何要有函数
三、如何使用函数
(一)定义函数
(二)调用函数
(三)函数返回值
一、什么是函数
为了方便重复使用某些需要的代码功能,因此创造了很多代码工具,给它们命名为‘函数’。
在程序中,具备某一功能的‘工具’——函数
‘事先准备工具’的过程——函数的定义
‘拿来就用’——函数的调用
函数的分类:
#1、内置函数
为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数,即内置函数。对于内置函数,我们可以拿来就用而无需事先定义,如 len(),sum(),max()
#2、自定义函数
很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可。
二、为何要有函数
为了解决以下程序代码问题:
#1、代码的组织结构不清晰,可读性差
#2、遇到重复的功能只能重复编写实现代码,代码冗余
#3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大
三、如何使用函数
函数的使用分为定义阶段与调用阶段,
定义函数时只检测语法,不执行函数体代码,
函数名加括号即函数调用,只有调用函数时才会执行函数体代码
定义函数发生的事情
1、申请内存空间保存函数体代码
2、将上述内存地址绑定函数名
3、定义函数不会执行函数体代码,但是会检测函数体语法
调用函数发生的事情
1、通过函数名找到函数的内存地址——print(func)
2、然后加括号就是在触发函数体代码的执行 ——func()
(一)定义函数——三种方式
函数的使用必须遵循’先定义,后调用’的原则。
函数的定义就相当于 事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。没有事先定义函数而直接调用,就相当于在引用一个不存在的’变量名’。
def 函数名(参数1,参数2,...):
"""文档描述"""
函数体
return 值
- def: 定义函数的关键字;
- 函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
- 括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
- 冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
- """文档描述""" 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
- 函数体:由语句和:达式组成;
- return 值:定义函数的返回值,return是可有可无的。
1、方式一:无参函数
# 示范1——先定义函数,后调用函数
def bar(): #定义函数 bar(), bar=函数的内存地址 print('from bar') def foo(): # print(bar) # 输出的是函数的内存地址 <function bar at 0x0000021D5885A0D0> bar() #调用函数bar() print('from foo') foo() #调用函数foo()
# 示范2——定义函数的部分,放在调用语句之后,但是在调用函数执行之前
def foo(): bar() #此处还未调用函数bar(),只是判断是否有语法错误 print('from foo') # 定义函数 bar() def bar(): # bar=函数的内存地址 print('from bar') foo() #调用函数bar()
# 示范3———定义函数的部分,放在调用语句之后,且在调用函数执行之后,此时会出错哦
def foo(): # print(bar) bar() print('from foo') foo() def bar(): # bar=函数的内存地址 print('from bar') NameError: name 'bar' is not defined
2、方式二:有参函数——参数是函数的调用者向函数体传值的媒介
函数——工厂
参数——原材料
返回值——产品
def my_min(x,y): res=x if x < y else y return res
3、方式三:空函数——函数体代码为 pass,代表什么都不做
定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,
然后把所有功能都列举出来用pass充当函数体“占位符”,这将使得程序的体系结构立见,清晰且可读性强。
之后我们便可以统筹安排编程任务,有选择性的去实现函数体功能来替换掉pass,从而提高开发效率。
【栗子】:编写一个ftp程序,我们可能想到的功能有用户认证,下载,上传,浏览,切换目录等功能,可以先做出如下定义,再有选择性地实现函数体代码——
def auth_user(): """user authentication function""" pass def download_file(): """download file function""" pass def upload_file(): """upload file function""" pass def ls(): """list contents function""" pass def cd(): """change directory""" pass
4、三种定义函数方式的使用场景:
(1)无参函数
def interactive(): name=input('username>>: ') age=input('age>>: ') gender=input('gender>>: ') msg='名字:{} 年龄:{} 性别'.format(name,age,gender) print(msg) interactive() interactive() interactive() interactive()
(2)有参函数
def add(x,y): # 参数-》原材料 # x=20 # y=30 res=x + y # print(res) return res # 返回值-》产品 # add(10,2) res=add(20,30) print(res)
(3)空函数
参考上一小节内容中的【栗子】——编写一个ftp程序
(二)调用函数——
按照在程序出现的形式和位置,可将函数的调用形式分为三种:
1、语句的形式:只加括号调用函数
interactive()
add(1,2)
2、表达式形式
def add(x,y): # 参数-》原材料 res=x + y return res # 返回值-》产品 赋值表达式 res=add(1,2) print(res) 数学表达式 res=add(1,2)*10 print(res)
3、函数调用可以当做参数
res=add(add(1,2),10) print(res)
(三)函数返回值
1、return
#若需要将函数体代码执行的结果返回给调用者,则需要用到return。
#return的返回值无类型限制,且可以将多个返回值放到一个元组内。
# return是函数结束的标志,即函数体代码一旦运行到 return,会立刻终止函数的运行;
函数内可以有多个return,但只执行一次函数就结束了,并且会将 return后的值当做本次运行的结果返回。
#PS:
结束程序的执行的力度:
exit > return > break > 条件为假
(1)返回None:函数体内的return后无值或直接省略return,则默认返回none
return
return None
def func(): pass res=func() print(res) # 返回值None
(2)有return,返回一个值
def func(): return (10) res=func() print(res) # 返回值为10
(3)有return,返回多个值——逗号分隔开多个值,默认返回元祖
def func(): return (10,'cc',[1,2]) res=func() print(res,type(res)) # 返回值为元祖(10, 'cc', [1, 2])
参考资料: