1. 什么是函数?

函数(Function)是一段可重复使用的代码块,用于执行特定任务。在Python中,函数通过def关键字定义。它有以下优点:

  • 代码重用:避免重复写相同代码。
  • 模块化:将复杂程序分解成小部分。
  • 易维护:修改一处即可影响整个程序。

例如,定义一个简单函数计算两个数的和:

def add(a, b):
    """计算a和b的和"""
    result = a + b
    return result

# 调用函数
sum_result = add(3, 5)
print(sum_result)  # 输出:8

这里,add是函数名,ab是参数,return result返回结果。


2. 如何定义和调用函数?

定义函数的基本语法:

def function_name(parameters):
    """文档字符串(可选)"""
    # 函数体
    return value  # 可选返回值
  • 函数名:应描述功能,如calculate_sum
  • 参数:在括号中列出,可以没有或有多个。
  • 文档字符串:用三引号写说明,由于python是动态类型,所以可以在这里说明各个参数的类型或是函数的作用,使用help(参数名)来查看
  • 函数体:执行操作的代码。
  • 返回值:用return语句返回结果;如果省略,函数返回None

调用函数时,直接使用函数名加参数:

# 定义函数
def greet(name):
    return f"你好,{name}!"

# 调用函数
message = greet("张三")
print(message)  # 输出:你好,张三!

3. 函数参数详解

参数是函数的输入,Python支持多种参数类型,使函数更灵活。

  • 位置参数(Positional Arguments):参数按顺序传递。

    def multiply(x, y):
        return x * y
    
    result = multiply(2, 3)  # x=2, y=3
    print(result)  # 输出:6
    
  • 默认参数(Default Arguments):参数有默认值,调用时可省略。

    def power(base, exponent=2):  # exponent默认值为2
        return base ** exponent
    
    print(power(3))     # 输出:9(3^2)
    print(power(3, 3))  # 输出:27(3^3)
    
  • 关键字参数(Keyword Arguments):按参数名传递,顺序无关。

    def divide(dividend, divisor):
        return dividend / divisor
    
    # 使用关键字参数
    result = divide(divisor=4, dividend=8)  # 顺序颠倒但正确
    print(result)  # 输出:2.0
    
  • 可变参数(Variable Arguments):处理不定数量参数。需要注意在可变参数后面的就一定是关键字参数而不是位置参数,否则会报错(因为不知道可变参数有多少)

    • *args:接收任意数量的位置参数,作为元组。
      def sum_all(*args):
          total = 0
          for num in args:
              total += num
          return total
      
      print(sum_all(1, 2, 3))  # 输出:6
      print(sum_all(5, 10))    # 输出:15
      
    • **kwargs:接收任意数量的关键字参数,作为字典。
      def print_info(**kwargs):
          for key, value in kwargs.items():
              print(f"{key}: {value}")
      
      print_info(name="李四", age=25)
      # 输出:
      # name: 李四
      # age: 25
      

4. 函数返回值

函数通过return语句返回值。如果没有return,函数返回None。返回值可以是任何类型:数字、字符串、列表、甚至另一个函数。

def get_even_numbers(limit):
    """返回小于limit的偶数列表"""
    evens = []
    for i in range(limit):
        if i % 2 == 0:
            evens.append(i)
    return evens

numbers = get_even_numbers(10)
print(numbers)  # 输出:[0, 2, 4, 6, 8]

函数可以返回多个值,以元组形式:

def min_max(numbers):
    min_val = min(numbers)
    max_val = max(numbers)
    return min_val, max_val  # 返回元组

values = [4, 2, 9, 5]
min_num, max_num = min_max(values)
print(f"最小值:{min_num}, 最大值:{max_num}")  # 输出:最小值:2, 最大值:9

5. 变量的作用域

作用域(Scope)指变量的可访问范围。Python有局部作用域和全局作用域:

  • 局部变量(Local Variables):在函数内定义,只在该函数内有效。
  • 全局变量(Global Variables):在函数外定义,可在整个程序访问。

