迭代器/生成器/装饰器-创新互联

迭代器

成都创新互联从2013年开始,是专业互联网技术服务公司,拥有项目做网站、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元洛隆做网站,已为上家服务,为洛隆各地企业和个人服务,联系电话:18980820575

迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常

可迭代对象

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration),默认的list、tuple、stri、dict对象都是可以迭代的。

isinstance(object, classinfo) 方法说明

如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True。如果object不是一个给定类型的的对象, 则返回结果总是False。

如何判断对象是否为可迭代对象?

>>> from collections import Iterable

>>> isinstance('abc',Iterable)

True

>>> isinstance([1,2],Iterable)

True

>>> isinstance(123,Iterable)

False

>>> isinstance({'k1':'v1'},Iterable)

True

列表生成式

用来创建list的生成式

如果要生成[1*1,2*2,3*3,4*4…..10*10]这样的列表该怎么做呢?

传统做法:

list1 = []

for i in range(1,11):

   list1.append(i*i)

print(list1)

使用列表生成式:

list2 = [i*i for i in range(1,11)]

print(list2)

运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

生成器(generator)

如果我们需要一个非常多元素的列表,但是我们只需要访问前面的几个元素,如果使用传统的方法,一次创建完该列表将会占用很大的存储空间,这时候,我们就需要一种一边使用,一边生成元素的机制,这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

创建生成器

第一种简单办法,将列表生成式的[]改为()

>>> list2 = (i*i for i in range(1,11))

>>> print(list2,type(list2))

at 0x000001F4A35AD678>

第二种办法:使用yield

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

生成斐波拉契数列:

def fib(max):

   n, a, b = 0, 0, 1

   while n < max:

       # print(b)

       yield b

       a, b = b, a + b

       n = n + 1

   return 'done'

a = fib(20)

print(next(a))

print(next(a))

使用yield后,生成器的执行流程:

函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。

要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

生成器和普通函数调用返回结果的区别?

普通函数调用直接返回结果

生成器调用实际返回的是一个generator对象

装饰器

为已经实现的功能增加新功能,在不改变源码已经调用方式的情况下动态增加功能的方式,称之为装饰器(Decorator)

#!/usr/bin/envpython

#-*-coding:utf-8-*-

#装饰器简单实现

#原始版本,不带验证

defweb():

print('webdata.')

web()

#版本一,带验证

#问题:当我不执行web(),只执行赋值的时候就会出现authpass.显然是不对的

defauth(func):

print('authpass.')

returnfunc

defweb():

print('webdata.')

web=auth(web)

web()

#版本二,待验证,并且解决上面的调用问题,使用@调用装饰器

defauth(func):

definner():

print('authpass.')

func()

returninner

@auth

defweb():

print('webdata.')

web()

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:迭代器/生成器/装饰器-创新互联
网页地址:http://myzitong.com/article/cddjsi.html