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

一、生成器

生成器(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 2.7中文显示与处理方法

    Python 2.7是一个老版本的Python,但在一些项目中还是需要使用它。而对于中文数据的处理和显示,可能会遇到一些问题。下面是Python 2.7中文显示与处理方法的攻略: 1. 字符编码的处理 1.1 在Python 2.7中,默认字符串编码是ASCII,如果要处理中文,需要使用Unicode编码。 # 讲中文字符串转换为Unicode编码 chin…

    python 2023年5月20日
    00
  • 拓扑排序Python实现的过程

    拓扑排序Python实现的过程 拓扑排序是一种常用的有向无环图(DAG)的排序算法,它可以将DAG中的节点按照一定的顺序进行排序。实际应用中,拓扑排序常于任务调度、依赖关系分析等场景。本文将介绍拓扑排序的Python实现过程,并提供两个示例说明。 拓扑排序的实现过程 拓扑排序的实现过程可以分为以下几个步骤: 构建DAG:将有向表示为邻接表或邻接矩阵的形式。 …

    python 2023年5月14日
    00
  • Python使用pip安装Matplotlib的方法详解

    Python使用pip安装Matplotlib的方法详解 什么是Matplotlib Matplotlib是一个数据可视化的Python库,可以绘制多种图表,例如散点图、折线图、柱状图、饼状图等。Matplotlib可应用于各种平台,包括Windows、Mac OS X和Linux,同时还可以与许多GUI工具包搭配使用,如Tkinter、wxPython和P…

    python 2023年5月14日
    00
  • Python2.6版本pip安装步骤解析

    Python2.6版本pip安装步骤解析 在Python 2.6版本中,pip并未默认安装,需要手动安装。下面是Python 2.6版本pip安装的步骤。 步骤1:下载get-pip.py脚本 Python 2.6版本需要使用比较旧的pip脚本。我们需要下载适用于Python 2.6版本的pip脚本。使用curl或者wget工具下载get-pip.py脚本。…

    python 2023年5月14日
    00
  • MySQL-Python安装问题小记

    MySQL-Python安装问题小记 MySQL-Python是Python编程中常用的一个MySQL数据库连接库,但是在安装过程中可能会遇到一些问题。本文将细讲解MySQL-Python安装问题的解决方法,包括安装前的准备、安装过程可能遇到的问题和两个示例。 安装前的准备 在安装MySQL-Python之前,我们需要先安装MySQL数据库和Python环境…

    python 2023年5月13日
    00
  • pyqt5 使用label控件实时显示时间的实例

    使用label控件实时显示时间,可以通过以下步骤来实现。 借助PyQt5自带的QtCore库和QtWidgets库。QtCore库中的QTimer类提供了定时器,可以每隔一段时间发射一个信号。而QtWidgets库中的QLabel类可以用于显示文本或图片。 创建一个Qt应用程序,这是一个基本的框架。这里我们使用QMainWindow作为窗口。 import …

    python 2023年6月2日
    00
  • python工具模块介绍-time 时间访问和转换

    快速入门 In [1]: import time # 获取当前时间 In [25]: time.strftime(“%Y-%m-%d_%H-%M-%S”, time.localtime()) Out[25]: ‘2018-06-17_20-05-36’ # 停顿0.5秒 In [26]: time.sleep(0.5) 简介 功能:时间访问和转换。 相关模块…

    python 2023年4月25日
    00
  • Python实现对比两个Excel数据内容并标记出不同

    下面是Python实现对比两个Excel数据内容并标记出不同的完整实例教程。 实现思路 本文使用Python语言,利用pandas库读取Excel文件,并将数据转换为DataFrame数据结构。利用DataFrame提供的函数对两个Excel表格进行比对,找寻不同的内容,并在新的Excel表格中标记出不同的内容。 读取Excel文件,将数据转换为DataFr…

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