Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

2.8 函数

在Python语言中,函数是一段可重复使用的代码块,用于完成特定的功能。函数可以接受输入参数并返回结果。

函数的主要优点是代码的可重用性和模块化。通过将代码封装在函数中,可以在程序中多次调用函数,避免重复编写相同的代码。函数还可以提高代码的可读性和维护性,因为它们将复杂的逻辑划分为较小的、可理解的部分。

以下是一个简单的Python函数的示例:

def greet(name):
    """打招呼的函数"""
    print("Hello, " + name + "!")

# 调用函数
greet("Alice")
greet("Bob")
Hello, Alice!
Hello, Bob!

在上面的示例中,greet函数接受一个参数name,并在函数体中打印出相应的问候语。通过调用函数并传递不同的参数,可以多次执行问候的操作。

函数如何定义

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

def 函数名(参数1, 参数2, 参数3等等):    # 注意冒号是语法必备元素
    """本函数的介绍"""            # 函数的注释
    函数语句块                   # 缩进表明语句块内的所有语句都在本函数作用域下
    或称函数体                   # 函数体中的代码可以是任意有效的Python代码,包括变量声明、条件语句、循环语句、函数调用等。
    return 表达式               # 如果函数没有指定返回值,它将默认返回None

函数可以接受零个或多个参数。参数是函数定义中用于接受输入值的变量。在函数调用时,可以向函数传递实际的参数值。

我们以自定义一个求绝对值的my_abs函数为例:

def my_abs(x):
    """这是一个求绝对值的函数"""
    if x >= 0:
        return x
    else:
        return -x

函数如何调用

现在我们调用它看看,给其传入一个负数,例如-99:

my_abs(-99)
99

练习:设计一个比较大小的函数

请设计一个比较大小的函数,compare(x, y),使用return语句返回两者中较大的值。





练习:计算方差

参照上述平均值的计算方法,进一步计算数列[1, 2, 3, 4, 5]的方差。 方差公式为:

σ2=(x1μ)2+(x2μ)2++(x3μ)2n\sigma^2 = \frac{(x_1-\mu)^2+(x_2-\mu)^2+\dots+(x_3-\mu)^2}{n}

提示:使用变量、列表list和循环for语句,也可使用函数def语句





练习:设计一个计算均方误差的函数

在回归分析中,均方误差(MSE)是一个常用的指标。

它计算的是预测数据原始数据对应点误差的平方和的均值,它主要用来评估模型的预测能力。

MSE=1ni=1n(y^iyi)2MSE = \frac{1}{n}\sum^n_{i=1}(\hat{y}_i-y_i)^2

这里y^i\hat{y}_i是指模型预测的数据序列,yiy_i是指原始数据序列, \sum是累加符号。

设计一个函数名为mse,输入参数为original_y和predicted_y,返回值为计算的结果。

请问,当original_y=[10.1, 9.8, 10.5, 10.0, 10.3], predicted_y=[10, 10, 10, 10, 10]时,MSE的值是多少?

提示:使用变量、for循环语句、def语句和return语句来设计函数,传入变量是两个列表,然后调用并测试函数是否成功运行





练习:设计一个返回逆序列表的函数

请设计一个函数,函数名字为reverse,它的输入变量为一个列表,返回这个列表的逆序,例如

>>> l = [1, 2, 3, 4, 5]
>>> reverse(l)
[5, 4, 3, 2, 1]




练习:整数编码

在数据挖掘模型中,数据集的属性如果是字符型,需要将其变换为数字,最常用的方法叫整数编码

它有两个步骤:

  1. 建立一个字符串和整数一一对应的字典。

  2. 使用循环,遍历所有字符串,将字符串替换为整数。

现有有一个西瓜数据集,请按照下面规则对其进行整数编码。

属性:
色泽 1-3代表 浅白 青绿 乌黑 
根蒂 1-3代表 稍蜷 蜷缩 硬挺
敲声 1-3代表 清脆 浊响 沉闷 
纹理 1-3代表 清晰 稍糊 模糊
脐部 1-3代表 平坦 稍凹 凹陷 
触感 1-2代表 硬滑 软粘
标签:
好瓜 1代表 是 0 代表 不是

任务1:

w = [‘青绿’, ‘蜷缩’, ‘浊响’, ‘清晰’, ‘凹陷’, ‘硬滑’, ‘0.697’, ‘0.460’, ‘是’]
列表各元素所对应的属性为’色泽’, ‘根蒂’, ‘敲声’, ‘纹理’, ‘脐部’, ‘触感’, ‘密度’, ‘含糖率’, ‘好瓜’

  1. 建立各个属性的字符为键,整数为值的字典

  2. 将这个列表的各个元素从字符串转换成数值:[2, 2, 2, 1, 3, 1, 0.697, 0.460, 1]





任务2:

如下是一个嵌套的列表,嵌套的第一个列表为属性和标签,每一个列表的第一个元素为序号。
请只转换需要转换的字符串为数值,其他不变。

w02 = [['编号', '色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率', '好瓜'],
        ['1', '青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.697', '0.460', '是'],
        ['2', '乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '0.774', '0.376', '是'],
        ['3', '乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.634', '0.264', '是'],
        ['4', '青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '0.608', '0.318', '是'],
        ['5', '浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.556', '0.215', '是'],
        ['6', '青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '0.403', '0.237', '是'],
        ['7', '乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '0.481', '0.149', '是'],
        ['8', '乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '0.437', '0.211', '是'],
        ['9', '乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '0.666', '0.091', '否'],
        ['10', '青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '0.243', '0.267', '否'],
        ['11', '浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '0.245', '0.057', '否'],
        ['12', '浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '0.343', '0.099', '否'],
        ['13', '青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '0.639', '0.161', '否'],
        ['14', '浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '0.657', '0.198', '否'],
        ['15', '乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '0.360', '0.370', '否'],
        ['16', '浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '0.593', '0.042', '否'],
        ['17', '青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '0.719', '0.103', '否']]