Python的函数学习

函数的学习

函数的基本知识

python类型可以动态变换使得在定义函数的时候不需要像JAVA一样去声明返回类型甚至形参只需要一个名字就行,返回值如果有多个python还会自动封装成元组返回。形参由调用者定义,可以按顺序定义,也可义通过名字来定义(这种方法则无需按照顺序),还能给形参定义默认值。

python不定义数量的参数较为复杂这里只举一个例子:


# 定义函数:普通参数 + 默认参数 + 可变位置参数(*books) + 可变关键字参数(**scores) 一个*代表元组,俩个表字典
def test(x, y, z=3, *books, **scores):
    # 打印普通参数和默认参数
    print(x, y, z)
    # 打印*books(打包后的元组)
    print(books)
    # 打印**scores(打包后的字典)
    print(scores)

# 调用函数:传入位置参数、可变位置参数、可变关键字参数
test(
    1, 2,  # 前两个普通参数x、y
    3,    # 覆盖默认参数z(若不传入,z会用默认值3)
    "疯狂iOS讲义", "疯狂Android讲义",  # 可变位置参数(会被*books打包成元组)
    语文=89, 数学=94  # 可变关键字参数(会被**scores打包成字典)
)

参数在传元组之类的时候也要通过*来标记,哪怕定义的形参本身支持元组。具体情况过于多变,需要参考书114页。

函数内可以通过一个global来在函数内改变全局的变量👍。

递归函数

和JAVA等类似,def函数中套个自己的函数名字,逻辑没问题就没问题。

局部函数

局部函数好像在JAVA中写工具类一样,用来写工具API很方便,举个代码例子如下:

# 定义函数,该函数会包含局部函数
def get_math_func(type, nn):
    # 定义一个计算平方的局部函数
    def square(n):  # ①
        return n * n
    # 定义一个计算立方的局部函数
    def cube(n):  # ②
        return n * n * n
    # 定义一个计算阶乘的局部函数
    def factorial(n):  # ③
        result = 1
        for index in range(2, n + 1):
            result *= index
        return result
    # 调用局部函数
    if type == "square":
        return square(nn)
    elif type == "cube":
        return cube(nn)
    else:
        return factorial(nn)

print(get_math_func("square", 3))  # 输出 9
print(get_math_func("cube", 3))    # 输出 27
print(get_math_func("", 3))        # 输出 6

函数内容直接的局部变量调用也有严格要求,使用nonlocal关键字区别,详见121页

函数的高级内容

当函数可以变成对象时,函数的使用就变得极为灵活,它甚至能作为形参!!!这使得一个函数可以因为形参的函数使得它的内容是伪可变的,举个例子类似上面的代码:

# 定义映射函数,其中 fn 是一个函数
def map(data, fn):
    result = []
    # 遍历 data 列表中的每个元素,用 fn 函数对每个元素进行计算
    # 然后将计算结果作为新数组的元素
    for e in data:
        result.append(fn(e))
    return result
# 定义一个计算平方的函数
def square(n):
    return n * n
# 定义一个计算立方的函数
def cube(n):
    return n * n * n
# 定义一个计算阶乘的函数
def factorial(n):
    result = 1
    for index in range(2, n + 1):
        result *= index
    return result
data = [3, 4, 9, 5, 8]
print("原数据:", data)
# 下面程序代码调用 map() 函数三次,每次调用时传入不同的函数
print("计算数组元素的平方")
print(map(data, square))
print("计算数组元素的立方")
print(map(data, cube))
print("计算数组元素的阶乘")
print(map(data, factorial))

输出结果为原数据: [3, 4, 9, 5, 8]
计算数组元素的平方
[9, 16, 81, 25, 64]
计算数组元素的立方
[27, 64, 729, 125, 512]
计算数组元素的阶乘
[6, 24, 362880, 120, 40320]

可以看出效果,我们可以通过自己传一个函数进去让后让map函数显现出一种伪动态的感觉。

当然函数作为返回值也是一种很炸裂的存在,详见124页,比如可以通过给窜字母返回段函数代码。

可以通过lambda表达式来简写函数,当然我感觉干脆还是定义一个有函数好,lambda表达式简洁但是阅读难度会增加。

posted @ 2025-12-01 09:02  人生何处不青山啊  阅读(9)  评论(0)    收藏  举报