python_day17_生成器_debug单步调试
今天肚子特别的不舒服,就是明明一天没吃饭了,但是胃里还是满满的那种不舒服,额,晚上吃东西了,就是早上和中午实在是不舒服,就没去吃饭。可能是因为昨天做了接近5个小时的地跌+公交车+喝酒的原因吧,现在回想起地铁和公交车,全是恶心的感觉。。。。去吃晚饭的时候给我妈打了一电话,听到妈妈的声音,真好。
#Author:"haijing"
#date:2018/9/28
#列表生成式
# a = [x for x in range(10)] #生成列表的式子
# print(a) #打印[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#
# b = [x*2 for x in range(10)]
# print(b) #打印[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
#
# c = [x*x for x in range(10)]
# print(c) #打印[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#函数+列表生成式
# def f(n):
# return n*3
# d = [f(x) for x in range(10)]
# print(d) #打印0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
#
# t = ['123',8]
# a,b = t #等价于a=123 b=8,但此时t中只能有两个变量
# print(a) #打印123
# print(b) #打印8
#生成器,不能固定的去取哪个值,只能一个一个的取
# s = (x for x in range(10)) #此时s是一个对象,没有值,节约内存空间
# print(s) #打印<generator object <genexpr> at 0x0238F8A0>
#
# a = s.__next__() #拿出第一个数0,但是不经常用
# print(a) #打印0
#
# b = next(s) #常用,等价于s.__next__() in python2 s.next()
# print(b) #打印1,因为第29行已经把0给拿出来了
# print(next(s)) #拿出2
# print(next(s)) #拿出3
# print(next(s)) #拿出4,一直拿出9,再写print(next(s))的话就会报错了
#生成器就是一个可迭代对象(元组、列表、字典都是可迭代对象) for i in 可迭代对象
#生成一个生成器方式一
# s1 = (x for x in range(10))
# for i in s1:
# print(i) #打印0到9
#生成一个生成器方式二 yield python遇到return和yield都会推出该函数,
#但是return退出之后就不再进来了,但是党程序中再次调用改生成器时,程序可以再回到yield原来的地方继续执行
#程序执行的之后,会首先执行被调用的函数,不会首先执行def f():这个,只有被调用f()时才会返回到def这里来执行
# def f():
# print('ok1')
# yield 1 #有一个yield,所以生成器中就只有一个数
# print('ok2')
# yield 2
#
# print(f) #打印<function f at 0x00D1B780>
# f() #什么也不打印,f()就是一个生成器对象,压根就没进来,所以不会执行print('ok')
# g=f()
# d1 = next(g) #yield后面的1赋值给d1 并打印ok1
# d2 = next(g) #yield后面的2赋值给d2 并打印ok2
# print(d1,d2) #打印1 2
#应用:斐波那契数列第n个数,等于第n-2和第n-1个数相加
def fib(max):
n,before,after = 0,0,1 #n,before,after分别赋值为001
while n<max:
print(before)
after,before = before,after+before #这些才可以,执行这一句时,cpu会首先将before=0,after+before=1计算出来
#再将before=0赋值给after,将after+before=1赋值给before,即先执行等号的右边的计算
# after=before
# before=after+before #以上两句不能替换以上第三句,这样写的话不对!!
n = n+1
fib(10)
print('ok4') #上下分割标志
#斐波那契数列+生成器
def fib1(max):
n,before,after = 0,0,1 #n,before,after分别赋值为001
while n<max:
# print(before)
yield before
after,before = before,after+before
n = n+1
# fib1(10) #此时fib(10)就是一个生成器对象
g = fib1(10)
print(next(g)) #打印0
print(next(g)) #打印1
print(next(g)) #打印1
print(next(g)) #打印2
print(next(g)) #打印3
print(next(g)) #打印5
print(next(g)) #打印8 只能调用10次next(g) 否则会报错
#其他应用
def bar():
print('ok5')
count = yield 111 #相当于return 返回111,遇到yield也直接返回
print(count)
print('ok6')
yield 222
b = bar()
s=b.send(None) #第一次进去,不知道给谁传值,否则会报错
print(s)
c = b.send('eee') #将eee赋值给count
print(c)
#最好自己可以debug调试一下,看到底是个怎么样的执行顺序
#Author:"haijing"
#date:2018/9/28
def bar():
print('ok5')
count = yield 111 #相当于return 返回111,遇到yield也直接返回
print(count)
print('ok6')
yield 222
b = bar() #只要定义时bar()中有yield,再次调用bar()时,就可以创建一个生成器bar(),并赋值给b
s=b.send(None) #第一次进去,不知道给谁传值,只能传一个None进去,否则会报错
print(s)
c = b.send('eee') #将eee赋值给count
print(c)
#最好自己可以debug调试一下,看到底是个怎么样的执行顺序
#调试最开始,程序会首先在def bar()为函数创建一个内存空间,之后跑到第11行处,创建一个生成器,并赋值给b
#之后执行b.send(None),之后回到第4行,def bar()处,遇到yield 111,返回,并将返回值111赋值给s
#之后再回到第13行处执行,打印111,之后再执行第14行的b.send('eee') ,之后再回到第7行处执行,此时已经将eee赋值给了count
#打印eee,之后再执行第8行,打印ok6,之后再执行第九行,遇到了yield,退出并返回222给c,最后执行第15行打印222
haijing in hz
miss min
2018.9.28 晚