详解python中的生成器、迭代器、闭包、装饰器

yizhihongxing

一、生成器

生成器(Generator)是一种用于创建迭代器的简单而强大的工具。生成器函数就是普通函数,只不过使用了yield语句而不是return语句返回结果。生成器函数被调用时不会立即执行函数体,而是返回一个迭代器。每次调用迭代器的next()方法时,生成器函数会从上次执行的地方继续执行,直到遇到一个yield语句,然后把yield后面的表达式的值作为返回值返回,并暂停执行。下次再调用next()方法时,会从yield语句暂停的位置继续执行。

生成器的优点是可以大大节约内存,因为它生成一个值之后就会释放掉这个值所占据的内存,而不是像列表那样将所有值都存在内存中。

示例一:

def simple_generator():
    yield 1
    yield 2
    yield 3

g = simple_generator()

print(next(g))  # 1
print(next(g))  # 2
print(next(g))  # 3
print(next(g))  # StopIteration

示例二:

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

f = fibonacci()

for i in range(10):
    print(next(f))  # 1, 1, 2, 3, 5, 8, 13, 21, 34, 55

二、迭代器

迭代器(Iterator)是一种对象,它可以迭代遍历容器中的元素,且只能往前不会后退。实现一个迭代器可以使用__iter__()和__next__()方法。iter()返回迭代器对象本身,next()返回具体的元素。

示例一:

class MyIterator:

    def __init__(self, start, end):
        self.num = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.num <= self.end:
            result = self.num
            self.num += 1
            return result
        else:
            raise StopIteration

m = MyIterator(0, 5)

for i in m:
    print(i)  # 0, 1, 2, 3, 4

示例二:

a = [1, 2, 3]
it = iter(a)
print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3

三、闭包

闭包(Closure)是一种函数,它可以访问定义在外部函数作用域内的变量。闭包可以保留变量的值,不管外部变量如何改变,内部函数也可以使用它们。

闭包的关键就在于外部变量的值在内部函数定义时已经保存下来,并一直可以被访问。

示例一:

def outer_func(x):
    def inner_func(y):
        return x+y
    return inner_func

add_5 = outer_func(5)
print(add_5(3))  # 8

add_10 = outer_func(10)
print(add_10(3))  # 13

示例二:

def func():
    arr = []
    for i in range(3):
        def inner_func():
            return i
        arr.append(inner_func)
    return arr

funcs = func()
print(funcs[0]())  # 2
print(funcs[1]())  # 2
print(funcs[2]())  # 2

四、装饰器

装饰器(Decorator)是一种可以在运行时修改函数或类的行为的语法。在Python中,装饰器可以用于修改或包装一个函数或类的功能,而不需要修改它的源代码。

使用装饰器时,需要定义一个装饰器函数,该函数接受一个函数作为参数,并返回一个新函数。

示例一:

def my_decorator(func):
    def wrapper():
        print("Before the function is called.")
        func()
        print("After the function is called.")
    return wrapper

def say_hello():
    print("Hello!")

say_hello = my_decorator(say_hello)
say_hello()

示例二:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before the function is called.")
        func(*args, **kwargs)
        print("After the function is called.")
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

say_hello("Tom")

以上就是关于Python中生成器、迭代器、闭包、装饰器四个重要概念的详细介绍与应用示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python中的生成器、迭代器、闭包、装饰器 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python 使用reduce()和partial()

    下面是 Python 使用 reduce() 和 partial() 的完整攻略。 reduce() 函数 reduce() 函数是 Python 内置的一个函数,可以对一个列表或可迭代对象中的所有元素连续使用一个函数进行操作,得到最终的结果。例如,我们可以通过 reduce() 函数来实现对列表中所有元素进行相加的操作。 reduce() 函数的用法如下所…

    python-answer 2023年3月25日
    00
  • Python干货实战之逆向登录世界上最大的游戏平台Stream

    Python干货实战之逆向登录世界上最大的游戏平台Stream 什么是逆向登录? 逆向登录是通过破解网站的登录机制,模拟网站的登录操作,从而实现程序的自动登录。 Stream游戏平台的登录机制 Stream平台的登录机制主要分为两个部分:一是获取登录表单,二是提交登录请求。 首先需要获取登录表单。通过浏览器的开发者工具可以发现,登录表单的URL为:https…

    python 2023年6月3日
    00
  • Python3 元组tuple入门基础

    Python3元组tuple入门基础 在Python中,元组(tuple)是一个有序且不可变的序列。这意味着一旦定义,元组中的元素就不可以更改。 创建元组 元组的创建方式相对简单,只需要用小括号将元素括起来即可。例如: mytuple = (1, 2, 3) print(mytuple) # 输出 (1, 2, 3) 需要注意,在定义只有一个元素的元组时,必…

    python 2023年5月14日
    00
  • python 字符串追加实例

    针对 “Python 字符串追加实例” 这一话题,我将给出以下内容: 1. 什么是字符串追加? 字符串追加指将一个字符串添加至另一个字符串后面,形成一个新的字符串。在 Python 中,我们可以使用 “+” 来实现两个字符串的拼接。例如: string1 = ‘Hello’ string2 = ‘world’ new_string = string1 + s…

    python 2023年6月5日
    00
  • python列表的常用操作方法小结

    当然,我很乐意为您提供有关Python列表的常用操作方法的详细信息。下面是一个完整攻略,其中包含有关Python列表的常用操作方法的详细解释和示例说明。 Python列表的常用操作方法小结 在Python中,列表是一种有序的数据类型,用于存储多个值。以下是Python列表的常用操作方法的小结: 1. 定义和创建列表 在Python中,可以使用方括号[]来定义…

    python 2023年5月13日
    00
  • python3安装OCR识别库tesserocr过程图解

    Python3安装OCR识别库tesserocr过程图解 本篇教程将会详细介绍Python3安装OCR识别库tesserocr的过程,并提供两个示例说明供您参考。 安装依赖库 在Linux系统中,运行以下命令来安装tesserocr的依赖库: sudo apt-get install libtesseract-dev libjpeg-dev zlib1g-d…

    python 2023年5月18日
    00
  • Python urllib库的使用指南详解

    Python urllib库的使用指南详解 什么是Python urllib库? Python urllib库是Python标准库中用于和网站进行交互的工具包。它可以用于发送HTTP请求,从服务器获取响应,并对响应进行处理。Python urllib库包含4个模块:urllib.request、urllib.response、urllib.parse和url…

    python 2023年6月3日
    00
  • Python新年炫酷烟花秀代码

    下面我就为大家详细讲解一下“Python新年炫酷烟花秀代码”的完整攻略。 简介 Python新年炫酷烟花秀代码是一个通过Python代码生成烟花效果的程序,可以在终端中播放出美丽的烟花效果,给人留下深刻的印象。 程序代码 以下是完整的Python代码: import random import colorama import time def explode…

    python 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部