首页 > 编程语言 >Python-9-Python迭代器、生成器与装饰器

Python-9-Python迭代器、生成器与装饰器

时间:2023-08-01 15:47:03浏览次数:32  
标签:__ 函数 迭代 Python 生成器 next def

9-1 迭代器

在本章之前的代码,for循环本质上是迭代器的应用。迭代器,可以理解为一个容器,循环的时候,每次从容器中取出一个数据,直到数据取完为止。

for i in range(1, 10):
    print(i, end=' ') #1 2 3 4 5 6 7 8 9 

如何自定义一个迭代器
1. 以类为例,需要在类中定义两个方法:__iter__ 与 __next__,其中 __iter__ 方法需要返回对象本身,它是for循环使用迭代器的要求。__next__ 方法用于返回容器中下一个元素,当容器中数据取完时,需要引发 StopIteration 异常。

需求1:自定义迭代器,通过传入最小值最大值,返回该范围所有值的3次方。

class Number():
    def __init__(self, min, max): #构造函数整个过程中只被调用一次
        self.max = max
        self.min = min
    def __iter__(self):
        return self
    def __next__(self):
        num = self.min
        if self.min <= self.max:
            self.min += 1 #循环终止条件
            return num **3
        else:
            raise StopIteration
for i in Number(1,5):
    print(i)
-----------------------
1
8
27
64
125

需求2:将返回的值,存入 num_list 列表中。

num_list = []
for i in Number(1,5):
    num_list.append(i)
num_list
-----------------------
[1, 8, 27, 64, 125]

 

9-2 生成器

使用场景:
如果在一个列表中,存有海量的数据,如果仅仅只是想访问其中某几个数据,那么这样的操作会特别耗内存。

生成器特点:
操作海量数据,节省大量内存空间。

生成器创建:
函数中若包含了 yield 关键字,那么这个函数就不再是一个普通函数,而是一个生成器(generator)对象。在Python中,使用了 yield 的函数被称为生成器(generator).

运行特点:
(1) 和普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
(2) 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有运行信息,返回 yield 的值,并在下一次执行 next() 方法时从当前位置继续执行。

#创建一个生成器,传入最大值最小值,执行 next() 方法。
def mygene(min, max):
    while min < max:
        yield min
        min += 1
my_gene = mygene(1, 5)

next(my_gene) #1
next(my_gene) #2
next(my_gene) #3
next(my_gene) #4
next(my_gene) #5
next(my_gene) #StopIteration 报错

yield 与 return 的区别:return后会跳出当前函数,而yield不会跳出当前函数。yield会保存当前函数的执行状态,在返回后,函数又回到之前保存的状态继续执行。

再一个例子:

def genetest():
    yield 1
    yield 2
test = genetest()
next(test) #1
next(test) #2

 

9-3 简单聊一下闭包

闭包特点:
1. 函数内部再定义函数。
2. 内部函数引用了外部变量,但非全局变量。
3. 需要把内部函数返回。

闭函数例子:

def outer():
    a = 0
    def inner(b):
        print(a+b)
    return inner
f = outer()
f.__closure__[0].cell_contents #0 查看是不是闭函数,若返回a的值就说明是闭函数

内部函数如何修改外部函数的变量的值:

def outer():
    a = 0
    def inner(b):
        nonlocal a #声明a是一个外部函数的变量
        a += b
    return inner
f = outer()
f(10)
f.__closure__[0].cell_contents #10

闭包作用:1.定义装饰器 2.并行运算 ...


9-4 装饰器

装饰器是一种增加函数或类功能的简单方法,它可以快速地给不同的函数或类传入相同的功能。调用被装饰的函数,与之前的调用过程没有任何区别。

基本格式:

def decorate(func):                #定义装饰器函数,参数为func,代表被装饰的函数
    def wrapper(*args, **kwargs):  #新定义一个包装函数,用于返回
        func(*args, **kwargs)      #调用被装饰的函数
    return wrapper                 #返回包装函数

例子:

