函数的定义、调用、分类、返回值、参数
今日内容总结
在昨日的内容总结中我们提到:函数类似于工具,提前定义好后可以重复使用。而函数体代码的重复执行与循环体代码时不一样的。循环体代码是在相同的位置重复执行,函数体代码是在不同的位置重复执行。也就是说,昨日开始,我们就踏入开始学函数的大门了。所以今日重点,甚至最近几日的重点都在与函数。
函数的定义与调用
1.函数一定要遵循先定义后调用的原则,也就是说,定义的函数代码一定要比调用函数代码先执行。首先是因为我们的python是解释性语言。逐行翻译,其次,用生活中的例子来说,我们使用工具之前,是要先有这个工具,才会使用。没有工具时,也是先创造工具,再使用这个工具的。
2.函数在定义阶段只检测语法,不执行代码。
3.函数体代码只有在调用函数的时候才会执行。调用方式是函数名加括号,如果有参数还要传递参数。
4.函数名其实相当于是变量名指向的是内存中函数体代码所在的位置
函数的分类
函数分为内置函数和自定义函数
1.内置函数,内置函数就是python解释器提前定义好可以直接调用的函数。比如之前的基本数据类型的内置方法,就是内置函数
2.自定义函数,也是程序员自己编写的函数。自定义函数又分为无参函数,有参函数,空函数。代码示例:
# 无参函数
def output():
print('好好学习')
output() # 好好学习
# 无参函数就是在函数定义阶段括号内没有参数,而调用无参函数括号内不需要写参数
# 有参函数
def output(a):
print('好好学习', a)
output(666) # 好好学习 666
# 有参函数在函数定义阶段括号内有参数,类似于变量名,而我们调用函数时,括号内也必须有参数,调用有参函数时,括号内的参数类似于变量值
# 空函数
def output():
pass
# 空函数在定义阶段函数体代码是用pass或者...占位。前期能够通过空函数快速的罗列出程序中大致的功能,让程序整体框架清晰,空函数大量的使用在项目前期的功能框架搭建。
函数的返回值
函数的返回值其实就是在调用函数之后返回的结果,代码示例:
# 函数需要先定义后调用,函数体中 return 语句的结果就是返回值。如果一个函数没有 reutrn 语句,其实它有一个隐含的 return 语句,返回值是 None,类型也是 'NoneType'。而return语句的作用,是结束函数调用、返回值。类似于循环里面的break。
def showplus(x):
print(x)
return x + 1
num = showplus(6) # 6
add = num + 2
print(add) # 9
函数返回值的获取,就是如上述代码中的:变量名 = 函数调用
无论定义的是返回什么类型,return 只能返回单值,但值可以存在多个元素。
函数的参数
函数的参数
函数的参数可以分为两大类。1.函数在定义阶段括号内写的参数称之为'形式参数',简称为形参。2.函数在调用阶段括号内写的参数称之为'实际参数',简称为实参
形参与实参的关系,代码示例:
def hello(str):
print(str)
hello('hello,world') # hello,world
我们可以看到在函数hello中,str作为一个参数,是形参,这形参个类型取决于你调用时输入的实参类型,我们这里调用函数hello时,传入了一个字符串'hello,world',那么这个实参的类型就是字符串,所以形参str的类型也是字符串,所以当我们调用函数hello时传入‘hello,world’,就会执行函数里面的print语句。值得注意的是,我们在定义函数时形参数量只有一个,因此在调用函数时传入实参也必须是一个!如果传入的实参数量多余形参数量会出现错误。
由上述示例我们会发现,形参类似于是变量名、实参类似于是变量的值。在调用函数的时候传入实参 会与形参临时绑定,函数运行结束之后自动解除绑定。
位置参数
1.位置形参
位置形参在函数定义阶段括号内从左往右依次填写的变量名,代码示例:
def index(a,b): # a和b就是位置形参
pass
2.位置实参
位置实参在函数调用阶段括号内从左往右依次传入的真实数据,代码示例:
index('jason', 666): # jason和666就是位置实参
位置参数的特征,1.位置形参与位置实参在绑定关系的时候就是按照从左往右的顺序依次绑定。2.位置形参与位置实参的个数要一致,多一个不行少一个也不行
关键字参数
关键字参数就是在调用函数时,传入实参时带参数名,用这样的方式传入的实参叫做关键字参数。关键字参数出现在实参中,指名道姓的给形参传值,不需要遵循位置。代码示例:
# 可以不遵循位置
def output(a, b):
print(a, b)
output(b=666, a='jason') # jason 666
默认参数
默认参数就是定义函数时,形参给定一个值。在函数定义阶段就已经给一些形参赋值了,后续如果不传值则使用默认的,后续如果传值则使用传入的,默认参数必须定义在位置参数的后面,默认参数的出现也打破了形参与实参之间个数一致的情况代码示例:
def output(a, b, hobby='run'):
print(a, b, hobby)
output('jason', 18, 'stady') # jason 18 stady 传了就使用自己的
output('jason', 18) # jason 18 run 不传就使用默认的
可变长参数
定义一个函数,无论传多少位置实参都可以正常执行。代码示例:
# *号在形参中
def output(*a):
print(a)
output() # ()
output(1, 2) # (1, 2)
output(1, 2 , 3, 'jason', 666) # (1, 2, 3, 'jason', 666)
# 可以接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名
# **在形参中
def output(a, b, **k):
print(a, b, k)
output(1, 2) # 1 2 {}
output(1, 2, name = 'jason') # 1 2 {'name': 'jason'}
output(1, 2 , name = 'jason',age = 18, hobby = 'run') # 1 2 {'name': 'jason', 'age': 18, 'hobby': 'run'}
# 用于接收多余的关键字参数 并且组织成字典的形式赋值给**后面的变量名。
# 定义一个函数,无论传入多少关键字参数都可以正常执行
可变长形参
可变长形参,无论接收多少个任意类型的参数都可以正常执行的函数。代码示例:
def output(*a, **k):
print(a, k)
output() # () {}
output(1, 2, name = 'jason') # (1, 2) {'name': 'jason'}
output(1, 2, 4, name = 'jason',age = 18, hobby = 'run') # (1, 2, 4) {'name': 'jason', 'age': 18, 'hobby': 'run'}
# 后在定义函数的时候,如果不确定这个函数将来需要多个实参,那么可以采用上述的方法
今日补充
*和**不单单可以在形参中使用 还可以在实参中使用。代码示例:
def output(*a, **k):
print(a, k)
# *号在实参中
output(*['jason', 'handsome', 'nb', 666]) # ('jason', 'handsome', 'nb', 666) {}
output(*('jason', 'handsome', 'nb', 666)) # ('jason', 'handsome', 'nb', 666) {}
output(['jason', 'handsome', 'nb', 666]) # (['jason', 'handsome', 'nb', 666],) {}
# 可以将列表或者元组打散成位置参数一一传入。可以看成是*号会将列表和元组的括号去除,暴露出里面一个个元素
# **号在实参中
output(**{'name': 'jason', 'age': 18, 'hobby': 'run'}) # () {'name': 'jason', 'age': 18, 'hobby': 'run'}
output({'name': 'jason', 'age': 18, 'hobby': 'run'}) # ({'name': 'jason', 'age': 18, 'hobby': 'run'},) {}
# 可以将字典打散成关键字参数一一传入

学习内容总结
浙公网安备 33010602011771号