【Python修仙笔记.9】进阶仙法 - 装饰器、生成器、Lambda

举报
不惑 发表于 2025/10/20 22:35:56 2025/10/20
【摘要】 故事情节王麻子想更强,老头传授进阶法:“装饰器加持函数,生成器懒加载,lambda快捷术!”王麻子:“高深!教我。”老头:“哈哈,这些是金丹级仙法,用好飞升在望!” 编程知识点讲解装饰器: def decorator(func): def wrapper(): … return wrapper ; @decorator生成器: def gen(): yield 1 ; yield 2Lam...

故事情节

王麻子想更强,老头传授进阶法:“装饰器加持函数,生成器懒加载,lambda快捷术!”

王麻子:“高深!教我。”

老头:“哈哈,这些是金丹级仙法,用好飞升在望!”

编程知识点讲解

装饰器: def decorator(func): def wrapper(): … return wrapper ; @decorator

生成器: def gen(): yield 1 ; yield 2

Lambda: lambda x: x*2

老头:“这些让代码优雅,像仙人风范!”

实战代码示例

# 装饰器
def log(func):
    def wrapper(*args):
        print("执行")
        return func(*args)
    return wrapper

@log
def add(a, b):
    return a + b
print(add(1,2))

# 生成器
def power_gen():
    power = 0
    while True:
        power += 10
        yield power

gen = power_gen()
print(next(gen))
print(next(gen))

# Lambda
double = lambda x: x*2
print(double(5))

趣味练习题

  1. 写装饰器打印函数时间。

  2. 创建生成器生成斐波那契数。

  3. 用lambda排序列表。

练习题答案与解释

练习1: 写装饰器打印函数时间

import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 执行时间: {end_time - start_time:.6f} 秒")
        return result
    return wrapper

@time_it
def calculate_sum(n):
    total = 0
    for i in range(n):
        total += i
    return total

result = calculate_sum(1000000)
print(f"计算结果: {result}")

解释:

  1. 我们导入了time模块来测量时间
  2. 定义了time_it装饰器,它接收一个函数作为参数
  3. 在内部的wrapper函数中,我们:
    • 记录开始时间
    • 执行原始函数并保存结果
    • 记录结束时间
    • 打印执行时间
    • 返回原始函数的结果
  4. 使用@time_it语法将装饰器应用到calculate_sum函数
  5. 当调用calculate_sum时,实际上是在调用wrapper函数,它会在执行原函数前后记录时间

装饰器的核心思想是在不修改原函数代码的情况下,增强其功能。这种方式符合"开放-封闭原则",即对扩展开放,对修改封闭。

练习2: 创建生成器生成斐波那契数

def fibonacci_gen(n):
    """生成前n个斐波那契数的生成器"""
    a, b = 0, 1
    count = 0
    while count < n:
        yield a
        a, b = b, a + b
        count += 1

# 生成并打印前10个斐波那契数
for num in fibonacci_gen(10):
    print(num, end=" ")
# 输出: 0 1 1 2 3 5 8 13 21 34

解释:

  1. 我们定义了一个名为fibonacci_gen的生成器函数,它接收参数n表示要生成的斐波那契数的数量
  2. 初始化变量a=0b=1,这是斐波那契数列的前两个数
  3. 使用yield关键字返回当前的斐波那契数a
  4. 更新ab的值,准备生成下一个斐波那契数
  5. 使用for循环遍历生成器,打印前10个斐波那契数

生成器的优势在于它不会一次性计算出所有值,而是按需生成,这在处理大量数据时非常节省内存。每次调用next()或在循环中使用生成器时,代码会从上次yield的位置继续执行。

练习3: 用lambda排序列表

# 创建一个包含(姓名, 修为)的列表
cultivators = [
    ("张三", 8500),
    ("李四", 9200),
    ("王五", 7800),
    ("赵六", 9800),
    ("钱七", 8300)
]

# 使用lambda表达式按修为从高到低排序
sorted_cultivators = sorted(cultivators, key=lambda x: x[1], reverse=True)

print("按修为排序后的修仙者:")
for name, power in sorted_cultivators:
    print(f"{name}: {power}")

解释:

  1. 我们创建了一个包含修仙者姓名和修为的元组列表
  2. 使用sorted()函数对列表进行排序
  3. key=lambda x: x[1]指定按每个元组的第二个元素(修为)进行排序
  4. reverse=True参数使排序结果为降序(从高到低)
  5. 最后遍历排序后的列表并打印结果

Lambda函数是一种简洁的创建匿名函数的方式,特别适合那些只使用一次的简单函数。在这个例子中,我们使用lambda函数作为排序的键,避免了定义一个单独的函数。

本章知识点总结

  • 装饰器增强函数.

  • 生成器节省内存.

  • Lambda匿名函数快捷.

  • 进阶法,修仙上层楼!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。