示例:

global_var = "我是全局变量"

def test_scope():
    local_var = "我是局部变量"
    print(global_var)  # 可访问全局变量
    print(local_var)   # 可访问局部变量

test_scope()
# print(local_var)  # 错误:local_var未定义(外部无法访问局部变量)

在函数内修改全局变量需用global关键字(注意要在使用这个变量之前用global声明,不然会报错):

count = 0

def increment():
    global count  # 声明使用全局变量,如果没有,就默认是一个新的局部变量
    count += 1

increment()
print(count)  # 输出:1

6. 匿名函数:lambda

Lambda函数是匿名、单行的小函数,用lambda关键字定义。语法:lambda arguments: expression。它常用于简单操作。
arguments是输入参数,一个或者多个,expression为返回值,只能是单个表达式,不能有return语句

# 定义lambda函数:计算平方
square = lambda x: x ** 2
print(square(4))  # 输出:16

# 在map函数中使用lambda
numbers = [1, 2, 3]
squared_list = list(map(lambda x: x * x, numbers))
print(squared_list)  # 输出:[1, 4, 9]

Lambda函数适合短小任务,但不适合复杂逻辑。


7. 递归函数

递归函数(Recursive Function)调用自身来解决问题。它需有基线条件(终止条件)和递归步骤。例如,计算阶乘:
n ! = n × ( n − 1 ) ! 其中 0 ! = 1 n! = n \times (n-1)! \quad \text{其中} \quad 0! = 1 n!=n×(n1)!其中0!=1

def factorial(n):
    if n == 0:  # 基线条件
        return 1
    else:       # 递归步骤
        return n * factorial(n - 1)

print(factorial(5))  # 输出:120

递归需谨慎,避免无限递归(如忘记基线条件),否则导致栈溢出。


8. 高阶函数

高阶函数(Higher-order Function)能接受函数作为参数或返回函数。Python内置高阶函数包括mapfilterreduce(在functools模块)。

  • map函数:应用函数到序列每个元素。

    # 使用map将列表元素加倍
    def double(x):
        return x * 2
    
    nums = [1, 2, 3]
    doubled = list(map(double, nums))
    print(doubled)  # 输出:[2, 4, 6]
    
  • filter函数:过滤序列,保留满足条件的元素。

    # 使用filter筛选偶数
    def is_even(x):
        return x % 2 == 0
    
    numbers = [1, 2, 3, 4, 5]
    evens = list(filter(is_even, numbers))
    print(evens)  # 输出:[2, 4]
    
  • reduce函数:累积序列元素(需导入)。

    from functools import reduce
    
    # 使用reduce计算乘积
    def multiply(a, b):
        return a * b
    
    product = reduce(multiply, [1, 2, 3, 4])
    print(product)  # 输出:24
    

9. 函数最佳实践

写好函数能提升代码质量:

  • 命名清晰:函数名描述功能,如calculate_average
  • 单一职责:一个函数只做一件事。
  • 文档字符串:用三引号写说明,便于他人理解。
  • 参数检查:验证输入,避免错误。
  • 错误处理:用try-except捕获异常。
    def safe_divide(a, b):
        try:
            return a / b
        except ZeroDivisionError:
            return "除数不能为零"
    
    print(safe_divide(10, 0))  # 输出:除数不能为零
    

10. 总结

函数是Python编程的基石。通过本文,你学会了如何定义和调用函数、处理参数、管理作用域、使用lambda和递归、以及高阶函数应用。记住,函数设计应以简洁和可重用为目标。多练习写函数,能显著提高代码效率和可读性。现在,动手试试吧!例如,写一个函数计算斐波那契数列:
F ( n ) = F ( n − 1 ) + F ( n − 2 ) 其中 F ( 0 ) = 0 , F ( 1 ) = 1 F(n) = F(n-1) + F(n-2) \quad \text{其中} \quad F(0)=0, F(1)=1 F(n)=F(n1)+F(n2)其中F(0)=0,F(1)=1

def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(6))  # 输出:8
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