Python进阶学习----一闭三器

目录

​编辑

前言

一.三器

1. 迭代器(Iterator)

1.1 什么是可迭代对象

1.2什么是迭代器

1.3案例演示: 以下是一个简单的迭代器示例,遍历一个列表并打印每个元素:

1.4迭代器总结

2. 生成器(Generator)

3. 装饰器(Decorator)

二.一闭 

4. 闭包(Closure)

总结:


 

Python进阶学习----一闭三器_第1张图片

前言

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

特点:

  • 允许函数保留状态,使得函数可以"记住"之前的状态。
  • 有助于隐藏数据,实现封装。

优点:

  • 提供了一种轻量级的状态管理机制。
  • 使函数更加灵活和可复用。

缺点:

  • 可能会导致不正确的行为,特别是当闭包不正确地使用时。
  • 可能会增加代码的复杂性,难以理解。

总结:

 一闭三器属于进阶语法,我们需要有强大的基础才能实际开发中运用,当我们运用得当,它能成为我们很实用的工具,为我们减轻很多代码,以及提示代码的质量

你可能感兴趣的:(学习)