迭代器
list
str
dic
tuple
range
f = open()
enumerate #枚举
print(dir([]))#告诉我列表所有的方法 双下划线方法叫双下方法
#只要是能被for循环的书籍类型 就一定拥有iter方法
l = [1,2,3]
print(l.__iter__().__next__())
一个列表执行了_iter_()之后的返回值就是一个迭代器
Iterable 可迭代的 --> _iter_ #只要含有_iter_方法的都是可迭代的
[]._iter_()迭代器 --> #通过next就可以从迭代器中一个一个的取值
只要含有_iter_方法的都是可迭代的 ——可迭代协议
迭代器协议 ——内部含有_next_和_iter_方法的就是迭代器
迭代器协议和可迭代协议
可以被for循环的都是可迭代的
可迭代的内部都有_iter_方法
只要是迭代器 一定可以迭代
可迭代的_iter_()方法就可以得到一个迭代器
迭代器中的_next_()方法可以一个一个的获取值
for循环其实就是在使用迭代器
迭代器的好处:
从容器类型中一个一个的取值,会把所有的值都取到
节省内存空间
迭代器并不会在内存中再占用一大块内存,
而是随着循环 每次生成一个
每次next每次给我一个
生成器
生成器函数 —— 本质上就是我们自己写的函数
生成器表达式
生成器函数
只要含有yield关键字的函数都是生成器函数
yield 不能和 return共用且需要写在函数内部
生成器函数:执行之后会得到一个生成器作为返回值
def generator():
print(1)
yield 'a'
print()
yield 'b'
ret = generator()
print(ret)
g = ret.__next__()
print(g)
g = ret.__next__()
print(g)
def func():
for i in range(2000000):
yield '娃哈哈%s'%i
g = func()
# count = 0
# for i in g:
# count += 1
# print(i)
# if count > 50:
# break
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())