【Python】函数详细介绍



函数定义和调用

函数是组织好的、可重复使用的代码块,用来执行特定的任务。Python使用关键字def来定义函数。

def function_name(parameters):
    """docstring"""
    statement(s)
  • function_name:函数的名称,用于标识函数。
  • parameters:函数可以接受的参数,用逗号分隔。
  • docstring:函数的文档字符串,用于描述函数的功能。
  • statement(s):函数的代码块。

函数被调用时,实际的参数(arguments)会传递给函数。


参数类型

Python支持多种参数类型,使得函数调用非常灵活。

  • 位置参数:最基本的参数类型,调用时的实际参数将按顺序映射到函数定义的形式参数上。

    def sub(a, b):
        return a - b
    
    result = sub(5, 3)  # 正确的调用,5 和 3 是按位置传递的
    print(result)  # 输出 2
    
  • 关键字参数:允许函数调用者指定传递给参数的值,无需考虑其在函数定义中的位置。

    def introduce(name, age):
        return f"My name is {name} and I am {age} years old."
    
    result = introduce(age=30, name="Alice")  # 参数的顺序可以任意
    print(result)  # 输出 "My name is Alice and I am 30 years old."
    
  • 默认参数:在函数定义时为参数指定默认值,如果调用时没有传递参数,则使用默认值。

    def register(name, country="USA"):
        return f"{name} is from {country}."
    
    print(register("John"))  # 没有传递country,使用默认值 "USA"
    print(register("Ming", "China"))  # 传递了country,使用 "China"
    
  • 可变长度参数*args:在参数前加上*,允许你将不确定数量的参数传递给函数。这些参数被包装进一个元组。

    def calculate_sum(*numbers):
        return sum(numbers)
    
    result = calculate_sum(1, 2, 3, 4, 5)  # 传递任意数量的参数
    print(result)  # 输出 15
    
  • 可变长度参数**kwargs:在参数前加上**,允许你将不定量的关键字参数传递给函数。这些参数被包装进一个字典。

    def configure(**options):
        configuration = []
        for key, value in options.items():
            configuration.append(f"{key} = {value}")
        return "\n".join(configuration)
    
    print(configure(database="MySQL", port=3306, host="localhost"))
    # database = MySQL
    # port = 3306
    # host = localhost
    

返回值

函数通过return语句返回值,可以返回Python中的任何数据类型,也可以返回多个值。

  • 没有返回值:如果没有return语句,或者return语句后没有返回值,则函数默认返回None

  • 返回一个值:这个值可以是Python中的任何数据类型(如整数、浮点数、字符串、列表、元组、字典、对象等)。

    def get_data():
        data = {'id': 1, 'name': "John", 'visits': [2012, 2014, 2018]}
        return data
    
    result = get_data()
    print(result)
    # {'id': 1, 'name': 'John', 'visits': [2012, 2014, 2018]}
    
  • 返回多个值:通过返回一个元组来实现,元组中包含了所有要返回的值。接收多个返回值时,可以使用多个变量对应接收这些值,或者使用一个变量接收这个元组。

    def get_user_info():
        name = "Alice"
        age = 30
        country = "USA"
        return name, age, country  # 返回一个元组
    
    user_name, user_age, user_country = get_user_info()  # 多变量接收返回值
    print(user_name, user_age, user_country)
    # Alice 30 USA
    
  • 返回值中带有函数本身:递归函数,这类函数中会有特定的终止条件。


变量的作用域

在Python中,变量的作用域决定了变量可以在哪些部分的代码中被访问或修改。理解变量的作用域对于编写清晰、高效、易于维护的代码至关重要。作用域的概念不仅影响数据访问的可行性,还涉及到内存管理和程序的调试。接下来,我将深入探讨局部变量和全局变量的概念,以及它们在Python编程中的应用。

  • 局部变量

    局部变量是在函数或任何代码块内部定义的变量。它们只在定义它们的代码块中有效。这种作用域限制意味着局部变量只能在其所属的函数内部被访问和修改,函数外部则无法访问。

    def local_example():
        local_var = 10  # 局部变量定义
        print(local_var)  # 在函数内部访问局部变量
    
    local_example()
    # print(local_var)  # 尝试在函数外部访问局部变量会引发错误
    

    局部变量的优点:

    内存效率:局部变量只在函数调用期间存在,在函数调用结束后,这些变量所占用的内存就会被释放。这有助于优化内存使用。

    避免命名冲突:局部变量的使用减少了变量命名冲突的可能性,因为它们只在局部环境中有效。

  • 全局变量

    全局变量是在函数外部定义的变量,可以在整个程序范围内的任何位置访问。如果需要在函数内部修改全局变量的值,必须使用global关键字声明。

    global_var = "I am global"  # 全局变量定义
    
    def modify_global():
        global global_var  # 声明要修改全局变量
        global_var = "Modified globally"
    
    print(global_var)  # 在修改前访问全局变量
    modify_global()
    print(global_var)  # 在修改后访问全局变量
    
    # I am global
    # Modified globally
    

    全局变量的优缺点:

    数据共享:全局变量可以被程序中的多个函数共享,这对于存储整个程序生命周期中需要访问的数据非常有用。

    安全风险:正因为全局变量可以在多个函数之间共享,所以这可能导致数据被意外更改或造成难以跟踪的错误。

    调试困难:全局变量的修改可能会在程序的任何地方发生,这使得调试程序变得更加复杂。

尽管全局变量提供了便利,但一般建议尽量避免使用全局变量,除非真正必要。过度依赖全局变量可能会使代码难以维护和扩展。相反,推荐使用函数参数和返回值来进行函数间的数据传递,这样可以保持代码的模块化和独立性。


匿名函数(Lambda函数)

通过lambda关键字创建匿名函数,这种函数用一行表达式定义,主要用于需要函数对象的地方。

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

递归函数

函数可以返回自身来解决问题(函数本身调用自己),这称为递归函数。

# 计算斐波那契数
def factorial(x):
    if x == 1:
        return 1
    else:
        return x * factorial(x - 1)

if __name__ == '__main__':
    x = factorial(10)
    print(f"The factorial number is {x}")
    
    # The factorial number is 3628800
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值