#可迭代对象
# list , tuple, string, range, set, dict..... 生成器, 迭代器
# 可迭代对象 使用 成员操作符 in, not in
# 迭代器
# 特殊的对象, 一定是可迭代对象, 具备可迭代对象的特征
# 通过 iter方法 把一个可迭代对象封装成一个迭代器
# 通过 next方法, 迭代(驱动) 迭代器对象
# 迭代器对象只能从头到尾迭代一遍
list1 = list(range(3, 10))
e = enumerate(list1, 6)
print(e)
# next()
# print(next(e))
# print(next(e))
# print(next(e))
# print(next(e))
# print(next(e))
#
list2 = list(range(5,10)) #'list' object is not an iterator
# print(next(list2))
# iter()
it = iter(list2) # <list_iterator object at 0x0000000001E051F0>
# print(it)
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it)) # StopIteration
it2 = iter(list2) # 生成**新的**迭代器对象
for i in it:
print(i) # for 循环内部进行了处理, 发现 it 里没有值了,就停止了
# zip
# l = list(zip(range(5),range(5),range(5))) #拉链函数 zip
l = list(zip(range(5),range(2),range(5))) #拉链函数 zip #木桶原理
print(l)
dict1 = {k:v for k,v in zip('abcde', range(3))} # 解构
print(dict1)
dict2 = dict(zip('abcde', range(3)))
print(dict2)
# 生成器的应用
# 无限循环 计数器
def counter():
i = 0
while True:
i += 1
yield i
c = counter()
res_list = []
for j in range(1,20):
res_list.append(next(c))
print(res_list)
# 写一个函数, 实现这样的效果, f() => 1 f() => 2
def foo():
g = counter()
def _inner():
return next(g)
return _inner
f = foo()
print(f())
print(f())
print(f())
print(f())
# fib 函数的 生成器 方法
def g_fib():
pre = 0
ne = 1
while True:
pre, ne = ne , pre + ne # python 赋值特点
yield ne
def f(n):
g2 = g_fib()
for i in range(1, n+1):
r = next(g2)
return r