一、迭代器
我们已经知道,可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是generator
,包括生成器和带yield
的generator function。
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
可以使用isinstance()
判断一个对象是否是Iterable
对象:
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
二、生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x1022ef630>
创建L
和g
的区别仅在于最外层的[]
和()
,L
是一个list,而g
是一个generator。
我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?
如果要一个一个打印出来,可以通过next()
函数获得generator的下一个返回值:
yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行
*可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
生成器都是Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
把list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数:
1 import time 2 def consumer(name): 3 print("%s 准备吃包子了!" %name) 4 while True: 5 baozi = yield # yield 通过 send()方法接收值 6 print("包子[%s]来了,被[%s]吃了" %(baozi,name)) 7 8 def producer(name): 9 c1 = consumer('A') 10 c2 = consumer('B') 11 c3 = consumer('C') 12 13 c1.__next__() 14 c2.__next__() 15 c3.__next__() 16 17 print("%s 开始准备做包子了!" % name) 18 19 for i in range(10): 20 time.sleep(1) 21 print('做了3个包子') 22 c1.send(i) 23 c2.send(i) 24 c3.send(i) 25 26 producer('hh')
为什么list
、dict
、str
等数据类型不是Iterator
?
这是因为Python的Iterator
对象表示的是一个数据流,Iterator对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator
甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
三。装饰器
1 # 验证登陆 2 def login(func): 3 def inner(*args,**kwargs): 4 print("login success...") 5 return func(*args,**kwargs) 6 return inner 7 8 # 验证是否是会员用户 9 def member(func): 10 def inner(*args,**kwargs): 11 print("welcome member...") 12 return func(*args,**kwargs) 13 return inner 14 15 def home(): 16 print("welcome to Home...") 17 18 # @login内部会执行一下操作: 19 # 1.执行login函数,并将 @login 下面的 函数 作为login函数的参数,即:@login 等价于 login(movie) 20 # 2.•将执行完的 login 函数返回值赋值给@login下面的函数的函数名 21 @login 22 @member 23 def movie(name,passwd): 24 print("welcome [%s] [%s] to movie...." % (name,passwd)) 25 26 @member 27 @login 28 def music(name): 29 print("welcome [%s] to music..." % name) 30 31 movie('huhuan','123') 32 music('huhuan') 33 home()
四。json & pickle数据化序列
参考 http://www.cnblogs.com/alex3714/articles/5161349.html