python生成器、迭代器和装饰器

一、迭代器

        迭代器(Iterator)是一个对象,它实现了迭代器协议,即实现了__iter__()和__next__()方法。迭代器可以通过调用内置函数iter()来创建,并且可以通过调用内置函数next()来逐个获取迭代器中的值。

日常中最常见的使用到迭代器的模块就是for语句:

for element in [1, 2, 3]:
    print(element)
for element in (1, 2, 3):
    print(element)
for key in {'one':1, 'two':2}:
    print(key)
for char in "123":
    print(char)
for line in open("myfile.txt"):
    print(line, end='')

        这种访问风格清晰、简洁又方便。 迭代器的使用非常普遍并使得 Python 成为一个统一的整体。 在幕后,for 语句会在容器对象上调用 iter()iter()__iter__()。 该函数返回一个定义了 __next__() 方法的迭代器对象,此方法将逐一访问容器中的元素。 当元素用尽时,__next__() 将引发 StopIteration 异常来通知终止 for 循环。 你可以使用 next() 内置函数来调用 __next__() 方法;这个例子显示了它的运作方式:

二、生成器

        生成器(Generator)是一种特殊的函数,它可以在执行过程中产生多个结果并且每次产生结果后暂停,等待下一次调用时继续执行。生成器可以通过yield关键字来定义,每次调用生成器函数时,会返回一个生成器对象。

2.1 yield关键字

        yield关键字在Python中用于创建生成器函数。生成器函数是一种特殊的函数,可以通过yield关键字来返回一个值,并且可以在需要的时候暂停函数的执行,然后再次从暂停的位置继续执行。yield关键字使用上和return差不多(和return不同,yield执行之后不会跳出函数)。

        当生成器函数被调用时,它会返回一个生成器对象,而不是立即执行函数体。生成器对象可以被认为是一个迭代器,可以通过调用其内置的next()方法来逐个获取生成器函数中yield返回的值。

yield关键字有两个作用:

  1. 返回值:yield关键字可以在生成器函数中返回一个值。当生成器的next()方法被调用时,生成器函数会从上一次yield语句的位置恢复执行,并返回yield后面的值。生成器函数可以有多个yield语句,每次调用next()方法时,生成器函数会从上一次yield语句的位置继续执行,直到遇到下一个yield语句或函数结束。
  2. 暂停执行:yield关键字可以暂停生成器函数的执行,并保存当前的状态。当生成器的next()方法再次被调用时,生成器函数会从上一次yield语句的位置恢复执行。这使得生成器函数可以按需生成大量的值,而不需要一次性生成所有的值。

示例:

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib = fibonacci()
print(next(fib))  # 输出:0
print(next(fib))  # 输出:1
print(next(fib))  # 输出:1
print(next(fib))  # 输出:2

三、装饰器

        修饰器(Decorator)是一种特殊的函数,用于修改其他函数的功能。修饰器函数接受被修饰函数作为参数,并返回一个新的函数,通常是一个闭包。修饰器可以在被修饰函数执行前后添加额外的代码,或者修改被修饰函数的行为。

示例:

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

@my_decorator
def my_function():
    print("Inside the function")

my_function()  # 输出:
# Before function execution
# Inside the function
# After function execution

#解释:
#第一次调用next(fib)时,生成器函数执行到第一个yield语句,返回0。
#第二次调用next(fib)时,生成器函数从上次暂停的地方继续执行,执行到第二个yield语句,返回1。
#第三次调用next(fib)时,生成器函数从上次暂停的地方继续执行,执行到第三个yield语句,返回1。
#第四次调用next(fib)时,生成器函数从上次暂停的地方继续执行,执行到第四个yield语句,返回2。

3.1 Python装饰器和Java装饰器的区别

在Java中,我们也会使用修饰器来制定代码的功能,使用起来和Python修饰器差不多。但在语法和用法上有着以下区别:

  语法和实现方式:

        Python中的装饰器是通过在被修饰函数上方使用@装饰器函数名的语法来实现的,装饰器函数接受被装饰函数作为参数,并返回一个新的函数。

        Java中的装饰器是通过使用注解(Annotation)来实现的,注解可以应用于类、方法、字段和参数上,可以在运行时通过反射机制来处理。

应用范围:

        Python中的装饰器可以应用于函数、方法和类,可以在被修饰函数执行前后添加额外的代码,或者修改被修饰函数的行为。

        Java中的装饰器(注解)可以应用于类、方法、字段和参数,可以用于提供额外的元数据,或者通过自定义处理器来修改类的行为。

功能和灵活性:

        Python的装饰器可以在函数执行前后添加额外的代码,也可以修改函数的行为,例如缓存函数的结果、添加日志等。Python的装饰器还可以嵌套使用,可以同时应用多个装饰器。而Java的装饰器(注解)主要用于提供额外的元数据,例如标记某个方法是一个测试方法,或者标记某个类是一个实体类。

        Java的装饰器相对于Python的装饰器来说,功能上更加受限,不能像Python的装饰器那样灵活地修改函数的行为。  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值