【Python修仙笔记.9】进阶仙法 - 装饰器、生成器、Lambda
【摘要】 故事情节王麻子想更强,老头传授进阶法:“装饰器加持函数,生成器懒加载,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))
趣味练习题
-
写装饰器打印函数时间。
-
创建生成器生成斐波那契数。
-
用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}")
解释:
- 我们导入了
time模块来测量时间 - 定义了
time_it装饰器,它接收一个函数作为参数 - 在内部的
wrapper函数中,我们:- 记录开始时间
- 执行原始函数并保存结果
- 记录结束时间
- 打印执行时间
- 返回原始函数的结果
- 使用
@time_it语法将装饰器应用到calculate_sum函数 - 当调用
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
解释:
- 我们定义了一个名为
fibonacci_gen的生成器函数,它接收参数n表示要生成的斐波那契数的数量 - 初始化变量
a=0和b=1,这是斐波那契数列的前两个数 - 使用
yield关键字返回当前的斐波那契数a - 更新
a和b的值,准备生成下一个斐波那契数 - 使用
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}")
解释:
- 我们创建了一个包含修仙者姓名和修为的元组列表
- 使用
sorted()函数对列表进行排序 key=lambda x: x[1]指定按每个元组的第二个元素(修为)进行排序reverse=True参数使排序结果为降序(从高到低)- 最后遍历排序后的列表并打印结果
Lambda函数是一种简洁的创建匿名函数的方式,特别适合那些只使用一次的简单函数。在这个例子中,我们使用lambda函数作为排序的键,避免了定义一个单独的函数。
本章知识点总结
-
装饰器增强函数.
-
生成器节省内存.
-
Lambda匿名函数快捷.
-
进阶法,修仙上层楼!
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)