django33全栈班2025年015 函数和大量练习题

134 阅读17分钟

前言

嘿,同学们!太棒啦 我们终于成功地完成了基础语法和常用数据结构的学习啦 这可是一个了不起的阶段性胜利呢 就像我们攀登一座高山,已经成功跨越了重要的一段路程哦 接下来呢,我们就要向着新的目标迈进啦 我们只需要把函数和面向对象这两部分知识学好,就可以慢慢开启新的征程,尝试去完成更大、更复杂的项目啦 是不是很让人兴奋呢 这节课呀,就让我们一起开启新的学习之旅,来学习函数这个重要的知识点吧 函数在编程中可是起着至关重要的作用哦,它就像一个个神奇的工具,能够帮助我们更好地组织代码,让我们的程序更加模块化、更加易于维护和扩展呢 让我们以饱满的热情投入到这节课的学习中,一起探索函数的奥秘,为我们之后完成更加出色的项目做好充足的准备吧 相信大家在这个过程中会不断进步,不断成长,一起向着更高的编程水平迈进哦 让我们一起加油,一起在编程的世界里继续探索,创造更多的精彩吧!

什么是函数

在 Python 中,函数是一段可重复使用的代码块,它接受零个或多个输入参数,并根据这些参数执行特定的操作,最终可能返回一个结果。函数是 Python 编程中的核心概念之一,具有以下重要特点和优势:

一、函数的定义

使用 def 关键字来定义函数,其基本结构如下:

def function_name(parameters):
    # 函数体
    # 这里可以包含一系列操作和语句
    return result

其中:

  • def:函数定义的关键字。
  • function_name:函数的名称,命名遵循 Python 的命名规则,通常使用小写字母和下划线,应具有描述性。
  • parameters:函数的参数列表,是函数接收的输入,可以是零个或多个,多个参数之间用逗号分隔。这些参数是函数内部使用的变量,用于传递数据。
  • return:可选关键字,用于返回函数的结果。函数可以不返回任何结果,在这种情况下,可以省略 return 语句,或者使用 return 而不跟任何表达式。

二、函数的参数

  • 位置参数

    def add_numbers(a, b):
        return a + b
    result = add_numbers(3, 5)
    print(result)  # 输出: 8
    

    调用函数时,按照参数的定义顺序传递参数,即 a 接收第一个值,b 接收第二个值。

  • 关键字参数

    def add_numbers(a, b):
        return a + b
    result = add_numbers(b=5, a=3)
    print(result)  # 输出: 8
    

    调用函数时,通过 parameter_name=value 的形式传递参数,不依赖于参数的位置。

  • 默认参数

    def greet(name="World"):
        return f"Hello, {name}!"
    print(greet())  # 输出: Hello, World!
    print(greet("Alice"))  # 输出: Hello, Alice!
    

    在函数定义时,可以为参数指定默认值,调用函数时,如果不传递该参数,将使用默认值。

  • 可变参数(*args)

    def print_arguments(*args):
        for arg in args:
            print(arg)
    print_arguments(1, 2, 3)
    

    使用 *args 表示接收任意数量的位置参数,args 是一个元组,包含所有传递的位置参数。

  • **可变关键字参数(kwargs)

    def print_keyword_arguments(**kwargs):
        for key, value in kwargs.items():
            print(f"{key}: {value}")
    print_keyword_arguments(name="Alice", age=25)
    

    使用 **kwargs 表示接收任意数量的关键字参数,kwargs 是一个字典,包含所有传递的关键字参数。

三、函数的返回值

  • 函数可以使用 return 语句返回一个值,该值可以是任何 Python 对象,如数字、字符串、列表、元组、字典或另一个函数。

    def add_and_multiply(a, b):
        sum_result = a + b
        product_result = a * b
        return sum_result, product_result
    result = add_and_multiply(3, 4)
    print(result)  # 输出: (7, 12)
    
  • 函数可以有多个 return 语句,一旦执行到 return 语句,函数将立即终止并返回结果。

    def check_number(n):
        if n > 0:
            return "Positive"
        elif n < 0:
            return "Negative"
        else:
            return "Zero"
    print(check_number(5))  # 输出: Positive
    

