python高阶语法---迭代器、生成器、装饰器

一、迭代器

(一)、可迭代

        Python中有许多对象可以被迭代,即可以使用for循环来遍历它们的元素。以下是一些常见的可迭代对象

  1. 列表(list):列表是最常见的可迭代对象之一。可以使用for循环逐个访问列表中的元素。

  2. 元组(tuple):元组也是可迭代对象,在遍历时也可以使用for循环。

  3. 字符串(string):字符串是字符的有序集合,可以像列表一样进行遍历。

  4. 字典(dictionary):字典是一种键-值对的数据结构,可以使用for循环遍历字典的键、值或键值对。

  5. 集合(set):集合是一种无序、唯一的元素集合,也可以像列表一样进行遍历。

  6. range对象:range函数返回一个生成指定范围的整数序列的可迭代对象,可以使用for循环遍历。

  7. 文件对象:打开文件后,文件对象也是可迭代的,可以按行遍历文件中的内容。

(二)、迭代器

        在编程中,迭代器(Iterator)是一种对象,它允许我们遍历容器(如数组、列表、字典等)中的元素,而不需要直接处理容器的底层结构。迭代器的设计使得遍历变得更加简洁和高效。

        在 Python 中,迭代器是实现了 __iter__()__next__() 方法的对象。可以通过这些方法逐个访问容器中的元素。

 Python 的迭代器协议要求实现两个方法:

  • __iter__(): 返回迭代器对象自身。对于生成器,这个方法已经由 Python 自动实现。
  • __next__(): 返回容器的下一个元素。如果没有更多元素,则抛出 StopIteration 异常。

 自定义迭代器:

class MyIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current > self.end:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

# 使用自定义迭代器
iterator = MyIterator(1, 5)
for value in iterator:
    print(value)

        迭代器的优点是它可以节省内存空间,因为它可以逐个生成元素,而不需要一次性将所有元素存储在内存中。此外,迭代器还提供了一种延迟计算的方式,只在需要时才生成元素。

        最后,可迭代的不一定是迭代器,但是迭代器是可迭代的。

二、生成器

        生成器(generator)是一种特殊的迭代器,它是通过函数定义来创建的。与普通函数不同的是,生成器函数使用yield关键字来生成值,而不是使用return语句。

        生成器函数可以通过迭代来逐个产生值,而不是一次性生成所有值。这种延迟生成的方式可以节省内存空间,并且可以在需要时动态地生成值。

生成器函数的定义和普通函数类似,只是使用yield语句来产生值。例如:

def my_generator():
    yield 1
    yield 2
    yield 3

生成器函数可以像普通函数一样调用,但是它返回的是一个生成器对象,而不是实际的结果。要获取生成器中的值,可以使用next()函数或者使用for循环进行遍历。例如:

gen = my_generator()
print(next(gen))  # 输出 1
print(next(gen))  # 输出 2
print(next(gen))  # 输出 3

在for循环中,生成器会自动迭代生成值,直到没有更多的值可生成。例如:

for item in my_generator():
    print(item)

生成器还可以带有参数,可以根据参数的不同生成不同的值。例如:

def range_generator(n):
    for i in range(n):
        yield i

gen = range_generator(5)
for item in gen:
    print(item)  # 输出 0, 1, 2, 3, 4

        生成器的优势是它的简洁性和高效性。它可以按需生成值,并且可以在迭代过程中保存状态,从而实现更复杂的逻辑。此外,生成器还支持协程和异步编程,可以用于处理大量数据或者实时数据流。

三、装饰器

        装饰器(decorator)是一种在不修改被装饰函数源代码的情况下,动态地为函数添加额外功能的方法。它是Python中的一种高级特性,可以提高代码的可复用性和灵活性。

        装饰器本质上是一个函数,它接收一个函数作为输入,并返回一个新的函数作为输出。这个新的函数通常会在原有函数的基础上添加一些额外的操作,例如日志记录、性能分析、权限验证等。装饰器本质也可以是闭包,以为闭包和装饰器的基本结构大致相同。

        闭包的三要素:外部函数嵌套内部函数、外部函数返回内部函数、内部函数可以访问外部函数的变量。

        装饰器函数的定义通常包含一个内部函数,这个内部函数接收被装饰函数作为参数,并返回一个新的函数。

        装饰器适用语法就是@装饰器名

装饰器实例:

def decorator(func):
    def wrapper():
        print("Before function execution")
        func()
        print("After function execution")
    return wrapper

@decorator
def my_function():
    print("Executing my_function")

my_function()
 

        装饰器可以用于任意类型的函数,包括普通函数、类方法、静态方法等。可以同时应用多个装饰器,它们的执行顺序是从上到下。装饰器也可以接收参数,这样可以根据参数的不同,对不同的函数应用不同的装饰器。

        装饰器是Python中非常强大和常用的特性,它可以使代码更加模块化、可复用和可扩展。在实际开发中,经常会使用装饰器来实现日志记录、性能分析、输入验证等功能,提高代码的质量和可维护性。

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值