函数中的参数
今日内容总结
一、函数的定义与调用
二、函数的分类
三、函数的返回值
四、函数的参数
五、位置参数
六、关键字参数
七、默认参数
八、可变长参数
九、可变长形参数
十、补充说明(*和**在实参中的用法)
一、函数的定义与调用
# 1、函数一定一定要遵循先定义然后再调用的原则,也就是说调用函数,一定要先把函数定义出来才可以
# 2、函数在定义阶段只检测语法不会去执行代码
# 3、函数体代码只有在调用函数的时候才会被执行
调用函数的方法>>>:函数名加括号(当有参数的时候则传递参数)
# 4、函数名可以比喻成变量名指向的内存中值的位置,而函数名则指向的是函数体代码的位置
函数调用举例
# 先定义
def func():
print('have a good time')
# 再调用
func() # 这个过程就是在文件中找到函数体代码并执行

二、函数的分类
1 、内置函数
python解释器中提前定义好可以直接调用的函数
eg:len 、open...
2 、自定义函数
程序员直接编写的函数
1、无参函数
# 在函数定义时括号内没有参数
def index(): # (括号里面没有写东西,但括号必须要有)
print('放下屠刀')
# 在调用无参函数时括号里面也不需要写参数
index() # 结果为 放下屠刀
2、有参函数
# 在函数定义阶段括号内有参数>>>:类似于变量名
def index(b):
print('放下屠刀',b)
# 在有参函数调用时括号里面也必须加上参数
index('aaa') # 放下屠刀 aaa
3、空函数
# 在定义阶段时,函数体代码是用pass或者...占位,只是为了补全结构,本体没有含义
def index():
pass
index() # 在调用时,不会发生报错,但也没有内容
'''
在前期规划的时候可以使用空函数进行快速的罗列出程序中的各种功能,之后再去一步一步的补全各个功能
'''
# 编写一套机器人的程序
# 1、学习模块
def study():
pass
# 2、沟通模块
def connect():
pass
# 3、操控模块
def automaticity():
pass
三 、函数的返回值
# 函数的返回值就是调用函数之后返回的结果
返回值的关键字为:return
l1 = 'have a good time'
res = len(l1) # 将len函数的返回值赋值给了变量res
print(res)
# 如何获取函数的返回值
变量名 = 函数调用
#使用print打印之后,若没有使用return则出现的是none
def show():
print()
res = show()
print(res) # None
# 如何操作返回值
1、当函数代码没有使用return关键字时,返回值是None
def show():
print()
res = show()
print(res)
2、当函数体代码写了return关键字,但没有跟任何值时,返回值是None
def show():
print()
return()
res = show()
print(res)
3、当函数体代码写了return并且跟了数据时,那么返回的就是写的数据(可以是任意数据类型)
def show():
print()
l1 = 123
return l1
res = show()
print(res) # 返回值为123
# 再定义函数时,一定要控制缩进
4、return后面还可以跟多个值,使用逗号隔开 它就会自动组织成元组的形式,返回出去
# return后面空格加数据
def show():
print()
return 123, 'owen', 1234
res = show()
print(res) # (123, 'owen', 1234)
5、函数体代码遇到return会立刻结束函数运行
它就相当于循环体代码中的break
四、*函数的参数
1、函数的参数分为两大类
1.1、函数在定义阶段括号内写的参数,我们称之为'形式参数'简称为'形参'
1.2、函数在调用阶段写在括号里的参数,我们称之为'实际参数'简称为'实参'
2、形参与实参的关系
'形参类似于变量名,而实参类似于变量的值'
eg:def index(name):——name就是形参
print(name)
index('owen')——owen就是实参
# 在函数体代码运行期间,可以通过形参来直接找到实参
# 在调用函数的时候形参与实参暂时绑定在了一块,当函数结束运行时,会自动解除绑定
# 解除之后,形参name就处于一个空的状态,等待下一次的绑定
# 绑定过程中,实参数不能少于形参数,它们自定义是一对一的格式
五 、位置参数
位置形参:在函数定义阶段括号内从左到右依次填写的变量名
def index(name,age): # name和age就是位置形参
位置实参:在函数调用过程中,从左往右依次传入的真实数据
index('owen',20) # owen和20就是位置实参
- 位置参数的特征
1、位置形参与位置实参在绑定关系的时候就是按照从左往右的循序依次绑定
2、位置形参与位置实参的个数必须要一样
def index(name,age):
print(name,age)
index('owen',20) # owen 20
index('owen') # index() missing 1 required positional argument: 'age' 发生报错
六、关键字参数
使用关键字在实参中,指名道姓的和形参绑定,不在遵循从左到右的顺序
def index(name,age):
print(name,age)
index(name=20, age='owen') # 让name指向20,让age指向owen
index(name=20, 'owen') # 报错
index('owen', name='owen') # 报错,一个形参只能指向一个实参
index('owen',age=20) # owen 20 不会发生报错
七、默认参数
# 使用在形参中,在开始定义函数时给形参赋值了,在调用时如果没有给形参重新绑定值的话,它就会使用默认的参数
# 默认参数也打破了形参与实参之间个数必须相等的限制
# 默认参数必须定义在位置参数的后面
eg:
默认性别
如果是给男生使用的软件,它的系统默认性别就是男
如果是给女生使用的软件,系统默认性别就是女
- 操作试例
def register(name,age,gender='男'):
print("""
学生姓名:%s
学生年龄:%s
学生性别:%s
"""%(name,age,gender))
register('owen', 20)
# 学生姓名:owen
# 学生年龄:20
# 学生性别:男 (没有绑定,使用默认参数)
register('mary', 18, '女')
# 学生姓名:mary
# 学生年龄:18
# 学生性别:女
八、可变长参数(非常重要)
# 需要先定义一个函数,无论传多少位置实参,都可以正常执行
"""
*号在形参中
可以接收多余的位置参数,并组织成元组的形式,赋值给*号后面的变量名
"""
def func(l, *a):
print(l, a)
func(1) # 1 ()
func('owen', 123) # 'owen' (123,)
func(11.12, 'owen', 123) # 11.12 ('owen', 123)
"""
**号在形参中
用来接收多余的关键字参数,并且组织成字典的形式赋值给**后面的变量名
"""
def func(l, **a):
print(l, a)
func(1) # 1 {}
func(l='owen', age=12) # owen {'age': 12}
func(l=11.12, name='owen', age=23) # 11.12 {'name': 'owen', 'age': 23}
''' 使用**时,要用=来进行书写,也就是在字典增加键值对的方式'''
九、可变长形参
定义一个无论个数、数据类型的参数都可以执行的函数
def func(*a, **k):
print(a, k)
func() # () {} 一个元组,一个字典
func(1, name='owen') # (1,) {'name': 'owen'} 当小括号中只有一个值的时候,会被定义成其他数据类型,只有在它后面加个逗号,就被识别为元组
# 当不知道有多少个实参或什么类型的实参,可以使用这个方法
def index(*args, **kwargs):
print(args, kwargs)
十 、补充说明(*和**在实参中的用法)
def index(*args, **kwargs):
print(args, kwargs)
"""
*号在实参中可以将列表或者元组打散成位置参数一一传入
"""
def index(a, b, c, d):
print(a, b, c, d)
index(*[1, 2, 3, 4]) # 1 2 3 4
"""
**号在实参中将字典打散成关键字参数一一传入
"""
def index():
print(a, b, c, d)
index(**{'a':1, 'b':2, 'c':3, 'd':3}) # 1 2 3 4