Python-函数的传参
函数的传参(把数据传给函数)
函数的形参(接收函数调用的数据)
Python函数的参数传递
- 传递方式
- 位置传递
- 序列传参
- 关键字传参
- 字典关键字传参
下面是函数的实参传递:
位置传参:
- 实际参数(实参) 的对应关系与形式参数的对应关系是按位置来一次对应的
- 说明:
- 实参和形参通过位置进行传递和匹配
- 实参的个数 必须与形参的个数相同
示例:
# 此示例示意位置传参
def myfun(a, b, c):
'''这是一个函数传参的示例'''
print('a的值是:', a)
print('b的值是:', b)
print('c的值是:', c)
myfun(1, 2, 3)
myfun(4, 5, 6)
myfun("ABC", [1,2,3], (44,55,66))
序列传参:
- 序列传参是指函数在调用过程中用*将序列拆解后按位置进行传递的传参方式
- 说明:
- 序列传参时,序列拆解的位置将于形参一一对应
示例:
# 此示例示意 序列传参
def myfun(a, b, c):
'''这是一个函数传参的示例'''
print('a的值是:', a)
print('b的值是:', b)
print('c的值是:', c)
L = [11, 22, 33]
# myfun(L[0], L[1], L[2])
myfun(*L)
# myfun(L)
``
**关键字传参:**
- 关键字传参是指传参时,按着形参名称给形参赋值,实参和形参按名称匹配
- 说明:
- 可以不按位置进行匹配
**示例:**
此示例示意 关键字传参
def myfun(a, b, c):
‘’‘这是一个函数传参的示例’’’
print(‘a的值是:’, a)
print(‘b的值是:’, b)
print(‘c的值是:’, c)
myfun(c=33, b=22, a=11)
myfun(b=222, c=333, a=111)
``
字典关键字传参:
- 是指实参为字典,将字典用** 拆解后进行关键字传参的传递方式
- 说明:
- 字典的键名和形参名必须一致
- 字典的键名必须为合法的标示符命名规则的字符串
- 字典的键名要在形参中存在
示例:
# 此示例示意 字典关键字传参
def myfun(a, b, c):
'''这是一个函数传参的示例'''
print('a的值是:', a)
print('b的值是:', b)
print('c的值是:', c)
d = {'a':100, 'c':300, 'b':200}
# myfun(a=d['a'], c=d['c'], b=d['b'])
myfun(**d) # 等同于上面一条语句
# myfun(d) # 出错
函数的综合传参
- 函数的传参方式在能确定形参能唯一匹配到相应实参的情
况下可以任意组合 - 函数的位置传参要先于关键字传参
示例:
def myfun(a, b, c):
pass
myfun(100, *[200, 300])
myfun(100, *"BC")
myfun(*"AB", 300)
myfun(*[100], 200, *[300])
myfun(100, c=300,b=200)
myfun(a=100, 200, c=300) # 错误的
myfun(100, **{'c':300, 'b':200})
myfun(100, **{'c':300}, b=200)
myfun(100, b=200, **{'c':300})
下面是函数的形参:
函数的缺省参数
- 语法:
- def 函数名(形参名1=默认实参1, 形参名2=默认实参2,
形参名3=默认实参3, …)
- def 函数名(形参名1=默认实参1, 形参名2=默认实参2,
- 作用:
- 让函数的调用者少传递参数来调用函数
- 说明:
- 缺省参数必须自右至左依次存在,如果一个参数有缺省
参数, 则其右侧的所有参数都必须有缺省参数 - 缺省参数可以有0个,1个或多个,甚至全部都有缺省参数
- 缺省参数必须自右至左依次存在,如果一个参数有缺省
示例:
如:
def fn(a, b=10, c): # 错误
pass
def fn(a=0, b=None, c=False): # 是这对的
pass
函数的可变实参和不可变实参的传递
- 说明:
- 当一个可变对象通过函数实参传入函数内时,在函数内
可以通过局部变量来操作可变对象(列表,字典,集合…)
- 当一个可变对象通过函数实参传入函数内时,在函数内
面试题:
- 试运行以下程序的结果是什么, 为什么?
L = [1, 2]
def fn(a, lst=[]):
lst.append(a)
print(lst)
fn(3, L) # [1, 2, 3]
fn(4, L) # [1, 2, 3, 4]
fn(5) # [5]
fn(6) # [5, 6]
fn(7) # [5, 6, 7]
函数形参的定义方式
- 位置形参
- 星号元组形参
- 命名关键字形参
- 双星号字典形参
位置形参:
- 语法:
- def 函数名(形参变量1, 形参变量2, …):
- 语句块
- def 函数名(形参变量1, 形参变量2, …):
星号元组形参
语法:
- def 函数名(*元组形参名):
- 语句块
作用:
- 收集多余的位置传参
说明:
- 元组形参名一般命名为’args’
- *元组形参一个函数只能有一个
命名关键字形参
语法:
- def 函数名(*,命名关键字形参1, 命名关键字形参2,…):
- 语句块
或
- 语句块
- def 函数名(*args,命名关键字形参1, 命名关键字形参2,…):
- 语句块
作用:
- 强制所有的命名关键字形参都必须用关键字传参或字典关
键字传参
示例:
# 此示例示意命名关键字形参
def func(a, b, *, c, d):
print(a, b, c, d)
# func(1, 2, 3, 4) # 传参失败
func(1, 2, c=30, d=40)
func(a=10, b=20, c=30, d=40)
func(1, 2, **{'d':400, 'c':300})
双星号字典形参:
语法:
- def 函数名(**字典形参名):
- 语句块
作用:
- 收集多余的关键字传参
说明:
- 字典形参名一般命名为’kwargs’
- 一个函数内字典形参最多只有一个
示例:
# 此示例示意双星号字典形参
def func(**kwargs):
print("关键字传参的个数是:", len(kwargs))
print('kwargs=', kwargs)
func(name="张老师", age=35, address="朝阳区")
def func(*,a, b, **kwargs):
print("关键字传参的个数是:", len(kwargs))
print('kwargs=', kwargs)
func(a=1, b=2, c=3, d=4)
函数的形参说明:
- 位置形参,缺省参数,星号元组形参,双星号字典形参可以混
合使用
函数形参自左至右的定义顺序为:
- 位置形参
- 星号元组形参
- 命名关键字形参
- 双星号字典形参
示例:
def fn(a, b, *args, c, **kwargs):
pass
fn(1, 2, 3, 4, c=30, d=40, e=50)
函数的不定长参数:
- 有两种: 星号元组形参,双星号字典形参
- 用不定长参数可以接收任意的传参
如:
def fn(*args, **kwargs):
print(args, kwargs)
全局变量和局部变量
- 局部变量
- 定义在函数内部的变量称为局部变量(函数的形参也是
局部变量) - 局部变量只能在函数内部使用
- 局部变量在函数调用时才能创建,在函数调用之后会
自动销毁
- 定义在函数内部的变量称为局部变量(函数的形参也是
- 全局变量
- 定义在函数外部,模块内部的变量称为全局变量
- 全局变量所有的函数都可以直接访问(但函数内部不能将
其直接赋值)
说明:
- 函数内部赋值语句不会对全局变量造成影响