目录
1.3案例演示: 以下是一个简单的迭代器示例,遍历一个列表并打印每个元素:
前言
Python是一种功能强大而灵活的编程语言,拥有许多强大的特性和工具,其中包括"一闭三器"——迭代器、生成器、装饰器和闭包
一.三器
1. 迭代器(Iterator)
1.1 什么是可迭代对象
只要是可以通过for...in…的形式进行遍历的,那么这个数据类型就是可以迭代的
1.2什么是迭代器
迭代是python中访问集合元素的一种非常强大的一种方式。迭代器是一个可以记住遍历位置的对象,迭代器对象从第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。迭代器有两个方法:iter()和next()方法
1.3案例演示: 以下是一个简单的迭代器示例,遍历一个列表并打印每个元素:
class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration item = self.data[self.index] self.index += 1 return item my_list = [1, 2, 3, 4, 5] my_iter = MyIterator(my_list) for item in my_iter: print(item)
1.4迭代器总结
1.凡是可作用于for循环的对象都是Iterable 类型;
2.凡是可作用于 next() 函数的对象都是Iterator 类型;
3.集合数据类型如list 、dict、str等是 Iterable但不是Iterator,不过可以通过 iter()函数获得一个Iterator对象
特点:
允许按顺序访问集合中的元素。
可以在不加载整个集合到内存中的情况下处理大型数据集。
优点:
节省内存,特别适用于大型数据集。
提供了一种通用的遍历机制,适用于各种不同类型的数据结构。
缺点:
需要手动实现__iter__()和__next__()方法,有些繁琐。
一旦迭代器遍历完数据,就不能再次使用,需要重新创建。
2. 生成器(Generator)
介绍: 生成器是一种特殊类型的迭代器,它可以以更简洁的方式生成值。
案例演示: 以下是一个生成器示例,生成斐波那契数列:
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() for _ in range(10): print(next(fib))
特点:
- 使用
yield
关键字简化了迭代器的创建。 - 延迟生成值,节省内存。
优点:
- 更简洁的语法。
- 适用于处理大量数据或需要延迟生成的情况。
缺点:
- 不支持双向遍历,只能单向前进。
- 无法随机访问元素。
3. 装饰器(Decorator)
介绍: 装饰器是一种用于修改函数或方法行为的技术,允许在不修改原始函数代码的情况下添加额外的功能。
案例演示: 以下是一个装饰器示例,用于测量函数执行时间:
import time def timing_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} took {end_time - start_time} seconds to run.") return result return wrapper @timing_decorator def slow_function(): time.sleep(2) slow_function()
特点:
- 可以轻松地扩展函数的功能,例如日志记录、性能分析等。
- 可以重用装饰器,使代码更干净。
优点:
- 提高了代码的可维护性和可读性。
- 使功能扩展更容易。
缺点:
- 可能会增加代码的复杂性,特别是当多个装饰器堆叠时。
二.一闭
4. 闭包(Closure)
介绍: 闭包是一种函数,它可以访问其定义范围之外的变量,即使外部函数已经执行完毕。
案例演示: 以下是一个闭包示例,创建一个计数器函数:
def counter(): count = 0 def increment(): nonlocal count count += 1 return count return increment counter1 = counter() print(counter1()) # 输出1 print(counter1()) # 输出2 counter2 = counter() print(counter2()) # 输出1
特点:
- 允许函数保留状态,使得函数可以"记住"之前的状态。
- 有助于隐藏数据,实现封装。
优点:
- 提供了一种轻量级的状态管理机制。
- 使函数更加灵活和可复用。
缺点:
- 可能会导致不正确的行为,特别是当闭包不正确地使用时。
- 可能会增加代码的复杂性,难以理解。
总结:
一闭三器属于进阶语法,我们需要有强大的基础才能实际开发中运用,当我们运用得当,它能成为我们很实用的工具,为我们减轻很多代码,以及提示代码的质量