CC++ & Algorithm

形参与实参

困难0
语言版本:C++
概述:形参是函数定义时的“占位符”,实参是调用时给的具体内容,两者配合让函数更通用。

形参与实参:让函数“活”起来的秘密

你有没有见过那种“万能”的填空模板?比如:“今天是__月__日,天气__。” 等你填上具体的数字和词语,它就变成了一句完整的话。在编程里,函数也能像这样的模板一样工作,而形参实参就是让函数从“模板”变成“具体功能”的关键。

形参是什么?函数的“空盒子”

形参(形式参数) 是在定义函数时,写在括号里的变量名。它不保存具体的值,而是一个“占位符”,告诉你将来这里会接收一个值。

比如下面这个函数,用来欢迎某个人:

def greet(name):   # name 是形参,它是个空盒子
    print("你好," + name + "!")

这里的 name 就是形参。它还没装东西,像你文具盒里的一个空位,等着放笔。

实参是什么?你放进去的“具体物品”

实参(实际参数) 是你在调用函数时,真正写在括号里的具体值或变量。实参会“跑”进形参的盒子里。

greet("小明")   # "小明" 是实参,会被放入 name 盒子
greet("小红")   # "小红" 是另一个实参

调用 greet("小明") 时,Python 会把 "小明" 这个字符串赋给形参 name,然后函数内部就能用 name 来工作了。

参数传递的真实过程:像“抄作业”

你可以想象这样一个过程:你在一个函数外面有一个值(实参),函数里面有一个空位置(形参)。调用时,Python 会把这个值复制一份,塞进那个空位置里。所以函数内部对形参的修改,通常不会影响外边的变量(除非是可变对象,但那是后面的事)。

来看一个更贴近生活的例子:计算买零食的总价。

def total_price(price, count):   # price: 单价, count: 数量, 都是形参
    return price * count

apple_price = 3   # 苹果单价 3 元
apple_count = 5   # 买了 5 个
cost = total_price(apple_price, apple_count)  # 实参是变量
print("总价:", cost)  # 输出 15

这里 pricecount 是形参,apple_priceapple_count 是实参。调用时,price 得到 3count 得到 5

多个参数:顺序和数量必须匹配

函数可以有多个形参,调用时提供的实参按顺序一一对应。就像你填报名表:姓名、班级、学号——顺序乱了,表就填错了。

def exam_result(name, chinese, math):   # 形参:名字、语文分、数学分
    print(name + " 的总分是", chinese + math)

exam_result("小刚", 90, 85)   # 实参:小刚, 90, 85 → 输出总分 175
exam_result(85, "小刚", 90)   # 错误!顺序乱了,名字变成了85,会报错或出奇怪结果

注意:实参的数量必须和形参一致,多了或少了都会出错。

实参可以是变量,也可以直接写值

刚才已经用变量做实参了。当然也可以用字面量:

exam_result("小红", 88, 92)  # 直接写数字

但用变量的好处是更灵活:你可以先修改变量的值,再调用函数,函数就会得到新的结果。

常见错误:新手容易踩的坑

1. 忘记传参

def say_hello(name):
    print("你好", name)

say_hello()  # TypeError: missing 1 required positional argument

错误:调用时括号里是空的,形参 name 没收到值。

2. 形参和实参名字混淆

有的同学以为函数内部形参的名字必须和外部变量名字一样。其实不需要,只要位置对应就行。

def show_score(s):
    print("分数:", s)

my_score = 95
show_score(my_score)   # 实参 my_score 传给形参 s,名字不同但没问题

3. 传参顺序搞反

在多参数函数中,如果实参顺序写反了,函数可能不会报错,但结果完全错误。

def divide(a, b):  # 返回 a/b
    return a / b

print(divide(10, 2))   # 正确:5.0
print(divide(2, 10))   # 错误:0.2,以为是10/2呢

完整可运行示例:用函数帮妈妈算买菜钱

下面是一个完整的程序,包含函数定义、形参和实参的使用,以及输入输出。

# 函数:计算买菜总价
def veg_price(name, weight_price, weight):   # name: 菜名, weight_price: 每斤单价, weight: 斤数
    total = weight_price * weight
    print(name + " 的总价是:", total, "元")
    return total

# 主程序
vege1_name = "西红柿"          # 菜名
vege1_price_per_jin = 3.5     # 每斤3.5元
vege1_weight = 2              # 买了2斤
cost1 = veg_price(vege1_name, vege1_price_per_jin, vege1_weight)  # 调用

vege2_name = "黄瓜"
vege2_price_per_jin = 2.0
vege2_weight = 1.5
cost2 = veg_price(vege2_name, vege2_price_per_jin, vege2_weight)

print("买菜一共花了:", cost1 + cost2, "元")

运行结果:

西红柿 的总价是: 7.0 元
黄瓜 的总价是: 3.0 元
买菜一共花了: 10.0 元

总结:形参是函数设计时的“类型要求”,实参是调用时的“实际数据”

  • 形参:定义函数时写的变量,告诉调用者“你需要给我什么类型、多少数据”。
  • 实参:调用函数时给出的具体值,决定了函数这一次的运算结果。

理解形参和实参,是学会使用函数的第一步。下一步你可以学习默认参数(给形参一个默认值)、关键字参数(打破顺序限制)和可变参数(接收任意多个实参),这些都会让你的函数变得更灵活。

相关指引推荐

  • 默认参数:如 def greet(name, greeting="你好")
  • 返回值:return 带你走进更强大的函数
  • 作用域:形参只在函数内部有效

继续加油,你已经掌握了一个很重要的编程技巧!

例题精讲

1单选题

在Python中,关于形参(parameter)和实参(argument)的说法,正确的是?

A形参在函数调用时分配内存,实参在函数定义时分配内存
B形参是函数定义时使用的参数名,实参是函数调用时传入的具体值
C形参的值在函数内部不能被修改
D实参必须是常量,不能是变量
2单选题

执行以下代码后,输出结果是什么? def f(a, b=[]): b.append(a) return b print(f(1)) print(f(2, [])) print(f(3))

A[1] [2] [3]
B[1] [2] [1, 3]
C[1] [2] [1, 3]
D[1] [2, 1] [3]
3判断题

在Python中,函数定义时的形参名和调用时传入的实参变量名可以相同,它们代表的是同一个变量。

4判断题

如果函数定义时形参没有默认值,那么在调用时该参数必须提供对应的实参,否则会报错。

5填空题
请补全以下代码,要求定义一个函数`multiply`,该函数接收一个形参`factor1`和一个带有默认值1的形参`factor2`,返回两个数的乘积。然后在主程序中调用该函数,传入实参`5`和`3`,输出结果。

def multiply(factor1, factor2=1):
    return ___1___

result = multiply(5, 3)
print(result)