#!/usr/bin/env python # -*- coding:utf-8 -*- #只要函数的代码里面出现了yield关键字,这个函数就再也不是一个普通的函数了,叫作生成器函数 #执行生成器函数,获取到的东西就叫作生成器 #生成器的一个好处就是无需在内存中创键全部东西,何时须要何时建立 ''' def fun(): yield 1 yield 2 r = fun() ''' #fun是生成器函数,r是生成器,生成器具备生成一些东西的能力 ###################生成器原理####################### ''' #定义一个生成器函数 def fun(): print(11) yield 1 print(22) yield 2 print(33) yield 3 #执行生成器函数,仅仅获取了一个生成器,不会输出任何值 r = fun() #执行生成器的__next__方法,碰到yield就退出,这里的yield至关于普通函数里面的return,可是不同,yield能够保存上一次的执行状态,而return 是直接退出的返回值是第一个yield的值 ret = r.__next__() print(ret) #再次执行生成器的__next__方法,返回值是第二个yield的值 ret = r.__next__() print(ret) ''' ############################################################ ########################生成器实现####################### def xrange(n): start = 0 while True: if start > n: return yield start start += 1 obj = xrange(5) n1 = obj.__next__() n2 = obj.__next__() n3 = obj.__next__() n4 = obj.__next__() n5 = obj.__next__() print(n1,n2,n3,n4,n5)
#!/usr/bin/env python # -*- coding:utf-8 -*- #生成器仅仅具备一种生成能力 #如和将一个函数变为生成器,在函数里面出现了yield,这个函数就再也不是普通的函数了,叫生成器函数,执行这个生成器函数就会获得一个生成器 #迭代器具备访问能力,迭代器是一个一个进行迭代,只能一个一个日后找,不能往前找 #迭代器特色: #访问者不须要关心迭代器内部的结构,仅须要经过next()方法不断去取下一个内容 #不能随机的访问集合中的某个值,只能从头至尾依次访问 #访问到一半时,不能日后退 #便于循环比较大的数据集合,节省内存 #迭代器本质上也是经过next一个一个去取,咱们在用的时候直接用for循环迭代就能够了 #生成器须要本身写,而迭代器直接用for循环就能够了 def xrange(n): start = 0 while True: if start > n: return yield start start += 1 for x in xrange(10): print(x)
生成器与迭代器综合练习:python
#! usr/bin/env python # -*-coding = utf-8 -*- #生成器 def range(n): start = 0 while True: if start < n: yield start start += 1 else: return #迭代器 for i in range(10): print(i)
对于生成器的理解要注意,在例程中,咱们使用的是一些整数,既然是生成器,那么可不能够生成别的东西,好比相似于列表或者字典这样的数据结构,能够,如:数据结构
li = [1,2,3,4,5] for item i li: yield{ 'index':item }
好比上面相似的写法,也是个生成器,不过生成器中的数据结构是字典形式的 函数