迭代器/生成器/装饰器

迭代器

迭代器对象要求支持迭代器协议的对象,在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))

<generator object
<genexpr> at 0x000001F4A35AD678> <class ‘generator‘>

第二种办法:使用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()

时间: 2024-11-06 07:01:47

迭代器/生成器/装饰器的相关文章

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

python 迭代器 生成器 装饰器

迭代器 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. names = iter(['sun', 'ibm', 'sunny']) print(names) print(names.__next__()) print(names.__next__()) print(names.__next__()) print(

python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: 1 >>> g = (x * x for xin range(10)) 2 >>> g3 <generator object <genexpr> at 0x1022ef630> 此处g就是一个生成器. 迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是gene

Python 全栈开发五 迭代器 生成器 装饰器

一.迭代器 迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 next(). 字符串,列表或元组对象都可用于创建迭代器,生成迭代器的方法是iter(): >>li = [1,2,3,4,5] >>it = iter(li) #生成一个迭代器 >>it.__next__() 1 >>next(it) #以上两种next都可以使用 2 >

迭代器,生成器,装饰器,递归

迭代器 可迭代对象 1)定义:在python中,但凡内部含有--itter--方法的对象,都是可迭代对象 可以通过dir()去判断一个对象具有什么方法 dir()会返回一个列表,这个列表中含有该对象的以字符串形式的所有方法 从字面意思来说:可迭代对象就是一个可以重复取值的数据集. 从专业角度来说:但凡内部含有iter方法的对象,都是可迭代对象 . 可迭代对象可以通过判断该对象是否有’iter’方法来判断. 可迭代对象的优点: 可以直观的查看里面的数据.操作方法多,灵活 可迭代对象的缺点: 1.占

Day4 - Python基础4 迭代器、装饰器、软件开发规范

Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>

Python_Day5_迭代器、装饰器、软件开发规范

本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 1.列表生成式,迭代器&生成器 列表生成 >>> a = [i+1 for i in range(10)] >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访

python -- 迭代器和装饰器

迭代器和装饰器在python中的使用十分常见,下面是个人对迭代器和装饰器的理解 迭代器 1.迭代器 iter 的特点: (1).访问者不需要关心迭代器的内部结构,仅需要通过__next__()方法不断去取下一个内容 (2).不能随机访问集合(不是set,只是一些元素的聚集体)中的某个值,只能从头到尾依次访问 (3).访问到一半时不能后退(过去的就过去了,不能回头) (4).便于循环比较大的数据集合,节省内存(每次需要了指定数据时,才把该读取到内存中,eg:迭代文件时,内存中每一时刻都只有文件的一

Python求索之路3——迭代器、装饰器、生成器、正则

1.迭代器 迭代器是访问数据集合的一种方式,它只能从集合的第一个元素开始顺序访问,直到最后一个元素结束.类似于linux里的cat命令,只能挨行读取文本内容,不可以跳到中间或者尾部读取(不会把所有的数据都读到内存中),对于上G的文件,比较节约内存.该迭代的好处就是它事先不需要准备好集合里的所有元素,遍历到该元素时才会计算处理该元素,这点与列表有很大的不同. 示例1: a = iter(['add','dfdf','dfdfd']) print a.next()#取第一个值 print a.nex