目录
1.可迭代对象
for循环迭代本质(内部构造)
l = [1, 2, 3, 4]
# for i in l:
# print(i)
ite = l.__iter__() # 接收一下iter()干了什么
print(ite) # 打印
print(ite.__next__()) # for循环干第2件事情的时候做的第1步
print(ite.__next__()) # for循环干第2件事情的时候做的第2步
print(ite.__next__()) # for循环干第2件事情的时候做的第3步
print(ite.__next__()) # for循环干第2件事情的时候做的第4步
l = [1, 2, 3, 4]
# for i in l:
# print(i)
ite = iter(l) # 接收iter()干了什么
print(ite) # 打印
print(next(ite)) # for循环于第2件事情的时候做的第1步
print(next(ite)) # for循环于第2件事情的时候做的第2步
print(next(ite)) # for循环于第2件事情的时候做的第3步
print(next(ite)) # for循环于第2件事情的时候做的第4步
1.内置函数 iter() 的本质是 inter() ,都是返回一个迭代器。
2.内置函数 next() 的本质是 next(),都是有了迭代器之后获取元素。
2.迭代器
序列
序列分为 有序序列 和 无限序列
1.有序序列
生成返回迭代器
a = range(4)
print(a.__iter__())
# 结果为生成返回迭代器
迭代器是由__iter__()生成,可以通过__next__()进行调用
2.无序序列
import itertools
a = itertools.count() # 生成迭代器
print(next(a)) # 获取迭代器里面的元素并打印
print(next(a)) # 获取迭代器里面的元素并打印
print(next(a)) # 获取迭代器里面的元素并打印
print(next(a)) # 获取迭代器里面的元素并打印
生成一个无范围迭代器 (无限迭代器 / 无限序列) :模块itertools 中的 方法count( )
模块itertools用于高效循环的迭代函数集合
3.生成器
1.列表推导式
列表推导式:生成列表的一种方法
l = [ i for i in 可迭代对象 ]
i 表示列表中要放入的对象; for循环是一个式子
l = [i for i in range(5)]
print(l)
l = [i for i in range(5) if 4 < 5] # 条件判断(此处为真)
print(l)
l = [i * 2 for i in range(5)]
print(l)
l = [i * 2 for i in 'abcd']
print(l)
# 用函数来进行操作
def fun(a):
return a * 2
l = [fun(i) for i in 'abcd'] # 列表不是迭代器
print(l)
2.生成器的创建
1.方法一:改为括号使用
生成器是个特殊的迭代器,是可迭代对象
l = ( i for i in 可迭代对象)
中括号变为圆括号
l = (i for i in 'abcd') # 括号括起来的是生成器
print(next(l)) # next()为调用,只有l为迭代器时可以使用
2.方法二:yield函数创造生成器
1.函数中使用yield
# 一个函数中包含yield可以创建出生成器
def fun():
a = 10
while 1:
a += 1
yield a # yield将函数编程生成器
b = fun()
print(b)
# 结果为生成返回迭代器
print(next(b))
print(next(b))
print(next(b))
print(next(b))
# 输出循环结果
2.函数中不使用yield
将成为死循环无限生成并调用迭代器对象
def fun():
a = 10
while 1:
a += 1
print(a)
fun()
程序将进入死循环,a一直自己加1
提前生成了迭代器,并调用了全部迭代器对象,是占用资源的放大镜
4.总结