def decorate(func): #这个名字可以自己定义
    def wrapper(*args, **kwargs): #这个名字也可以自定义
        print("执行开始")
        func(*args, **kwargs)
        print("执行结束")
    return wrapper

@decorate  #加这个表示调用 
def func():
    print('hello func')

func() #函数调用上没有任何区别
----------------------
执行开始
hello func
执行结束

 

标签:__,函数,迭代,Python,生成器,next,def
From: https://www.cnblogs.com/hellokitty2/p/17596677.html

相关文章

  • python怎么把json文件夹转成Excel表?
    1、python怎么把json文件夹转成Excel表?2、Python代码json数据再别的目录下怎么调用?3、【Python】浅谈python中的json4、python的json怎么用5、如何使用Python处理JSON数据python怎么把json文件夹转成Excel表?可以用pandas来读取json文件,再to_excel保存为Excel文件。可......
  • Python-8-Python模块
    8-1Pycharm安装 http://www.jetbrains.com/pycharm/选Download下载,下载Community社区版本,此时就已经在下载了。安装过程中勾选"64-bitlauncher","AddlauncherdirtoPATH",".py".首次启动,不安装插件,直接启动。需要添加python解释器,设置字体。8-2介绍Python项目组织......
  • Python 程序的运行原理
    1.简单的例子先从一个简单的例子说起,包含了两个文件foo.py和demo.py[foo.py]defadd(a,b):returna+b[demo.py]importfooa=[1,'python']a='astring'deffunc():a=1b=257print(a+b)prin......
  • Python 函数 类 语法糖
    Python语法糖\,换行连接Pythons=''s+='a'+'b'+'c'n=1+2+3#6while,for循环外的else如果while循环正常结束(没有break退出)就会执行else。Pythonnum=[1,2,3,4]mark=0whilemark<len(num):......
  • 在python中,title()可以用在列表中吗?
    1、python根据一个随机url链接获取该链接中的title?2、在python中,title()可以用在列表中吗?3、Python绘图如何显示中文标题4、在python中set_title的意思python根据一个随机url链接获取该链接中的title?1、这种方法为从urlparse模块中通过urlparse方法提取url通过hostnam......
  • Python-6-Python面向对象
    6-1面向过程与面向对象1.面向过程面向过程,核心在过程二字,面向过程设计思维,就好比精心设计一条流水线,考虑周全,相应时候处理相应问题。优点:将复杂问题流程化,进而简单化。缺点:扩展性差。若更改需求,可能整个代码都需要重写,牵一发而动全身。若解决不需要经常迭代更新的程序时,面向过......
  • 关于安装python包执行setup.py文件报错类似提示line 155 warnings.warn(f'Cannot copy
    首先可以确定世python语法问题,一般来说python3.6以后字符串使用f是没有问题的,后来发现问题所在,原来我安装好python以后,没有将python命令软连接到python3,导致python命令其实一直是使用的python2,所以才会有这样的问题。所以,当python3安装好以后,一定要重新指向软连接,还有pip3,也要指向......
  • (Python编程)基本的内嵌技术
    ProgrammingPython,3rdEdition翻译最新版本见wiki:http://wiki.woodpecker.org.cn/moin/PP3eD欢迎参与翻译与修订。23.3.BasicEmbeddingTechniques23.3.基本的内嵌技术Asyoucanprobablytellfromtheprecedingoverview,thereismuchfl......
  • Boost.Python构建与测试HOWTO
    Boost.Python构建与测试HOWTOboost文档翻译(http://boost.everydo.com/)截止到2008.1.14:boost文档翻译计划共有成员10名:xuwaters、金庆、yinyuanchao、felurkinda、simonyang、fatalerror99、hzjboost、alai04、farproc、jasson.wang。目前已完成:an......
  • 用Boost.Python构建混合系统
    BuildingHybridSystemswithBoost.Python用Boost.Python构建混合系统Author:DavidAbrahamsContact:Organization:BoostConsultingDate:2003-03-19Author:RalfW.Grosse-KunstleveCopyright:CopyrightDavidAbrahamsandRalfW.Grosse-Kunstleve2003.Allrightsreserve......