函数基础——形参和实参

函数参数的两大分类

  • 形式参数:在函数定义阶段括号内声明的参数就叫形式参数,简称"形参",形参本质就是一个变量名,用来接收外部传来的值。
def func(a,b):
    pass
# 这里的a和b即形式参数,形参
  • 实际参数:在函数调用阶段括号号内传入的值,就叫实际参数,简称"实参",值可以是常量、变量、表达式或三者的组合。
func(1, 2)
# 这里的1和2就是实际参数
  • 形参和实参的关系:
    形参相当于变量名,实参相当于变量值;

    两者在函数调用阶段临时绑定,函数运行结束立马断开联系。

强调:形参的表现形式就一种,实参的表现形式有多种。

形参和实参的具体使用

位置参数

​ 从左往右依次写入的数据就是位置参数。

  • 位置形参:在定义函数的时候,从左往右依次写入的变量名就是位置形参。
  • 位置实参:在函数调用阶段,从左往右依次写入的变量值就是位置实参。
  • 位置形参和位置实参的关系:位置实参从左往右依次传递给位置实参(一一对应)。

练习:

# 写一个可以比较两个数字大小的函数,返回最大值	
    def my_max(a, b):
        print(a, b)
        if a > b:
            return a
        else:
            return b

    res = my_max(1, 2)
    print(res)
    

	my_max(b=1, a=2)  # 关键字参数
    通过形参名=变量值的形式传递
关键字参数

​ 通过 形参名=变量值(key=value)的形式传值的是关键字参数。

  • 关键字形参:在函数定义阶段,参数有默认值时才使用。
  • 关键字实参:在函数调用阶段,通过k:v形式进行传值。

强调:在调用函数时,实参也可以是按位置或按关键字的混合使用,但必须保证关键字参数在位置参数后面,且不可以对一个形参重复赋值

默认参数

​ 在函数定义阶段,就已经为形参赋值,这类形参称为默认参数。

注意:

  • 默认参数必须在位置参数之后。
  • 默认参数的值在函数定义阶段被赋值一次。
  • 默认参数的值通常应设置为不可变类型。
  • 在调用阶段,如果为默认参数传递值,就使用传的值,如果没有传值,就使用默认值。

练习1:用户注册功能

def register(name, age, gender='male'):
    print('%s:%s:%s' % (name, age, gender))


register('mary',18,'female')  # 为默认参数传值了,就使用所传的值

练习2:

x = 100
def index(a, b, c=x):
    print(a, b, c)
    
x = 200
index(1, 2)

# 结果c的值为100,因为默认参数在函数定义的时候已经确定了
可变长参数

​ 在函数调用阶段,实参的个数不固定,如果要传很多,就不能在定义阶段挨个对应,需要用到可变长参数。

  • 可变长的位置参数:如果在最后一个形参的前面加上*号,就表示这个参数为可变长的位置参数,在调用函数时,溢出的位置实参,都会被该参数接收,以元组的形式保存下来赋值给该形参。

    def index(x, y, *a):
        print(x, y)
        print(a)
    
    index(1, 2, 3, 4, 5, 6, 7, 8)
    # x = 1  y = 2  a = (3,4,5,6,7,8)
    
  • 可变长的关键字参数:如果在最后一个形参的前面加上**号,就表示这个参数为可变长的关键字参数,在调用函数时,溢出的关键字实参,都会被该参数接收,以字典的形式保存下来赋值给该形参。

    def index(a, **x):
        print(x)
    
    index(a=1, b=2, c=3)  # x = {'b': 2, 'c': 3}
    
  • 可变长的位置参数和关键字参数同时使用:

    '''
        - 默认参数只要不放在**后面都可以
        - *号后面和**号后面的变量名可以任意命名,但是,在python中推荐使用
                *args   => arguments 位置参数
                **kwargs  => keyword arguments  关键字参数
            
            def func(a, b, c, *args, **kwargs):
            	pass
    '''
    
*号和**号在实参中的使用
  • *号在实参中的使用
def index(a, b, c):
    print(a, b, c)

l = [11, 22, 33]
index(*l)  # 等同于index(11, 22, 33)
  • **号在实参中的使用
def func(username, password):
    print(username, password)

d = {'username': 'mark', 'password': 222}
func(**d)  # 等同于func(username='mark',password=222)
func(username='mark', password=222)
组合使用

​ 以上所有参数可以任意组合使用,但定义顺序必须是:位置参数、默认参数、*args、**kwargs。

  • 7
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当调用一个函数时,需要传递给函数的参数被称为实参,而函数定义中接收参数的变量被称为形参形参实参之间需要具有兼容性,否则在函数调用时就会导致错误。 形参实参的不兼容可能出现在不同的情况下: 1. 数据类型不匹配:当函数定义中的形参类型与实参传递的类型不一致时,会发生不兼容的情况。例如,函数定义中形参为整数,但实参传递的是字符串,就会导致不兼容。 2. 参数个数不匹配:当函数定义中的形参数量与实参传递的数量不一致时,也会发生不兼容的情况。例如,函数定义中形参有两个,但实参只传递了一个,就会导致不兼容。 3. 参数顺序不匹配:当函数定义中的形参顺序与实参传递的顺序不一致时,同样会发生不兼容的情况。例如,函数定义中第一个形参要求传递的是字符串,而实参传递的是整数,就会导致不兼容。 为了解决形参实参不兼容的问题,需要对函数调用进行修正。可以通过以下方式解决: 1. 确保传递的实参类型与函数定义中形参类型一致,或者进行类型转换。 2. 确保传递的实参数量与函数定义中形参数量一致。 3. 确保传递的实参顺序与函数定义中形参顺序一致。 总之,在函数调用时,形参实参需要保持兼容,否则会导致编译错误或运行时错误。修正不兼容的形参实参可以保证函数能够正常工作并返回正确的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值