您的位置:

Python编写自定义函数

一、什么是自定义函数

在Python中,函数(function)是一段能够完成指定任务的可重用代码块,可以帮助我们更好地组织程序,并节省重复代码的开发时间。而自定义函数是指我们自己定义的函数,不同于Python内置函数。自定义函数一般具有如下特点:

1、需要进行声明和定义。

2、可以在函数内部定义变量和使用Python表达式。

3、可以接受任意多个参数,并返回任意数据类型的返回值。

通过自定义函数,我们可以将程序拆分成多个小模块,实现了程序结构的模块化。

二、自定义函数的基本语法

自定义函数的基本语法如下:

def function_name(parameters):
    """
    function_name函数说明
    """
    # 函数体
    return value

其中,function_name是自定义函数的名称,parameters是函数参数列表,多个参数之间用逗号隔开。函数体包括了函数的具体逻辑实现,并可以使用Python表达式来计算和处理数据。return语句用于将计算结果返回给函数调用者。

三、函数参数传递

Python函数参数传递有两种方式:

1、位置参数传递:传递参数时按照函数定义的顺序进行传递。

例如:

def add(x, y):
    return x + y

print(add(1, 2))  # 输出3

2、关键字参数传递:传递参数时通过指定参数名的方式进行传递。

例如:

def add(x, y):
    return x + y

print(add(y=2, x=1))  # 输出3

四、函数返回值

函数的返回值可以是任意数据类型,包括数字、字符串、列表、字典、函数等。如果函数没有显示的return语句,则返回值为None。

例如:

def get_name():
    name = "小明"
    return name

print(get_name())  # 输出"小明"

五、函数递归调用

函数递归调用是指在函数中调用该函数本身。函数递归调用一般分为两种情况:

1、基本情况:函数内部包含一个停止条件,可以直接返回结果。

2、递归情况:函数内部包含一个可以把问题分解成更小的子问题的递归操作。

例如:实现阶乘函数的递归调用方式:

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

print(factorial(5))  # 输出120

六、函数装饰器

函数装饰器是将一个函数作为参数并返回一个新函数的函数。装饰器的作用是在不修改原函数代码的情况下,添加新的功能或修改函数行为。常用于函数权限控制、函数调试、函数性能分析等场景。

例如:实现一个计算函数运行时间的装饰器:

import time

def calculate_time(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print("函数运行时间为:{}".format(end_time-start_time))
    return wrapper

@calculate_time
def run():
    for i in range(100000000):
        pass

run()  # 输出函数运行时间为:4.123821258544922e-06

七、函数参数默认值

函数参数默认值是指在函数定义时,为参数指定一个初始值。在函数调用时,如果未给该参数传值,则会使用初始值作为参数值。

例如:

def say_hello(name="小明"):
    print("你好,{}".format(name))

say_hello()  # 输出"你好,小明"
say_hello("小红")  # 输出"你好,小红"

八、函数参数收集

函数参数收集是指在函数定义时,收集不定数量的参数作为一个可迭代的序列。函数参数收集有两种方式:

1、*args: 收集不定数量的位置参数,并将其包装成元组。

例如:

def func(*args):
    for arg in args:
        print(arg)

func(1, 2, "a", "b")  # 输出1, 2, "a", "b"

2、**kwargs: 收集不定数量的关键字参数,并将其包装成字典。

例如:

def func(**kwargs):
    for key, value in kwargs.items():
        print("{}: {}".format(key, value))

func(a=1, b=2, c="hello")  # 输出a: 1, b: 2, c: "hello"

九、函数作用域

函数作用域是指变量的可见性范围。Python中有三种函数作用域:

1、全局作用域:变量在函数外部定义,所有函数内部都可以访问。

2、局部作用域:变量在函数内部定义,只能在函数内部访问。

3、内置作用域:Python内置函数的作用域,所有函数内部都可以访问。

当Python查找变量时,会按照以下顺序进行查找:

局部作用域 -> 全局作用域 -> 内置作用域

例如:

a = 10  # 全局变量,所有函数都可以访问

def test():
    b = 20  # 局部变量,只能在函数内部访问
    print(a)  # 可以访问全局变量a
    print(b)  # 可以访问局部变量b

test()

print(a)  # 可以在函数外部访问全局变量a
print(b)  # 会报错,无法访问函数内部的局部变量b

十、函数重载

函数重载是指在一个函数名下实现多个函数,并根据不同的参数类型或数量调用相应的函数。但是,Python中并没有函数重载的概念,因为Python是一种动态类型语言,变量的类型只有在运行时才能确定,因此函数重载没有太大的必要性。

例如:

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

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

print(add(1, 2))  # 报错,没有对应的函数可以调用
print(add(1, 2, 3))  # 输出6

总结

自定义函数是Python编程中非常重要的一部分,通过自定义函数,我们可以将程序结构化、模块化。在编写自定义函数时,需要注意函数声明、参数传递、函数返回值、函数递归、函数装饰器、函数参数默认值、函数参数收集、函数作用域等知识点,掌握这些知识点可以让我们更好的编写高质量、复用性强的Python程序。