四、函数的作用

  • 代码复用:将代码块封装在函数中,避免重复编写相同的代码,提高代码的复用性和可维护性。

    def calculate_area(radius):
        return 3.14 * radius ** 2
    area1 = calculate_area(5)
    area2 = calculate_area(10)
    
  • 抽象和模块化:将复杂的程序分解为多个小的函数,每个函数负责一个独立的任务,使程序结构更清晰,易于理解和维护。

    def process_data(data):
        cleaned_data = clean_data(data)
        processed_data = transform_data(cleaned_data)
        return analyzed_data(processed_data)
    

五、函数的嵌套

函数可以嵌套定义,内部函数可以访问外部函数的变量,但外部函数不能访问内部函数的变量。

def outer_function():
    def inner_function():
        print("This is the inner function.")
    inner_function()
    print("This is the outer function.")
outer_function()

六、高阶函数

函数可以作为参数传递给其他函数,也可以作为结果返回,这样的函数称为高阶函数。

def apply_operation(func, a, b):
    return func(a, b)

def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

print(apply_operation(add, 3, 4))  # 输出: 7
print(apply_operation(multiply, 3, 4))  # 输出: 12

七、匿名函数(Lambda 函数)

使用 lambda 关键字创建匿名函数,通常用于简单的操作,如作为参数传递给高阶函数。

square = lambda x: x ** 2
print(square(5))  # 输出: 25

通过掌握函数的定义、参数、返回值、作用以及各种高级特性,你可以更加灵活地组织和编写 Python 代码,将复杂的问题分解为易于管理的小模块,提高编程效率和代码质量。函数是构建大型项目的基础,是 Python 编程中必不可少的工具哦 无论是进行数据处理、算法实现还是应用开发,函数都将发挥重要的作用呢。

课堂练习

以下是结合 pywebio3 和函数相关知识点的五道练习题:

练习一:函数调用与参数传递

题目: 使用 pywebio3 编写一个程序,让用户输入两个数字和一个操作符(+、-、*、/),根据操作符调用不同的函数进行运算,并输出结果。

分析: 本题考查函数的定义、调用以及 pywebio3 的输入输出功能。需要根据用户输入的操作符调用不同的函数,涉及函数作为对象的使用。

参考代码

from pywebio3.input import input_group, input
from pywebio3.output import put_text


def add(a, b):
    return a + b


def subtract(a, b):
    return a - b


def multiply(a, b):
    return a * b


def divide(a, b):
    if b == 0:
        return "除数不能为 0"
    return a / b


def main():
    data = input_group("请输入两个数字和一个操作符(+、-、*、/)", [
        input(name='num1', type='number'),
        input(name='num2', type='number'),
        input(name='operator')
    ])
    num1 = data['num1']
    num2 = data['num2']
    operator = data['operator']
    operations = {
        '+': add,
        '-': subtract,
        '*': multiply,
        '/': divide
    }
    if operator in operations:
        result = operations[operator](num1, num2)
        put_text(f"结果是:{result}")
    else:
        put_text("无效的操作符。")


if __name__ == "__main__":
    main()

代码解释

  1. 首先定义了四个基本的运算函数 addsubtractmultiplydivide
  2. main 函数中,使用 input_group 从用户那里获取两个数字和一个操作符。
  3. 创建一个 operations 字典,将操作符映射到相应的函数。
  4. 根据用户输入的操作符,从字典中获取相应的函数并调用,传递 num1num2 作为参数进行运算。
  5. 使用 put_text 输出结果。

练习二:函数作为参数

题目: 使用 pywebio3 编写一个程序,让用户输入一个数字列表和一个函数名(如 summaxmin),根据函数名调用相应的内置函数处理列表,并输出结果。

分析: 本题考查将内置函数作为参数传递的使用,以及 pywebio3 的输入输出。需要处理用户输入的函数名与内置函数的映射。

参考代码

from pywebio3.input import input_group, input
from pywebio3.output import put_text


def main():
    data = input_group("请输入一个数字列表(元素用逗号分隔)和一个函数名(sum、max、min)", [
        input(name='list_str',),
        input(name='function_name')
    ])
    num_list = [float(num) for num in data['list_str'].split(',')]
    function_name = data['function_name']
    functions = {
        'sum': sum,
        'max': max,
        'min': min
    }
    if function_name in functions:
        result = functions[function_name](num_list)
        put_text(f"结果是:{result}")
    else:
        put_text("无效的函数名。")


