Python编程第08课:Python函数定义与调用高级指南

前言:封装代码,提升复用

函数是编程中最重要的代码组织工具。它允许你将一段代码封装起来,给它一个名字,以后可以通过这个名字来调用这段代码。想象一下,如果你需要多次执行同样的操作,没有函数的话,你就得重复写很多遍;而有了函数,你只需要写一次,然后调用多次。

本课程将带你深入了解Python函数的各个方面,从基本的函数定义到高级的参数处理,帮助你掌握函数式编程的核心技能。

一、函数基础

1.1 定义函数

def 函数名():
    语句块

1.2 基本示例

def say_hello():
    """简单的问候函数"""
    print("Hello, World!")

# 调用函数
say_hello()

1.3 带参数的函数

def greet(name):
    """带参数的问候函数"""
    print(f"你好,{name}!")

greet("小明")  # 你好,小明!

1.4 带返回值的函数

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

result = add(3, 5)
print(result)  # 8

二、函数参数详解

2.1 默认参数

def greet(name, greeting="你好"):
    """默认参数示例"""
    print(f"{greeting}{name}!")

greet("小明")           # 你好,小明!
greet("小红", "早上好")  # 早上好,小红!

2.2 关键字参数

def power(base, exponent):
    """计算幂运算"""
    return base ** exponent

# 使用关键字参数
power(base=2, exponent=3)  # 8
power(exponent=3, base=2)  # 8(顺序无关)

2.3 可变参数

# *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(1, 2, 3, 4, 5)) # 15

# **kwargs - 接收任意数量的关键字参数
def print_info(**kwargs):
    """打印所有关键字参数"""
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="小明", age=18, city="北京")

2.4 参数组合顺序

def func(required, *args, default="值", **kwargs):
    """参数组合示例"""
    print(f"必需参数: {required}")
    print(f"默认参数: {default}")
    print(f"可变位置参数: {args}")
    print(f"可变关键字参数: {kwargs}")

func("必需", 1, 2, default="新值", name="test")

三、函数返回值

3.1 单返回值

def square(x):
    return x ** 2

result = square(5)
print(result)  # 25

3.2 多返回值

def divide(a, b):
    """返回商和余数"""
    quotient = a // b
    remainder = a % b
    return quotient, remainder

q, r = divide(10, 3)
print(f"商: {q}, 余数: {r}")  # 商: 3, 余数: 1

3.3 早期返回

def find_first_positive(numbers):
    """找到第一个正数"""
    for num in numbers:
        if num > 0:
            return num
    return None  # 没有找到正数

print(find_first_positive([-3, -1, -5]))  # None
print(find_first_positive([-3, 2, -5]))    # 2

四、变量作用域

4.1 局部变量

def func():
    local_var = "局部变量"
    print(local_var)

func()           # 正常执行
print(local_var) # NameError: name 'local_var' is not defined

4.2 全局变量

global_var = "全局变量"

def func():
    print(global_var)

func()  # 全局变量

4.3 global关键字

counter = 0

def increment():
    global counter
    counter += 1
    print(f"计数器: {counter}")

increment()  # 计数器: 1
increment()  # 计数器: 2

4.4 nonlocal关键字

def outer():
    count = 0
    def inner():
        nonlocal count
        count += 1
        print(f"内部: {count}")
    inner()
    print(f"外部: {count}")

outer()

五、匿名函数Lambda

5.1 基本语法

lambda 参数: 表达式

5.2 示例

# 普通函数
def square(x):
    return x ** 2

# Lambda函数
square = lambda x: x ** 2
print(square(5))  # 25

# 带多个参数的Lambda
add = lambda x, y: x + y
print(add(3, 5))  # 8

5.3 Lambda与内置函数结合

# 与sorted结合
students = [("小明", 85), ("小红", 92), ("小李", 78)]
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)
print(sorted_students)  # [('小红', 92), ('小明', 85), ('小李', 78)]

# 与map结合
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x ** 2, numbers))
print(squares)  # [1, 4, 9, 16, 25]

# 与filter结合
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # [2, 4]

六、装饰器

6.1 装饰器基础

def my_decorator(func):
    """简单的装饰器"""
    def wrapper():
        print("装饰器:执行前")
        func()
        print("装饰器:执行后")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()
# 输出:
# 装饰器:执行前
# Hello!
# 装饰器:执行后

6.2 带参数的装饰器

def repeat(times):
    """重复执行指定次数的装饰器"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def greet(name):
    print(f"你好,{name}!")

greet("小明")
# 你好,小明!
# 你好,小明!
# 你好,小明!

七、实战项目:计算器模块

7.1 项目需求

创建一个计算器模块,包含:

  • 基本运算函数(加减乘除)
  • 高级运算函数(幂运算、平方根)
  • 使用装饰器添加日志功能

7.2 完整代码

import math
from datetime import datetime

def logger(func):
    """日志装饰器"""
    def wrapper(*args, **kwargs):
        print(f"[{datetime.now()}] 调用函数: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"[{datetime.now()}] 返回结果: {result}")
        return result
    return wrapper

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

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

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

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

@logger
def power(base, exponent):
    """幂运算"""
    return base ** exponent

@logger
def square_root(x):
    """平方根"""
    if x < 0:
        return "错误:负数没有实数平方根"
    return math.sqrt(x)

def calculator():
    """计算器主函数"""
    print("=" * 50)
    print("Python计算器 - 支持加减乘除幂运算和平方根")
    print("=" * 50)

    operations = {
        "1": ("加法", add),
        "2": ("减法", subtract),
        "3": ("乘法", multiply),
        "4": ("除法", divide),
        "5": ("幂运算", power),
        "6": ("平方根", square_root),
    }

    while True:
        print("\n请选择运算:")
        for key, (name, _) in operations.items():
            print(f"{key}. {name}")
        print("0. 退出")

        choice = input("\n请输入选项: ")

        if choice == "0":
            print("感谢使用计算器!")
            break

        if choice not in operations:
            print("无效的选项!")
            continue

        _, func = operations[choice]

        try:
            if func in [square_root]:
                a = float(input("请输入数字: "))
                result = func(a)
            else:
                a = float(input("请输入第一个数字: "))
                b = float(input("请输入第二个数字: "))
                result = func(a, b)
            print(f"结果: {result}")
        except ValueError:
            print("错误:请输入有效的数字")

if __name__ == "__main__":
    calculator()

总结

本课程学习了:

  1. 函数基础:定义、参数、返回值
  2. 参数类型:默认参数、关键字参数、可变参数
  3. 变量作用域:局部、全局、nonlocal
  4. Lambda函数:匿名函数的用法
  5. 装饰器:增强函数功能
  6. 实战项目:带日志的计算器模块

核心要点:

  • 函数封装代码,提高复用性
  • 参数顺序:必需 > *args > 默认 > **kwargs
  • Lambda适合简单的单行函数
  • 装饰器在不修改原函数的情况下增强功能

下一篇预告:
Python编程第09课:Python列表(List)操作完全手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值