8.2 学习笔记

#在有yield的函数中,下一个yield被读出时,上一个yield消失在内存中
# def jk():
# for i in range(30):
# print('yahaha'+i)
# if i==5:
# yield 'yahaha*****'
# for i in range(30):
# print('yahaha' + i)
# pass
# g=jk()
# s=g.__next__()
# print(s)
'''
def jk2():
print(1)
yield 'a'
print(2)
yield 'b'
yield 'c'
yield 'd'
yield 'e'

jk2() #直接写无结果
jk2().__next__() #1 直接双下next则只出第一个yield之前的
print(jk2().__next__()) #1 1 a 到第一个yield为止
s=jk2().__next__() #从新开始
print(s)

print('8888') #正确的生成器,先从迭代器函数传到参数
g=jk2()
t=g.__next__()#使得该参数变为生成器,用另一函数接收值,并原函数进行迭代
print(t)
t=g.__next__()
print(t)
t=g.__next__()
print(t)
t=g.__next__()
print(t)

def ssd(): #生成器函数
for b in range(233):
yield 'yahaha',b
s=ssd() #生成器
count=0
for i in s:
count+=1
print(i) #***************生成器输出型式2 通过for循环,本质迭代器*********
if count==5:
break
print('jaskdjad;lsjd ',s.__next__)

for i in s:
count += 1
print(i,'c=',count)
if count==15:break
'''
# def ssd(): #生成器函数
# for b in range(233):
# print('sd',b)
# yield 'yahaha',b
# s=ssd()
# print(s) #输出不能
# print(s.__next__())#**********************输出第一个yield值,生成器输出形式1****************
# print(s.__next__())#迭代出第二个
#拿到生成器,循环内部内容
# def tail(filname):
# f=open(filname,encoding='utf-8')
# while 1:
# s=f.readline()
# if s.strip():
# yield s.strip() #读完一行之后函数不能结束
# g=tail('ddd.txt')
# for i in g:
# print(i)
# def tail(filename):
# f = open(filename,encoding='utf-8')
# while True:
# line = f.readline()
# if line.strip():
# yield line.strip()
#
# g = tail('log')
# for i in g:
# if 'python' in i:
# print('***',i)

# 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir(数据))
# 可迭代的一定可以被for循环
# 迭代器协议: 含有__iter__和__next__方法
# 迭代器一定可迭代,可迭代的通过调用iter()方法就能得到一个迭代器
# 迭代器的特点:
# 很方便使用,且只能取所有的数据取一次
# 节省内存空间
# 从生成器中取值的几个方法
# next
# for
# 数据类型的强制转换 : 占用内存
# 生成器
# 生成器的本质就是迭代器
# 生成器的表现形式
# 生成器函数
# 生成器表达式
# 生成器函数:
#含有yield关键字的函数就是生成器函数
#特点:
#调用函数的之后函数不执行,返回一个生成器
#每次调用next方法的时候会取到一个值
#直到取完最后一个,在执行next会报错
#send 获取下一个值的效果和next基本一致
#只是在获取下一个值的时候,给上一yield的位置传递一个数据
#使用send的注意事项
# 第一次使用生成器的时候 是用next获取下一个值
# 最后一个yield不能接受外部的值
def generator(): #send势实例
print('a')
content=yield 1
print('***(((***',content)
print('b')
content2=yield 2 #最后一个yield后理应没有直,如果一定yao,则加一个返回空的yield
print('c')
yield #加的
pass
d=generator()
print(d.__next__())
print(d.send('JKLJ'))
print(d.__next__())

猜你喜欢

转载自www.cnblogs.com/shori/p/9487608.html
8.2