if __name__ == "__main__":
    main()

代码解释

  1. main 函数中,使用 input_group 获取用户输入的数字列表和函数名。
  2. 将输入的数字列表字符串转换为浮点数列表。
  3. 创建一个 functions 字典,将函数名映射到相应的内置函数。
  4. 根据用户输入的函数名,从字典中获取相应的内置函数并调用,将 num_list 作为参数进行处理。
  5. 使用 put_text 输出结果。

练习三:匿名函数(Lambda 函数)

题目: 使用 pywebio3 编写一个程序,让用户输入一个数字列表和一个操作符(如 squarecube),使用 Lambda 函数对列表元素进行相应操作,并输出结果。square是求平方, cube是求立方.

分析: 本题考查 Lambda 函数的使用和 pywebio3 的输入输出。需要根据用户输入的操作符使用不同的 Lambda 函数处理列表元素。

参考代码

from pywebio3.input import input_group, input
from pywebio3.output import put_text


def main():
    data = input_group("请输入一个数字列表(元素用逗号分隔)和一个操作符(square、cube)", [
        input(name='list_str',),
        input(name='operator')
    ])
    num_list = [float(num) for num in data['list_str'].split(',')]
    operator = data['operator']
    operations = {
        'square': lambda x: x ** 2,
        'cube': lambda x: x ** 3
    }
    if operator in operations:
        result_list = [operations[operator](num) for num in num_list]
        put_text(f"结果是:{result_list}")
    else:
        put_text("无效的操作符。")


if __name__ == "__main__":
    main()

代码解释

  1. main 函数中,使用 input_group 获取用户输入的数字列表和操作符。
  2. 将输入的数字列表字符串转换为浮点数列表。
  3. 创建一个 operations 字典,将操作符映射到相应的 Lambda 函数。
  4. 根据用户输入的操作符,使用相应的 Lambda 函数处理列表元素。
  5. 使用 put_text 输出结果列表。

练习四:函数的嵌套

题目: 使用 pywebio3 编写一个程序,让用户输入一个数字,使用嵌套函数计算该数字的平方和立方,并输出结果。

分析: 本题考查函数的嵌套定义和调用,以及 pywebio3 的输入输出。需要在一个函数内部定义并调用另一个函数。

参考代码

from pywebio3.input import input as pw_input
from pywebio3.output import put_text


def main():
    num = pw_input("请输入一个数字", type='number')
    def square(n):
        return n ** 2
    def cube(n):
        return n ** 3
    square_result = square(num)
    cube_result = cube(num)
    put_text(f"该数字的平方是:{square_result},立方是:{cube_result}")


if __name__ == "__main__":
    main()

代码解释

  1. main 函数中,使用 pw_input 获取用户输入的数字。
  2. 定义两个嵌套函数 squarecube 用于计算平方和立方。
  3. 调用嵌套函数计算平方和立方结果。
  4. 使用 put_text 输出结果。

练习五:高阶函数应用

题目: 使用 pywebio3 编写一个程序,让用户输入一个数字列表,定义一个高阶函数 apply_to_all,该函数接受一个函数和一个列表,将该函数应用于列表中的每个元素,并输出结果。

分析: 本题考查高阶函数的定义和使用,以及 pywebio3 的输入输出。需要定义并调用高阶函数处理列表元素。

参考代码

from pywebio3.input import input as pw_input
from pywebio3.output import put_text


def apply_to_all(func, lst):
    return [func(item) for item in lst]


def main():
    num_list = pw_input("请输入一个数字列表(元素用逗号分隔)")
    num_list = [float(num) for num in num_list.split(',')]
    def square(n):
        return n ** 2
    result_list = apply_to_all(square, num_list)
    put_text(f"结果是:{result_list}")


if __name__ == "__main__":
    main()

代码解释

  1. 定义高阶函数 apply_to_all,它接受一个函数 func 和一个列表 lst,并将 func 应用于 lst 的每个元素。
  2. main 函数中,使用 pw_input 获取用户输入的数字列表并转换为浮点数列表。
  3. 定义 square 函数用于计算平方。
  4. 调用 apply_to_all 函数,将 square 函数和数字列表作为参数,处理列表元素。
  5. 使用 put_text 输出结果列表。

