本章内容
• 函数的定义和调用
• 函数的分类
• 函数的返回值
• 函数的参数
函数的定义和调用
注意点:
函数一定要遵循先定义后调用的原则
简单的说就是函数的代码一定要在调用函数的代码前执行
函数的定义阶段是不会执行代码的,只会检测函数体的语法
函数体的代码只有在调用函数的时候猜会去执行
函数的调用方式:函数名加小括号
函数名其实就是相当于是变量名指向内存中函数体代码所在的地址
例子:
func() # 报错 name 'func' is not defined 函数没有被定义
# 先定义一个函数
def func():
print('hello world')
# 调用函数
# func() 去内存中找到函数体代码并执行
函数的分类
函数可以分为内置函数和自定义函数。
1.内置函数
内置函数就是python解释器已经封装好的可以直接调用的函数
eg:len,print,input,open...
可以通过ctrl+鼠标左键查看代码的内部源码了解其功能
2.自定义函数
像我们需要的一些复杂的功能,python解释器是没有封装的
这个时候就需要我们程序员自己去编写函数
程序员自己写的函数称为自定义函数,分为无参函数,有参函数和空函数
------无参函数------
在定义函数的阶段括号里没有参数
def index():
print('这是无参函数')
调用无参函数:括号内不需要添加参数 index()
------有参函数------
在定义函数的时候括号里有参数
def index(a):
print('这是有参函数',a)
调用有参函数:在函数调用的时候括号内ue必须由参数(类似于变量值) index(123)
------空函数------
在定义函数的时候函数体代码用pass或者...占位
def index()
pass
一般用来前期的框架搭建,后期补充函数体代码。
''' 在我们前期编写代码的时候,可以通过空函数快速的罗列程序中的大部分功能, 可以让程序代码的主题框架更加清晰 空函数大量的使用在项目前期的功能框架搭建 '''
函数的返回值
函数的返回值就是在调用函数后返回的结构
# 例子
a = 'hello world'
res = len(a) # 将len函数的返回值赋值给变量res
print(res)
获取函数的返回值就很简单了,变量名 = 函数调用。
函数返回值的操作
-----1.当函数体代码没有return关键字的时候,返回值为None
def index():
print('没有返回值的情况')
res = index()
print(res) # None
-----2.当函数体代码写了return但是后面没有跟任何值的时候还是返回None
def index():
print('有return没有值')
return
res = index()
print(res) # None
-----3.当函数体代码写了return并且更了数据,那么写什么就返回什么
如果return后写的是值那么就直接返回值(任意的数据类型)
如果return后写的是变量名那么返回的是变量名所指向的值
def index():
print('有值的情况')
name = 'jason'
return name
res = index()
print(res) # jason
-----4.return后还可以跟多个值,用逗号隔开,会自动组织成元组返回出去后
def index():
print('多个值的情况')
return 111,'jason',222
res = index()
print(res) # (111,'jason',222)
-----5.函数体代码遇到return就会立刻结束函数的运行,相当于循环里的break
函数的参数
1.函数的参数可以分为两大类
函数在定义阶段括号内写的参数
我们称这类参数为'形式参数' 简称形参
函数在调用阶段括号内写的参数
我们称这类参数为'实际参数' 简称实参
2.形参和实参的关系
形参类似于变量名,而实参则是类似于变量值
在调用函数的时候会传入实参,会和形参临时绑定
函数运行结束的时候会自动解除绑定
实参和形参的例子:
# 例子:
def index(a,b): # a和b就是函数index的形参
print(a,b)
index(1,2) # 1和2就是函数index的实参
'''
原理:调用函数的时候1会临时绑定给形参a,2和临时绑定给形参b
函数体运行期间,可以通过形参直接使用到实参
函数体代码运行完毕之后 解除绑定 等待下一次调用
'''
位置参数
位置形参
在函数定义的时候在括号中从左往右依次填写的变量名
def index(name,password): #name和password就是函数的位置形参
pass
位置实参
在函数调用的时候在括号中从左往右依次传入的真是数据
index('jason',123) # jason和123就是函数的位置实参
位置参数的特征
1.位置形参和位置实参在绑定关系的时候就是按照从左到有依次绑定
2.位置形参和位置实参的个数要一直,不可以多一个或者少一个
def index(a, b):
print(a, b)
# index(1,2) # 输出1,2
# index('jason',123) 输出jason 123
# index() # 调用的时候不传实参不可以
# index(111) # 传少了也不行
index(111,222,333) # 传多了也不行
关键字参数
# 在实参中使用,指名道姓的给形参传值,不需要遵循位置实参的顺序
def index(a, b):
print(a, b)
index(b=1, a=2) # 指名道姓的说形参a接收数据2 b接收数据1
index(b=3,4) # 报错 关键字参数必须放在位置参数的后面
index(2,a=1) # 报错 形参只能指向一个实参 因为实参2已经绑定给形参a 所以不能继续给形参a绑定
index(2,b=1) # 可以 相当于位置参数
默认参数
默认参数出现在形参中
在函数定义阶段就给一下形参赋值
后续如果实参传值给赋值过的形参,则使用传入的实参
如果不传值,就使用默认的
默认参数的出现也打破了形参与实参之间个数一致的情况
默认参数必须定义在位置参数的后面
def register(name,age,sex='male')
print('Name:%s
Age:%s
Sex:%s'
%(name,age,sex))
# 定义时就已经为参数sex赋值,意味着调用时可以不对sex赋值
register('jason',17) #大多数情况,无需为sex传值,默认为male
register('tom',18,'female') #少数情况,可以为sex传值female
可变长参数(重要)
需求:定义一个函数 无论传多少位置实参都可以正常执行。
*变量名
# *号在形参中可以用来接收多余的位置形参,并组织成元组的形式赋值给*号后面的变量名
def index(a,b,*c):
print(a)
index() # 报错,因为形参ab的存在至少传入2个实参
index(1,2) # 1 2 ()
index(1, 2, 3, 4, 5, 6, 7) # 1 2 (3,4,5,6,7)
index(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) # 1 2 (3, 4, 5, 6, 7, 8, 9, 10)
需求:定义一个函数 无论传入多少关键字参数都可以正常执行。
**变量名
**在形参中用于接收多余的关键字参数 并且组织成字典的形式赋值给**后面的变量名
def index(a, b, **k):
print(a, b, k)
index(a=1, b=2) # 1 2 {}
index(a=1, b=2, c=3, name='jason') # 1 2 {'c': 3, 'name': 'jason'}
index(1,2,name='jason',age=18,pwd=123) # 1 2 {'name': 'jason', 'age': 18, 'pwd': 123}
可变长形参
# 如何定义一个无论接收多少个任意类型的参数都可以正常执行的函数
def func(*a,**k):
print(a,k)
func() # () {}
func(1,2,3,4,name='jason',age=18) # (1, 2, 3, 4) {'name': 'jason', 'age': 18}
"""
*和**在形参中的使用 后面的变量名并不是关键 但是针对这两个特殊符号后面的变量名 有推荐的写法
"""
def index(*args, **kwargs):
pass
补充说明(重要)
*和**还可以在实参中使用,其功能大同小异。
'''
*号在实参中可以将列表或者元组打散成位置参数一一传入
'''
def index(*args, **kwargs):
print(args, kwargs)
index(*[11,22,33]) # 等价于 index(11,22,33) 输出(11, 22, 33) {}
index(*(44,55,66)) # (44, 55, 66) {}
index([77,88,99]) # ([77, 88, 99],) {}
'''
**号在实参中可以将字典打散成关键字参数一一传入
'''
index(**{'name':'jason','age':18,'pwd':123}) # () {'name': 'jason', 'age': 18, 'pwd': 123}
index({'name':'jason','age':18,'pwd':123}) # ({'name': 'jason', 'age': 18, 'pwd': 123},) {}