迈向大神的 day12 迭代器和生成器

迭代器

引入# 索引 for
iterable
可以for 循环的数据类型:list dic str set tuple 文件 range enumerate
为什么能for 循环 因为它们有迭代器
dir([]) ,功能:列出 列表拥有的所有方法
**双下方法 _sum_ 这个就是双下方法 为什么双下:可能不止一种方法调用它 **

print([1].__add__([2]))  #双下方法  
print([1]+[2])  #程式间接调用了 双下方法
#求公共方法 (转化为集合求并集)     set(dir([])) &set(dir({}))
print('__iter__' in dir(int))  #看看__iter__  在不在里面  false
#只要能被for循环的数据类型  就一定拥有__iter__方法
#print([].__iter__())
#一个列表执行了 __iter__() 之后的1返回值就是一个迭代器
#print([].__iter__().__length_hint__()) #元素个数
__next__     #会把上次的存起来   
1.能被循环的都可迭代   Iterable
2.只要含有__iter__方法的都是可迭代的
[].__iter__()  迭代器   

只要含有__iter__方法的都是可迭代的—可迭代协议

迭代器协议—内部含有_next_ 和__iter__方法就是迭代器 (两个都存在)

迭代器一定可迭代

可迭代的._iter_()方法就可以得到一个迭代器

_next_ 可以一个个获取值 (for循环就是在用它)

只有可迭代对象的时候 才能用for 循环

判断它是否可迭代 print(‘iter’ in dir(int)

迭代器的好处 1.节省空间 range() 现包现吃 2.所有值都会取到

from collections import Iterable
from collections import Iterator
print(isinstance([],Iterator)) #false  功能:某个东西是不是这个东西
print(isinstance([],Iterable))

模拟for

l=[1,2,3,4]
it=l.__iter__()
while True:
    print(it.__next__())  #会报错

生成器

##生成器

generator()

生成器函数 本质上就是我们自己写得函数

生成器—迭代器

初级 正常函数

def generator():
    print("123")
    return 'b'
ret=generator()
print(ret)

#只要含有yield 关键字的函数都是生成器函数

(不能和return公用 需要写在 函数里 )

def generator():
    print("123")
    yield 'b'  #不会结束次函数
    print("567")
 #执行之后会得到一个生成器作为返回值  
ret=generator() #拿到生成器
print(ret)        #没有打印值
print(ret.__next__())

返回值函数

def generator():
    print("123")
    yield 'a'#分段的  一段一段传回去 以yield 为关键字
    print(456)
    yield 'b'#一个个触发
g=generator()
ret=g.__next__()##for i in g
print(ret)  ##输入的结果 123 b##print(i)  整体输出
ret=g.__next__()
print(ret)  ##输入结果   456 b

·range 的原理

def wahah():
	for i in range(2000)
	yield 'wahha'#用了就扔了  #边调边打印  是个即使  下次在调用会接着使用     
	#迭代器各自走各自的   不影响 调用不同的

ps jian kan

def tail(filename):
    f=open(filename,mode='r',encoding='utf-8')
    while True:
        line=f.readline()
        if line:
            print(line.strip())
tail('file')


#


def tail(filename):
    f = open(filename, mode='r', encoding='utf-8')
    while True:
        line = f.readline()
        if line:
             yield line.strip()
g = tail('file')
for i in g:
    print(i)
###
def tail(filename):
    f = open(filename, mode='r', encoding='utf-8')
    while True:
        line = f.readline()
        if line:
             yield line.strip()
g = tail('file')
for i in g:
    if 'python' in i:
        print('****',i)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值