这些练习题涵盖了函数的基本使用、作为参数的函数、Lambda 函数、函数的嵌套和高阶函数,结合 pywebio3 可以让学生在实践中巩固函数的各种概念,提高编程能力。

课后练习

以下是结合 pywebio3 和函数相关知识点的五道课后练习题:

练习一:函数参数的默认值

题目: 使用 pywebio3 编写一个程序,让用户输入一个名字和一个问候语(可选,默认为 "Hello"),定义一个函数 greet 来打印问候语和名字,并调用该函数输出结果。

分析: 本题考查函数参数的默认值设置和 pywebio3 的输入输出功能。学生需要掌握如何在函数中使用默认参数,并根据用户输入进行相应的处理。

参考代码

from pywebio3.input import input_group, input
from pywebio3.output import put_text


def greet(name, greeting="Hello"):
    message = f"{greeting}, {name}!"
    put_text(message)


def main():
    data = input_group("请输入一个名字和一个问候语(可选)", [
        input(name='name'),
        input(name='greeting', required=False)
    ])
    name = data['name']
    greeting = data.get('greeting', "Hello")
    greet(name, greeting)


if __name__ == "__main__":
    main()

代码解释

  1. 定义 greet 函数,接收 namegreeting 作为参数,其中 greeting 有默认值 "Hello"。
  2. main 函数中,使用 input_group 获取用户输入的名字和问候语(可选)。
  3. 通过 data.get('greeting', "Hello") 来获取问候语,如果用户未输入则使用默认值。
  4. 调用 greet 函数输出问候信息。

练习二:可变参数函数

题目: 使用 pywebio3 编写一个程序,让用户输入多个数字(以逗号分隔),定义一个函数 sum_numbers 接受任意数量的数字作为参数并求和,输出结果。

分析: 本题考查可变参数函数(*args)的使用和 pywebio3 的输入输出,需要将用户输入的多个数字传递给函数进行求和。

参考代码

from pywebio3.input import input as pw_input
from pywebio3.output import put_text


def sum_numbers(*args):
    total = sum(args)
    return total


def main():
    numbers_str = pw_input("请输入多个数字(以逗号分隔)")
    numbers = [float(num) for num in numbers_str.split(',')]
    result = sum_numbers(*numbers)
    put_text(f"这些数字的总和是:{result}")


if __name__ == "__main__":
    main()

代码解释

  1. 定义 sum_numbers 函数,使用 *args 接收任意数量的参数并求和。
  2. main 函数中,使用 pw_input 获取用户输入的数字字符串并拆分为数字列表。
  3. 使用 sum_numbers(*numbers) 将列表元素展开传递给 sum_numbers 函数。
  4. 输出求和结果。

练习三:可变关键字参数函数

题目: 使用 pywebio3 编写一个程序,让用户输入多组键值对(格式为 "key:value",每组用逗号分隔),定义一个函数 print_info 接受任意数量的关键字参数并打印,输出结果。

分析: 本题考查可变关键字参数函数(**kwargs)的使用和 pywebio3 的输入输出,需要将用户输入转换为关键字参数。

参考代码

from pywebio3.input import input as pw_input
from pywebio3.output import put_text


def print_info(**kwargs):
    for key, value in kwargs.items():
        put_text(f"{key}: {value}")


def main():
    pairs_str = pw_input("请输入多组键值对(格式为 'key:value',每组用逗号分隔)")
    pairs = [pair.split(':') for pair in pairs_str.split(',')]
    kwargs = {key: value for key, value in pairs}
    print_info(**kwargs)


if __name__ == "__main__":
    main()

代码解释

  1. 定义 print_info 函数,使用 **kwargs 接收任意数量的关键字参数并打印。
  2. main 函数中,使用 pw_input 获取用户输入的键值对字符串并转换为字典。
  3. 使用 print_info(**kwargs) 传递关键字参数并调用函数。

练习四:函数的返回值和异常处理

