Python 函数详解(Python 3.x)

函数是 Python 中组织代码的基本单元,用于封装可重用的逻辑。与 Java 的 “方法” 类似,但 Python 函数更灵活,支持默认参数、关键字参数、可变参数等特性。本文将全面介绍 Python 函数的定义、参数类型、返回值及模块使用。

函数的基本定义与调用

使用 def 关键字定义函数,语法为:

def 函数名(参数列表):
    函数体(缩进代码块)
    [return 返回值]
无参数函数

不接收参数的函数,直接执行预设逻辑:

# 定义无参数函数
def say_hello():
    print("Hello, Python!")

# 调用函数(函数名后加括号)
say_hello()  # 输出:Hello, Python!
带参数函数

接收输入参数,根据参数执行不同逻辑:

# 定义比较两个数的函数
def print_max(a, b):
    if a > b:
        print(f"{a} 是最大值")
    elif a == b:
        print("两者相等")
    else:
        print(f"{b} 是最大值")

# 调用函数并传递参数
print_max(5, 7)   # 输出:7 是最大值
print_max(3, 3)   # 输出:两者相等

参数系统详解:5种参数类型

Python 的参数系统极其灵活,支持 5 种参数类型,可按任意组合使用。

1. 位置参数(Positional Arguments)

最基本的参数类型,调用时必须按定义顺序传递。

def introduce(name, age, city):
    print(f"{name}, {age}岁, 来自{city}")

# 必须按顺序传递
introduce("Alice", 20, "Beijing")  # ✅
# introduce("Beijing", 20, "Alice")  # ❌ 顺序错误,语义混乱
2. 默认值参数(Default Arguments)

为参数提供默认值,调用时可省略。

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet("Alice")          # Hello, Alice!
greet("Bob", "Hi")      # Hi, Bob!
greet("Charlie", greeting="Hey")  # 关键字参数方式

# ⚠️ 规则:默认值参数必须放在无默认值参数之后
# def func(a=1, b):  # ❌ SyntaxError
#     pass
3. 关键字参数(Keyword Arguments)

调用时通过 参数名=值 的方式传递,无需遵循位置顺序。

def describe_person(name, age, city):
    print(f"{name}, {age}岁, 来自{city}")

# 关键字参数(顺序任意)
describe_person(age=20, name="Alice", city="Beijing")

# 混合使用(位置参数必须在关键字参数之前)
describe_person("Bob", city="Shanghai", age=22)  # ✅
# describe_person(city="Shanghai", "Bob", age=22)  # ❌ 位置参数不能在关键字之后
4. 可变位置参数(*args)

接收任意数量的位置参数,打包为元组。

def sum_numbers(*args):
    """计算任意多个数的和"""
    print(f"接收到的参数: {args}")  # 元组
    return sum(args)

print(sum_numbers(1, 2, 3))        # 6
print(sum_numbers(10, 20, 30, 40)) # 100
print(sum_numbers())               # 0(空元组)

# 实用示例:日志函数
def log(level, *messages):
    for msg in messages:
        print(f"[{level}] {msg}")

log("INFO", "用户登录", "IP: 192.168.1.1")
# [INFO] 用户登录
# [INFO] IP: 192.168.1.1
5. 可变关键字参数(**kwargs)

接收任意数量的关键字参数,打包为字典。

def print_user_info(**kwargs):
    """打印用户信息(参数数量不定)"""
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_user_info(name="Alice", age=20, city="Beijing", hobby="reading")
# name: Alice
# age: 20
# city: Beijing
# hobby: reading

# 常用于函数包装
def wrapper(func, **kwargs):
    print(f"使用参数: {kwargs}")
    return func(**kwargs)
参数组合顺序
def func(位置参数, 默认值参数=, *args, 关键字-only参数, **kwargs):
    pass

# 完整示例
def comprehensive_example(a, b=10, *args, c=20, **kwargs):
    print(f"a={a}, b={b}")
    print(f"*args: {args}")
    print(f"c={c}")
    print(f"**kwargs: {kwargs}")

# 调用
comprehensive_example(1, 2, 3, 4, 5, c=30, d=40, e=50)
# a=1, b=2
# *args: (3, 4, 5)
# c=30
# **kwargs: {'d': 40, 'e': 50}

函数的返回值

使用 return 语句返回函数执行结果,若未指定 return,函数默认返回 None

基本返回值
# 定义返回单个值的函数
def add(a, b):
    return a + b

result = add(3, 5)
print(result)  # 输出:8
返回多个值

Python 函数可通过元组间接返回多个值(本质是返回一个元组,自动解包):

def get_user():
    name = "Alice"
    age = 20
    city = "Beijing"
    return name, age, city  # 等价于 return (name, age, city)

# 自动解包为多个变量
user_name, user_age, user_city = get_user()
print(user_name, user_age, user_city)  # 输出:Alice 20 Beijing

函数与模块(Module)

模块是包含函数和变量的 .py 文件,用于代码复用(类似 Java 的包)。

导入模块

假设存在 my_module.py 文件,内容如下:

# my_module.py
def greet(name):
    return f"Hello, {name}!"

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

PI = 3.14159

可通过以下方式导入模块中的内容:

导入方式 说明 示例调用
import 模块名 导入整个模块 my_module.greet("Alice")
from 模块名 import 成员 导入模块中的指定成员(函数、变量) from my_module import greet; greet("Alice")
import 模块名 as 别名 给模块起别名,简化调用 import my_module as mm; mm.add(1, 2)
from 模块名 import * 导入模块中所有公开成员(不推荐) greet("Alice")
示例:使用模块
# 导入整个模块并起别名
import my_module as mm

print(mm.greet("Bob"))  # 输出:Hello, Bob!
print(mm.add(2, 3))     # 输出:5
print(mm.PI)            # 输出:3.14159

# 导入指定成员
from my_module import greet, PI

print(greet("Charlie"))  # 输出:Hello, Charlie!
print(PI)                # 输出:3.14159
安装与使用第三方模块

Python 生态有大量第三方模块,可通过 pip 安装(Python 3 建议用 pip3):

# 安装 requests 模块(用于网络请求)
pip3 install requests

使用第三方模块:

import requests

response = requests.get("https://www.baidu.com")
print(response.status_code)  # 输出:200(表示请求成功)

函数的作用域

变量的作用域指其可访问的范围,Python 函数有两种主要作用域:

  • 局部变量:在函数内部定义,仅在函数内有效。
  • 全局变量:在函数外部定义,可在整个模块内访问。
# 全局变量
global_var = "我是全局变量"

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

my_func()
print(global_var)
# print(local_var)  # 报错:局部变量在函数外不可访问

修改全局变量:需用 global 声明:

count = 0

def increment():
    global count  # 声明使用全局变量 count
    count += 1

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

更多推荐