生成器的好处:缓解内存压力
# -*-coding:utf-8 -*-
__date__ = ‘2018/3/9 ‘
__author__ = ‘xiaojiaxin‘
__file_name__ = ‘生成器‘
# a1=[x for x in range(5000000000)]
#将range(5000000000)全部扔进内存,速度非常慢,甚至会死机
a=(x for x in range(5))
print(a)
# <generator object <genexpr> at 0x0000003FB1622990>
#a变成生成器的对象,值不在a里面,把range(10)比喻成10道菜,a是厨师,a一次只做一道菜到内存
#调用数据
print(next(a)) # 内置方法,python3通用方法
# 0
print(next(a))
# 1
print(next(a))
# 2
print(a.__next__()) #内部方法
# 3
print(next(a))
# 4
#print(next(a))
# Traceback (most recent call last):
# File "C:/Users/xiaojiaxin/PycharmProjects/fullstack1/week2/day9/生成器.py", line 25, in <module>
# print(next(a))
# StopIteration
a=(x*x for x in range(5))
#生成器就是一个可迭代对象
for i in a: #for循环对x内部进行了next()调用
print(i)
# 0
# 1
# 4
# 9
# 16
#生成器一共有两种创建方式:1:() 2.yield关键字
def foo1():
print("foo1")
return 1
print(foo1)
# <function foo1 at 0x000000CAEBECD158>
print(foo1()) #执行函数
# foo1
# 1
def foo():
print("ok11")
yield 1
print("ok22")
yield 2
print(foo)
# <function foo at 0x000000CBE62E2E18>
g=foo()
print(g) #不执行函数
# <generator object foo at 0x000000CBE8002990>
#执行生成器
next(g)
# ok11
next(g)
# ok22
#next(g)#报错
for i in foo():
print(i)
# ok11
# 1
# ok22
# 2
#for i in 可迭代对象:
#检查一个对象是否为可迭代对象,有__iter__()内部方法
# l=[1,2,3]
# l.__iter__()
# t=(1,2,3)
# t.__iter__()
# d={1:"ok1",2:"ok2"}
# d.__iter__()
#列表,字典,元组之所有可以用for循环,是因为他们都是可迭代对象
#斐波那契数列
#0 1 1 2 3 5 8 13 21
#用递归函数方法
def feibo(n):
if n==1:
return 0
elif n==2:
return 1
else:
return feibo(n-1)+feibo(n-2)
print(feibo(9))
# 21
#0 1 1 2 3 5 8 13 21
def fibo(max):
before,after=0,1
n=0
while n<max :
print(after)
before,after=after,before+after #先执行右边
n+=1
fibo(5)
#用生成器做斐波那契数列
def fibon(max):
before,after=0,1
n=0
while n<max :
before,after=after,before+after #先执行右边
n+=1
yield before
print(fibon(1)) #生成器对象地址
for i in fibon(5):
print(i)
顺便说一下:学生成器yield,是为了日后学习协程,非常关键的知识点
def bar():
print("ok1")
ret=yield 1
print(ret)
print("ok2")
print(ret)
ret2=yield 2
print(ret2)
print("ok3")
print(ret)
print(ret2)
yield 3
b=bar()
print(b)
print(next(b))
#第一次send如果没有next(),只能传send(None)
b.send("edh")
b.send("gghg")
# send()将yield值返回
大家对内容有任何问题,欢迎留言,定在第一时间解答,谢谢大家!
原文地址:http://blog.51cto.com/10777193/2093016