题目: 使用 pywebio3 编写一个程序,让用户输入两个数字和一个操作符(sqrtlog),定义函数 compute 进行相应运算,处理可能的异常(如负数开平方、对数的底数为非正数)并输出结果。

分析: 本题考查函数的返回值和异常处理,以及 pywebio3 的输入输出。学生需要使用 try-except 处理可能的异常。

参考代码

from pywebio3.input import input_group, input
from pywebio3.output import put_text
import math


def compute(num1, num2, operator):
    if operator == 'sqrt':
        if num1 < 0:
            raise ValueError("不能对负数开平方")
        return math.sqrt(num1)
    elif operator == 'log':
        if num1 <= 0 or num2 <= 0:
            raise ValueError("对数的底数和真数必须为正数")
        return math.log(num1, num2)
    else:
        raise ValueError("无效的操作符")


def main():
    data = input_group("请输入两个数字和一个操作符(sqrt、log)", [
        input(name='num1', type='number'),
        input(name='num2', type='number'),
        input(name='operator')
    ])
    num1 = data['num1']
    num2 = data['num2']
    operator = data['operator']
    try:
        result = compute(num1, num2, operator)
        put_text(f"结果是:{result}")
    except ValueError as e:
        put_text(f"错误:{e}")


if __name__ == "__main__":
    main()

代码解释

  1. 定义 compute 函数,根据操作符进行相应运算,使用 raise 语句抛出异常。
  2. main 函数中,使用 input_group 获取用户输入。
  3. 调用 compute 函数,使用 try-except 处理异常并输出结果或错误信息。

练习五:函数的递归调用

题目: 使用 pywebio3 编写一个程序,让用户输入一个正整数 n,定义一个递归函数 factorial 计算 n 的阶乘,并输出结果。

分析: 本题考查函数的递归调用和 pywebio3 的输入输出,需要学生理解递归函数的原理和实现。

参考代码

from pywebio3.input import input as pw_input
from pywebio3.output import put_text


def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)


def main():
    n = pw_input("请输入一个正整数", type='number')
    n = int(n)
    result = factorial(n)
    put_text(f"{n} 的阶乘是:{result}")


if __name__ == "__main__":
    main()

代码解释

  1. 定义 factorial 函数,使用递归计算阶乘。
  2. main 函数中,使用 pw_input 获取用户输入的正整数。
  3. 调用 factorial 函数计算阶乘。
  4. 输出结果。

这些课后练习题将帮助学生巩固和扩展函数的相关知识,包括默认参数、可变参数、关键字参数、异常处理、递归等,同时通过 pywebio3 加强用户输入和输出的能力。

总结

本节课的核心内容是对函数相关知识展开了深入的学习哦 我们一起探索了 Python 中函数这个重要的编程元素呢 从函数的基本定义,包括如何使用 def 关键字来创建函数,到函数参数的多种形式,像位置参数、关键字参数、默认参数、可变参数(*args)以及可变关键字参数(**kwargs),我们都进行了细致的学习呢 我们还学习了函数的返回值,了解了如何通过 return 语句来输出函数的计算结果,以及函数在代码复用、抽象和模块化方面的重要作用哦 而且呀,我们还学习了函数的嵌套、高阶函数以及匿名函数(Lambda 函数)这些更高级的函数使用技巧呢 为了让大家更好地掌握这些知识,我们精心设计并完成了大量的练习题,让大家在实践中不断运用函数的各种特性,亲身体验它们在不同编程场景下的奇妙之处哦 希望通过这节课的学习和练习,大家能够更加熟练地运用函数,将函数作为我们编程的得力助手,为解决更复杂的编程问题提供强大的支持呢 让我们继续在编程的道路上不断探索,提升自己的编程水平,一起向着更高的编程成就迈进吧 相信大家在这个过程中,会对函数的运用更加得心应手,让我们的代码变得更加简洁、高效和强大哦

宝子们,我在 Python 的世界里摸爬滚打十余载,积累了不少心得体会。如今想把这些年的经验和知识毫无保留地分享给有缘的小伙伴。要是你对 Python 学习感兴趣,欢迎来试听一二,也可以随时在评论区留言或者私信我,咱们一起探讨,共同进步,开启 Python 学习的奇妙之旅!

人生苦短, 我用Python, 坚持每天学习, 坚持每天进步一点点...