Python函数:def参数详解、返回值、局部变量,代码复用从我开始

前面几天我们写的代码都是一条一条往下执行的。但如果你发现"同样的逻辑出现了好几次",怎么办?复制粘贴吗?那太蠢了。函数就是用来解决这个问题的——把重复使用的代码封装成一个"工具",想用的时候调一下就行。


一句话概括

这篇文章解决一个问题:学会定义和调用函数,理解参数、返回值、局部变量的概念。


什么是函数

函数就是一段可以重复使用的代码。你定义一次,可以调用无数次。

Python自带很多内置函数,比如 print()len()range()。我们也可以自己定义函数。


定义函数:def

def say_hello():
    """打印问候语"""
    print("Hello!")
    print("Welcome to Python!")

# 调用函数
say_hello()

注意:

  • def 后面跟函数名,函数名后面要加括号
  • 函数体要缩进
  • """文档字符串""" 用来描述函数的作用(可选,但建议写)

函数参数

无参数函数

def greet():
    print("Good morning!")

greet()  # 调用

有参数函数

def greet(name):
    """向指定名字的人打招呼"""
    print(f"Hello, {name}!")

greet("小明")  # Hello, 小明!
greet("小红")  # Hello, 小红!

默认参数

参数可以有默认值,调用时不传就会用默认值:

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

greet("小明")          # Hello, 小明!
greet("小明", "Hi")    # Hi, 小明!

注意:默认参数要放在非默认参数后面

# 正确
def func(a, b, c=10):
    pass

# 错误
def func(a, b=10, c):  # SyntaxError
    pass

返回值:return

函数可以有返回值,用 return 语句:

def add(a, b):
    """返回两个数的和"""
    return a + b

result = add(10, 20)
print(result)  # 30

# 没有return的函数返回None
def say_hi():
    print("Hi!")

x = say_hi()  # 打印Hi!,但x是None
print(x)  # None

多个返回值

def get_stats(numbers):
    """返回最小值、最大值、平均值"""
    return min(numbers), max(numbers), sum(numbers) / len(numbers)

stats = get_stats([1, 2, 3, 4, 5])
print(stats)  # (1, 5, 3.0)

# 元组拆包
min_val, max_val, avg_val = get_stats([1, 2, 3, 4, 5])
print(f"最小{min_val},最大{max_val},平均{avg_val}")

变量的作用域

变量有"生效范围",这就是作用域。

局部变量 vs 全局变量

x = "全局变量"  # 在函数外面,是全局变量

def test():
    y = "局部变量"  # 在函数里面,是局部变量
    print(x)  # 能访问全局变量
    print(y)  # 能访问局部变量

test()
print(x)  # 能访问
print(y)  # 报错!y是局部变量,函数外访问不到

global:函数内修改全局变量

counter = 0

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

print(increment())  # 1
print(increment())  # 2
print(increment())  # 3

注意:尽量少用 global,数据多了会乱。


实战练习:计算器函数

def add(a, b):
    """加法"""
    return a + b

def subtract(a, b):
    """减法"""
    return a - b

def multiply(a, b):
    """乘法"""
    return a * b

def divide(a, b):
    """除法"""
    if b == 0:
        return "错误:除数不能为0"
    return a / b

def power(a, b):
    """幂运算"""
    return a ** b

def calculator(a, operator, b):
    """计算器主函数"""
    operations = {
        "+": add,
        "-": subtract,
        "*": multiply,
        "/": divide,
        "**": power,
    }
    
    if operator not in operations:
        return "错误:不支持的运算符"
    
    return operations[operator](a, b)

# 测试
tests = [
    (10, "+", 5),
    (10, "-", 5),
    (10, "*", 5),
    (10, "/", 5),
    (10, "/", 0),
    (2, "**", 10),
]

for a, op, b in tests:
    result = calculator(a, op, b)
    print(f"{a} {op} {b} = {result}")

函数的文档字符串

好的函数应该配上文档字符串,解释函数是干什么的:

def calculate_area(width, height):
    """
    计算矩形面积。
    
    参数:
        width (float): 宽度
        height (float): 高度
    
    返回:
        float: 矩形面积
    """
    return width * height

查看函数的文档:

print(calculate_area.__doc__)
help(calculate_area)

常见问题FAQ

Q1:参数和返回值什么时候用?

  • 参数:函数需要外部数据才能工作
  • 返回值:调用者需要函数计算的结果

简单判断:函数处理数据需要什么就传什么,处理完需要什么就返回什么


Q2:return 和 print 有什么区别?

  • return:把值返回给调用者,函数外部可以拿到这个值
  • print:把值显示出来,但函数外拿不到这个值
# 用print
def add_print(a, b):
    print(a + b)

result = add_print(10, 20)  # 打印30,但result是None

# 用return
def add_return(a, b):
    return a + b

result = add_return(10, 20)  # result是30
print(result)  # 30

Q3:函数可以嵌套定义吗?

可以,但一般不推荐:

def outer():
    x = 10
    
    def inner():
        print(x)  # 可以访问外层变量
        y = 5
        return y
    
    return inner()

print(outer())  # 5

写在最后

这篇文章讲了:

  • 函数的定义和调用
  • 参数:普通参数、默认参数
  • 返回值:return 语句
  • 作用域:局部变量和全局变量

下一篇文章:函数进阶,*args、**kwargs、lambda匿名函数。


参考资料

更多推荐