14.Python中函数练习题

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)。若 cityNone,只打印“我是 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)。返回的字典一定包含 usernameage;若传了 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),在函数内依次打印 abargskwargs。调用:show(1, 2, 3, 4, x=5, y=6),写出预期输出并说明 argskwargs 分别得到什么类型、什么内容。

参考答案:

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}

发表评论