生成器

列表生成式:

li = [i + 1 for i in range(10)]
print(li)
#生成式可以用于列表或者元祖 但是不可以用于字典
#这里是先循环‘for i in range(10)’然后把每一个值给‘i+1’成为新的列表被打印

 #同时列表生成式也可以三目运算 但是最多可以加三目运算:

li = [i if i < 5 else i*i for i in range(10)]
print(li)




#'generator'生成器对象 用的是括号来形成
>>> a = (i for i in range(1000))
>>> a
<generator object <genexpr> at 0x000000000333A678>


#此时用‘next’取值:
li = (i for i in range(1000))
# for i in li:
# print(next(li)) #用‘for’循环并不会报错 因为‘for’里面有接收异常的机制
while True:
print(next(li)) #用‘while’会报错 因为没接收异常的机制 报错内容‘StopIteration’停止迭代



#在’python2中range(100)‘ 会直接生成列表 在python3中的range()就相当于生成器 只是具备了后续的执行调用的能力,并没有把全部加载出来成列表
#在‘python2’的‘xrange()’和‘python3()’中的’range()‘同效果




def fib(max):  #  这里离函数生成器差一步
n, a, b, = 0, 0, 1
while n < max:
a, b = b, a + b #这里的’a+b‘是’b‘的值 但是所加时 ’a‘是原来没有被’b‘赋值的’a‘和原来的’b‘相加的结果是新的’b‘ ’a是原来的’b‘
print('bofret yield')
yield b #加入‘yield’是把这个函数冻结暂停并返回外边 方便下次‘next’‘next’是启动生成器的作用 但是遇见‘yield’就暂停 ’yield‘是单次暂停并返回 ’return‘是结束函数并且返回
print(b)
n+=1
return 'down'
fib(10) #这样的函数的调用只是让函数生成了一个生成器对象‘generator’
f= fib(10)
next(f) #这才能调用函数执行里面的内容 但是并不能执行打印‘yield’
print(next(f)) #此时才能打印‘yield’返回的的‘b’的值
for i in f:
print(next(f))




#斐波那契是初正整数前俩最小的值以外,后面的所有的值是前俩数的和:
0,1,2,3,5,8,12,20.。。。。。。。



def range2(n):
count = 0
while count < n:
print('count', count)
count+=1
yield count
f = range2(10) #函数调用只是生成了一个生成器
next(f) #'next(f)'就等于‘f.__next__()’
f.__next__()
print(next(f)) #启动函数生成式并输出‘count’并且打印‘yield count’的返回值







def range2(n):
count = 0
while count < n:
count+=1
sigo = yield count
if sigo == 'stop':
print('sigo', sigo)
break
return '3233'
f = range2(10) #函数调用只是生成了一个生成器
#print(next(f)) #’print(next(f))‘和’print(f.send(None))‘功能一样都是唤醒继续进行下一步但是’send‘里面传入的值与生成器里面的条件里的值如果相等 就会停止并’return‘返回
print(f.send(None))
print(f.send(None))
print(f.send(None))


#函数生成器:
  1函数名字节加()组成一个生成器
  2生成器里面加’return‘会停止并且返回,但是会异常
#'send()'方法可以给’yield‘传去一个停止的指令,同时它也有返回和唤醒’yield‘的功能
#'next()'只有返回和继续的功能并不能传值
 

posted on 2018-11-25 10:57  别离  阅读(110)  评论(0编辑  收藏  举报

导航