Python 中函数练习题
一、形参与实参、定义与调用
练习 1.1 定义带一个形参的函数
题目:
定义一个函数 greet(name),函数体内打印“你好,xxx”(xxx 为传入的 name)。分别用实参 "小明" 和 "小红" 各调用一次,并说明哪是形参、哪是实参。
参考答案:
def greet(name): # name 是形参
print("你好,", name)
greet("小明") # "小明" 是实参
greet("小红") # "小红" 是实参
要点: 定义时括号里的是形参,调用时传入的是实参。
练习 1.2 两个形参:位置实参
题目:
定义函数 describe_pet(animal, name),打印“我有一只 xxx,它叫 yyy”。用位置实参调用两次:第一次动物为 "狗"、名字为 "旺财";第二次动物为 "猫"、名字为 "咪咪"。
参考答案:
def describe_pet(animal, name):
print("我有一只", animal, ",它叫", name)
describe_pet("狗", "旺财")
describe_pet("猫", "咪咪")
练习 1.3 关键字实参
题目:
使用上一题的 describe_pet(animal, name),用关键字实参调用一次,故意把顺序写成 name="旺财", animal="狗",验证输出是否正确。
参考答案:
def describe_pet(animal, name):
print("我有一只", animal, ",它叫", name)
describe_pet(name="旺财", animal="狗") # 输出:我有一只 狗 ,它叫 旺财
二、默认值
练习 2.1 带默认值的形参
题目:
定义函数 greet(name, greeting="你好"),打印“greeting, name”。要求:不传第二参数时使用默认 "你好";传了第二参数则使用传入的值。调用:greet("小明") 和 greet("小红", "早上好")。
参考答案:
def greet(name, greeting="你好"):
print(greeting + "," + name)
greet("小明") # 你好,小明
greet("小红", "早上好") # 早上好,小红
练习 2.2 默认值实现“可选参数”
题目:
定义函数 intro(name, age, city=None)。若 city 为 None,只打印“我是 xxx,今年 y 岁”;若传了 city,则打印“我是 xxx,今年 y 岁,来自 zzz”。调用两次:一次不传 city,一次传 city。
参考答案:
def intro(name, age, city=None):
if city is None:
print("我是", name, ",今年", age, "岁")
else:
print("我是", name, ",今年", age, "岁,来自", city)
intro("小明", 18)
intro("小红", 19, "北京")
三、返回值
练习 3.1 返回一个值
题目:
定义函数 add(a, b),返回 a + b 的结果。调用 add(3, 5) 并将返回值赋给变量 result,打印 result。
参考答案:
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 8
练习 3.2 返回多个值
题目:
定义函数 get_min_max(lst),接收一个至少有两个元素的数字列表,返回列表中的最小值和最大值(用 return 最小值, 最大值)。调用时用两个变量接收,并分别打印。
参考答案:
def get_min_max(lst):
return min(lst), max(lst)
a, b = get_min_max([3, 1, 4, 1, 5])
print("最小值:", a, "最大值:", b) # 最小值: 1 最大值: 5
四、返回字典
练习 4.1 函数返回字典
题目:
定义函数 build_user(username, age),返回一个字典,包含键 "username" 和 "age",值分别为传入的两个参数。调用并打印返回的字典。
参考答案:
def build_user(username, age):
return {
"username": username,
"age": age,
}
user = build_user("xiaoming", 18)
print(user) # {'username': 'xiaoming', 'age': 18}
练习 4.2 返回字典且含可选字段
题目:
定义函数 build_user(username, age, city=None)。返回的字典一定包含 username、age;若传了 city,则字典中还要包含键 "city"。调用两次:一次不传 city,一次传 city,分别打印返回结果。
参考答案:
def build_user(username, age, city=None):
user = {"username": username, "age": age}
if city is not None:
user["city"] = city
return user
print(build_user("xiaoming", 18)) # {'username': 'xiaoming', 'age': 18}
print(build_user("xiaohong", 19, "北京")) # {'username': 'xiaohong', 'age': 19, 'city': '北京'}
五、传递列表
练习 5.1 遍历列表实参
题目:
定义函数 print_names(names),接收一个字符串列表,逐行打印“你好,xxx”。用列表 ["小明", "小红", "小刚"] 调用一次。
参考答案:
def print_names(names):
for name in names:
print("你好,", name)
print_names(["小明", "小红", "小刚"])
练习 5.2 在函数内修改列表
题目:
定义函数 append_hello(lst),在传入的列表末尾追加字符串 "hello"(不 return)。调用前 a = [1, 2, 3],调用 append_hello(a) 后打印 a,观察原列表是否被修改。
参考答案:
def append_hello(lst):
lst.append("hello")
a = [1, 2, 3]
append_hello(a)
print(a) # [1, 2, 3, 'hello']
要点: 传递的是引用,函数内对列表的修改会影响调用者的列表。
六、禁止函数修改列表(传副本)
练习 6.1 传副本保护原列表
题目:
使用上一题的 append_hello(lst)。调用时改为传入 a 的副本(用切片 a[:] 或 list(a)),再打印 a,确认原列表没有被修改。
参考答案:
def append_hello(lst):
lst.append("hello")
a = [1, 2, 3]
append_hello(a[:]) # 传副本
print(a) # [1, 2, 3]
七、任意数量实参(*args 与 **kwargs)
练习 7.1 使用 *args 求任意个数之和
题目:
定义函数 sum_all(*args),接收任意多个数字(位置实参),返回它们的和。调用:sum_all(1, 2, 3) 和 sum_all(10, 20, 30, 40),分别打印结果。
参考答案:
def sum_all(*args):
total = 0
for n in args:
total = total + n
return total
print(sum_all(1, 2, 3)) # 6
print(sum_all(10, 20, 30, 40)) # 100
练习 7.2 使用 **kwargs 组装字典
题目:
定义函数 build_profile(**kwargs),把传入的所有关键字实参放进一个字典并返回。调用:build_profile(name="小明", age=18, city="北京"),打印返回的字典。
参考答案:
def build_profile(**kwargs):
return dict(kwargs)
p = build_profile(name="小明", age=18, city="北京")
print(p) # {'name': '小明', 'age': 18, 'city': '北京'}
或直接:
def build_profile(**kwargs):
return kwargs
练习 7.3 区分 *args 与 **kwargs
题目:
定义函数 show(a, b, *args, **kwargs),在函数内依次打印 a、b、args、kwargs。调用:show(1, 2, 3, 4, x=5, y=6),写出预期输出并说明 args 和 kwargs 分别得到什么类型、什么内容。
参考答案:
def show(a, b, *args, **kwargs):
print("a =", a)
print("b =", b)
print("args =", args)
print("kwargs =", kwargs)
show(1, 2, 3, 4, x=5, y=6)
预期输出:
a = 1
b = 2
args = (3, 4)
kwargs = {'x': 5, 'y': 6}
要点: *args 接收多余的位置实参,得到元组;**kwargs 接收多余的关键字实参,得到字典。
八、综合练习
练习 8.1 位置 + 默认值 + 返回值
题目:
定义函数 describe(name, animal="狗", age=1),返回一个字符串:"我有一只{animal},它叫{name},今年{age}岁。"。调用三次:
① describe("旺财")
② describe("咪咪", "猫")
③ describe("小白", "兔", 2)
分别打印返回值。
参考答案:
def describe(name, animal="狗", age=1):
return "我有一只" + animal + ",它叫" + name + ",今年" + str(age) + "岁。"
print(describe("旺财"))
print(describe("咪咪", "猫"))
print(describe("小白", "兔", 2))
练习 8.2 列表 + 返回新列表(不修改原列表)
题目:
定义函数 add_suffix(names, suffix),接收一个字符串列表和一个后缀字符串,返回一个新列表,其中每个元素是原列表对应元素加上 suffix(不修改原列表)。例:add_suffix(["a", "b"], "_ok") 返回 ["a_ok", "b_ok"]。调用后分别打印原列表和返回的新列表,确认原列表未变。
参考答案:
def add_suffix(names, suffix):
result = []
for name in names:
result.append(name + suffix)
return result
lst = ["a", "b"]
new_lst = add_suffix(lst, "_ok")
print("原列表:", lst) # 原列表: ['a', 'b']
print("新列表:", new_lst) # 新列表: ['a_ok', 'b_ok']
练习 8.3 综合:*args + 返回值 + 字典
题目:
定义函数 info(**kwargs),接收任意个关键字实参,返回一个字典,内容就是传入的键值对。再定义函数 merge_two(d1, d2),接收两个字典,返回一个新字典,包含 d1 和 d2 的所有键值对(若键重复,以 d2 为准)。调用示例:merge_two(info(a=1, b=2), info(b=3, c=4)),打印返回结果。
参考答案:
def info(**kwargs):
return kwargs
def merge_two(d1, d2):
result = dict(d1)
result.update(d2)
return result
print(merge_two(info(a=1, b=2), info(b=3, c=4))) # {'a': 1, 'b': 3, 'c': 4}