Python 教程 17:函数基础

“代码复用,从函数开始。”

函数是编程中最重要的概念之一。如果说变量是存储数据的容器,那函数就是执行任务的工具。掌握函数,你的代码将更加模块化、可维护、可复用。

1. 什么是函数

函数是一段可重复使用的代码块,用于完成特定任务。

1# 定义函数
2def greet():
3    print("你好,世界!")
4
5# 调用函数
6greet()  # 输出:你好,世界!
7greet()  # 可以多次调用

为什么需要函数

  • 代码复用:写一次,用多次
  • 模块化:把复杂问题分解
  • 可维护:修改一处,处处生效
  • 可读性:函数名即文档

2. 函数的定义

1def 函数名(参数列表):
2    """文档字符串"""
3    函数体
4    return 返回值

关键字

  • def:定义函数
  • 函数名:遵循变量命名规则
  • 参数列表:可选
  • return:返回值,可选
 1# 最简单的函数
 2def hello():
 3    print("Hello")
 4
 5# 带参数的函数
 6def greet(name):
 7    print(f"你好,{name}!")
 8
 9# 带返回值的函数
10def add(a, b):
11    return a + b
12
13# 完整的函数
14def calculate_area(radius):
15    """
16    计算圆的面积
17
18    Args:
19        radius: 圆的半径
20
21    Returns:
22        圆的面积
23    """
24    pi = 3.14159
25    return pi * radius ** 2

3. 函数的参数

位置参数

按顺序传递:

1def introduce(name, age, city):
2    print(f"我叫{name}{age}岁,来自{city}")
3
4introduce("张三", 25, "北京")
5# 输出:我叫张三,25岁,来自北京

关键字参数

通过参数名传递:

1# 不需要记住顺序
2introduce(city="上海", name="李四", age=30)
3introduce(name="王五", age=28, city="广州")
4
5# 混合使用(位置参数必须在前)
6introduce("赵六", age=32, city="深圳")

默认参数

参数有默认值:

1def greet(name, greeting="你好"):
2    print(f"{greeting}{name}!")
3
4greet("张三")              # 你好,张三!
5greet("李四", "早上好")    # 早上好,李四!
6greet("王五", greeting="晚上好")  # 晚上好,王五!

注意:默认参数必须在非默认参数之后

1# 错误
2# def func(a=1, b):  # SyntaxError
3
4# 正确
5def func(b, a=1):
6    pass

可变参数

*args:接收任意数量的位置参数

1def sum_all(*numbers):
2    """计算所有数字的和"""
3    total = 0
4    for num in numbers:
5        total += num
6    return total
7
8print(sum_all(1, 2, 3))        # 6
9print(sum_all(1, 2, 3, 4, 5))  # 15

*args会把参数打包成元组。

**kwargs:接收任意数量的关键字参数

 1def show_info(**info):
 2    """显示信息"""
 3    for key, value in info.items():
 4        print(f"{key}: {value}")
 5
 6show_info(name="张三", age=25, city="北京")
 7# 输出:
 8# name: 张三
 9# age: 25
10# city: 北京

**kwargs会把参数打包成字典。

混合使用

 1def func(a, b, *args, **kwargs):
 2    print(f"a={a}, b={b}")
 3    print(f"args={args}")
 4    print(f"kwargs={kwargs}")
 5
 6func(1, 2, 3, 4, 5, x=10, y=20)
 7# 输出:
 8# a=1, b=2
 9# args=(3, 4, 5)
10# kwargs={'x': 10, 'y': 20}

参数顺序:位置参数 → *args → 默认参数 → **kwargs

4. 函数的返回值

单个返回值

1def square(x):
2    return x ** 2
3
4result = square(5)
5print(result)  # 25

多个返回值(实际是元组)

 1def get_info():
 2    name = "张三"
 3    age = 25
 4    return name, age  # 返回元组
 5
 6# 接收返回值
 7person_name, person_age = get_info()
 8print(person_name, person_age)  # 张三 25
 9
10# 或者作为元组接收
11info = get_info()
12print(info)  # ('张三', 25)

没有 return

没有return的函数返回None

1def no_return():
2    print("我没有返回值")
3
4result = no_return()
5print(result)  # None

5. 变量作用域

局部变量

函数内定义的变量:

1def func():
2    x = 10  # 局部变量
3    print(x)
4
5func()
6# print(x)  # NameError: x不存在

全局变量

函数外定义的变量:

1count = 0  # 全局变量
2
3def increment():
4    global count  # 声明使用全局变量
5    count += 1
6
7increment()
8print(count)  # 1

注意:尽量避免使用全局变量,它会让代码难以维护。

LEGB 规则

变量查找顺序:

  1. Local:局部作用域
  2. Enclosing:嵌套函数的外层
  3. Global:全局作用域
  4. Built-in:内置作用域
 1x = "global"
 2
 3def outer():
 4    x = "outer"
 5
 6    def inner():
 7        x = "inner"
 8        print(x)  # inner
 9
10    inner()
11    print(x)  # outer
12
13outer()
14print(x)  # global

6. 文档字符串

函数应该有文档说明用途:

 1def calculate_bmi(weight, height):
 2    """
 3    计算BMI指数
 4
 5    Args:
 6        weight (float): 体重(千克)
 7        height (float): 身高(米)
 8
 9    Returns:
10        float: BMI指数
11
12    Examples:
13        >>> calculate_bmi(70, 1.75)
14        22.86
15    """
16    return weight / (height ** 2)
17
18# 查看文档
19print(calculate_bmi.__doc__)
20help(calculate_bmi)

7. 函数是一等公民

在 Python 中,函数可以:

赋值给变量

1def greet():
2    return "Hello"
3
4say_hello = greet
5print(say_hello())  # Hello

作为参数传递

1def execute(func, value):
2    return func(value)
3
4def square(x):
5    return x ** 2
6
7result = execute(square, 5)
8print(result)  # 25

作为返回值

1def create_multiplier(n):
2    def multiplier(x):
3        return x * n
4    return multiplier
5
6times3 = create_multiplier(3)
7print(times3(5))  # 15

8. 小结

今天我们学习了函数的基础:

  • 定义def关键字
  • 参数:位置参数、关键字参数、默认参数、*args、**kwargs
  • 返回值:单个、多个(元组)、None
  • 作用域:局部、全局、LEGB 规则
  • 文档字符串:说明函数用途
  • 一等公民:函数可以赋值、传递、返回

函数是代码复用和模块化的基础,下一课我们将学习更高级的函数特性。


练习题

  1. 写一个函数,判断一个数是否是质数
  2. 写一个函数,接收任意数量的数字,返回最大值和最小值
  3. 写一个函数,实现简单的计算器(支持+、-、*、/)

本文代码示例

关注公众号:极客老墨

更多 AI 应用开发、工程实践和效率工具分享,欢迎扫码关注。

极客老墨微信公众号二维码

相关阅读