一、5 种参数一句话看懂
-
位置参数
必须传,按顺序对应
def power(x, n): -
默认参数
可传可不传,不传用默认值
def power(x, n=2):⚠️ 必须用不可变对象(str、None、数字),不能用 list!
-
可变参数 *args
传任意多个数,自动变成 tuple
def calc(*numbers): -
** 关键字参数 kw
传任意键值对,自动变成 dict
def person(name, age, **kw): -
命名关键字参数
限制只能传指定名字的参数
def person(name, age, *, city, job):
二、最简单记忆口诀
*args→ 多值打包成 tuple**kw→ 键值对打包成 dict- 默认参数用 不可变对象
- 顺序:必选 → 默认 → 可变 → 命名关键字 → 关键字
三、课后练习题(必做)
题目:把只能算两个数乘积的函数,改成接收 1 个或多个数相乘。
原函数:
def mul(x, y):
return x * y
正确答案(用可变参数 *args)
def mul(*args):
result = 1
for n in args:
result *= n
return result
逐行解释
*args接收任意多个数字- 先把
result设为 1 - 循环把每个数字乘进去
- 返回最终乘积
运行测试,会输出:
测试成功!
=分割线练习题
练习题 1(位置参数 + 默认参数)
定义一个函数 greet:
- 接收两个参数:
name:必传(位置参数)word:问候语,默认值为'你好'
- 函数打印:
word, name!
测试:
greet("小明")
greet("小红", "早上好")
代码
def greeet(name):
print("hello",name)
greeet('小明')
练习题 2(可变参数 *args)
定义一个函数 sum_num,可以接收任意多个数字 ,返回它们的总和。
测试:
print(sum_num(1, 2, 3)) # 6
print(sum_num(10, 20)) # 30
print(sum_num(5)) # 5
代码
# ==========❌️
# num=0
# def sum_num(*args):
# for i in range(sum_num()):
# num=num+i
# print(num)
# sum_num(1,2,3)
# 这里有 3 个关键错误,我一个个说:
# 1. range(sum_num()) 完全不对----args才是你传进来的数字:(1,2,3)---应该循环 args,不是 sum_num()
# num 要定义在函数里面----你现在写在函数外面,会出问题。变量写在函数外面,是所有人共用的; 写在函数里面,是这个函数自己私用的。
# ======✅️
def sum_num(*args):
sum=0
for i in args:
sum=sum+i
print(sum)
sum_num(1,2,3)
#函数外面的变量:每次调用不会清零,会一直累加 → 错;;函数里面的变量:每次调用都会重新开始 → 对
练习题 3(关键字参数 **kw)
定义一个函数 student:
-
必选参数:
name,age -
关键字参数:
**info -
函数内部打印:
姓名:xxx 年龄:xxx 其他信息:xxx
测试:
student("张三", 18)
student("李四", 20, city="上海", gender="男")
代码
def student(name,age,**info):#**info关键字参数,里面存的是字典,即key和value键值组合
print('姓名:', name)
print('年龄:', age)
for key,value in info.items(): #info.items():它会把字典变成类似下面这种一对一对的形式:
print(key,':',value)#关键字参数显示的时候,键值之间加冒号
print('-'*20) #隔开每次循环打印结果
student('张三',18)
student('李四',20,city='上海',gender='男')
练习题4
定义一个函数 avg(),可以接收任意多个数字 ,返回这些数字的平均值。
要求:
- 使用
*args - 先求和,再除以数字的个数
- 最后打印结果
测试:
avg(1, 2, 3) # 平均值 2
avg(10, 20, 30, 40) # 平均值 25
代码
# ============✅️
def avg(*args):
sum = 0
count = len(args)
for i in args:
sum = sum + i
print(sum/count)
avg(1,2,3)
avg(10,20,30,40)
# 只需要做一次的事情,放循环外面。每个数都要做的事情,放循环里面。
# 这件事要做几次?1 次 → 放外面 多次 → 放里面
==分割线=什么是关键字参数?
info 就是一个 "字典 dict"
**info 的作用只有一句话:
把你传进去的所有 "关键词 = 值",打包成一个字典。
1. 先看调用
student("李四", 20, city="上海", gender="男")
这里:
city="上海"gender="男"
这些带名字的参数,会自动打包成一个字典:
info = {
"city": "上海",
"gender": "男"
}
2. 函数里怎么用?
def student(name, age, **info):
print(name)
print(age)
print(info) # 直接打印这个字典
输出:
李四
20
{'city': '上海', 'gender': '男'}
3. 和 *args 对比一下(超级好记)
*args→ 打包普通数字 / 值 → 变成 tuple 元组**info→ 打包key=value→ 变成 dict 字典
4. 什么时候用 **info?
当你想传不确定数量的、带名字的信息时用:
- 地址
- 性别
- 电话
- 班级
一句话终极总结
**info
= 接收一堆 a=1, b=2
= 自动变成字典 {'a':1, 'b':2}