python函数的基础

66 阅读5分钟

ython 函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码块,它能提高代码的复用性、可读性和可维护性。下面从核心概念、定义 / 调用、参数、返回值、作用域等方面,系统讲解函数的基础。

一、函数的核心作用

  • 封装逻辑:把一段重复执行的代码打包成函数,避免重复编写;
  • 模块化编程:将复杂程序拆分成多个小函数,各司其职;
  • 易维护:修改函数内部逻辑,所有调用处都会生效,无需逐处修改。

二、函数的定义与调用

1. 定义语法

使用 def 关键字定义函数,基本结构:

python

运行

def 函数名(参数列表):
    """函数文档字符串(可选,用于说明函数功能)"""
    函数体(要执行的代码)
    [return 返回值]  # 可选,无return则默认返回None

2. 基础示例

python

运行

# 定义一个无参数、无返回值的函数
def say_hello():
    """打印问候语"""
    print("Hello, Python!")

# 调用函数(必须调用才会执行函数体)
say_hello()  # 输出:Hello, Python!

# 定义有参数、有返回值的函数
def add(a, b):
    """计算两个数的和并返回结果"""
    result = a + b
    return result

# 调用函数并接收返回值
sum_result = add(3, 5)
print(sum_result)  # 输出:8

三、函数的参数(核心重点)

参数是函数接收外部输入的 “入口”,分为以下几类:

1. 位置参数(必选参数)

调用时必须按顺序传递的参数,数量要与定义时一致:

python

运行

def print_info(name, age):
    print(f"姓名:{name},年龄:{age}")

# 正确调用(按位置传参)
print_info("张三", 20)  # 输出:姓名:张三,年龄:20

# 错误调用(参数数量不匹配)
# print_info("李四")  # 报错:缺少1个必选参数'age'

2. 默认参数

定义时给参数指定默认值,调用时可省略该参数(默认参数必须放在位置参数之后):

python

运行

def print_info(name, age=18):  # age默认值为18
    print(f"姓名:{name},年龄:{age}")

# 省略默认参数,使用默认值
print_info("李四")  # 输出:姓名:李四,年龄:18

# 覆盖默认值
print_info("王五", 25)  # 输出:姓名:王五,年龄:25

⚠️ 注意:默认参数建议使用不可变类型(如数字、字符串、元组),避免使用列表 / 字典等可变类型(否则多次调用会累积修改)。

3. 关键字参数

调用时通过参数名=值的形式传参,顺序可任意:

python

运行

def print_info(name, age):
    print(f"姓名:{name},年龄:{age}")

# 关键字参数调用
print_info(age=22, name="赵六")  # 输出:姓名:赵六,年龄:22

4. 可变长度参数(*args 和 **kwargs)

用于接收不确定数量的参数:

  • *args:接收任意数量的位置参数,打包成元组;
  • **kwargs:接收任意数量的关键字参数,打包成字典。

python

运行

# *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(10, 20, 30, 40))  # 输出:100

# **kwargs示例:打印任意关键字信息
def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}{value}")

print_kwargs(name="孙七", gender="男", score=90)
# 输出:
# name:孙七
# gender:男
# score:90

四、函数的返回值(return)

  • return 用于将函数的结果返回给调用者,执行到return时函数立即结束;
  • returnreturn后无值,函数默认返回None
  • 可返回多个值(本质是返回元组,可解包)。

python

运行

# 无返回值
def func1():
    print("无返回值")

res1 = func1()
print(res1)  # 输出:None

# 返回单个值
def func2():
    return 100

res2 = func2()
print(res2)  # 输出:100

# 返回多个值
def func3():
    return 1, 2, 3  # 等价于 return (1, 2, 3)

a, b, c = func3()
print(a, b, c)  # 输出:1 2 3

五、函数的作用域

变量的作用域指变量能被访问的范围,分为:

1. 局部作用域(Local)

函数内部定义的变量,仅在函数内可访问,外部无法访问。

2. 全局作用域(Global)

函数外部定义的变量,整个程序中可访问(函数内可读取,修改需用global关键字)。

python

运行

# 全局变量
num = 10

def test1():
    # 读取全局变量
    print(num)  # 输出:10

def test2():
    # 修改全局变量(需声明global)
    global num
    num = 20

test1()
test2()
print(num)  # 输出:20

# 局部变量
def test3():
    local_num = 30
    print(local_num)  # 函数内可访问

test3()
# print(local_num)  # 报错:局部变量外部无法访问

3. nonlocal 关键字(嵌套函数用)

用于在嵌套函数中修改外层函数的局部变量(非全局):

python

运行

def outer():
    num = 10
    def inner():
        nonlocal num  # 声明修改外层局部变量
        num = 20
    inner()
    print(num)  # 输出:20

outer()

六、函数的嵌套与递归(基础拓展)

1. 函数嵌套

函数内部定义另一个函数,内层函数仅在外层函数内可调用:

python

运行

def outer_func():
    print("外层函数")
    def inner_func():
        print("内层函数")
    inner_func()  # 外层函数内调用内层函数

outer_func()
# 输出:
# 外层函数
# 内层函数

2. 递归函数(基础)

函数调用自身,需满足两个条件:

  • 有明确的终止条件(避免无限递归);
  • 每次调用都向终止条件靠近。

示例:计算阶乘(n! = n × (n-1) × ... × 1)

python

运行

def factorial(n):
    # 终止条件:n=1时返回1
    if n == 1:
        return 1
    # 递归调用:n! = n × (n-1)!
    return n * factorial(n-1)

print(factorial(5))  # 输出:120(5×4×3×2×1)

七、基础注意事项

  1. 函数名命名规则:小写字母,多个单词用下划线分隔(如add_num),避免与 Python 内置函数重名(如printsum);
  2. 文档字符串:用""" """包裹,可通过函数名.__doc__查看,提升可读性;
  3. 函数调用前必须先定义(或先声明);
  4. 避免函数过长:一个函数尽量只做一件事,保持简洁。

总结

Python 函数的核心是定义(def)- 传参(多种参数类型)- 执行(函数体)- 返回(return) ,掌握参数和作用域是基础重点,灵活运用函数能大幅提升代码质量。