可迭代对象
- 字面意思:一个可以进行循环更新的一个试试在在的值
- 专业角度:内部含有"_iter_"方法的对象称为可迭代对象
- 判断一个对象是不是可迭代对象
1.通过dir(obj)函数获取该对象所有的方法,结果是list。通过判断"_iter_"是否在列表中即可。
例:
name="python"
print("__iter__" in dir(name))
输出结果:
True
- 可迭代对象的优缺点:
优点:
- 存储数据能直接展示,比较直观
- 拥有的方法比较多,方便操作
缺点: - 占用内存
- 不能直接取值,虽然能通过for循环取值,实际上是内部转化成了迭代器
迭代器
- 迭代器的含义
- 字面意思:可更新迭代的工具
- 专业角度:内部含有"_iter"方法,并且含有"_next"方法的对象就是迭代器
- 判断是否迭代器:"_iter_" and "_next_"方法在对象中
- 可迭代对象转化成迭代器
- iter(obj) 或者 obj.iter()
- 使用next()或者next()进行迭代
例:
l1 = [11,22,33,44]
obj = iter(l1)
# obj = l1.__iter__()
print(next(obj)) # print(obj.__next__())
print(next(obj)) # print(obj.__next__())
print(next(obj)) # print(obj.__next__())
print(next(obj)) # print(obj.__next__())
print(next(obj)) # print(obj.__next__())
- 输出结果
11
22
33
44
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
当迭代器超过他本身对象个数时,会抛出StopIteration的错误
迭代器也可以直接for循环,(其实可迭代对象不能for循环,只是内部做了特殊处理
例:
l1 = [11,22,33,44]
obj = iter(l1)
for i in obj:
print(i)
- 输出结果
11
22
33
44
- 优点:
- 节省内存
- 惰性机制,next一次取一个值,不会多取
- 缺点
- 速度慢,以时间换空间
- 只能顺序取值,不走回头路
生成器
- 生成器:
- 生成器:
- 获取生成器的三种方式
- 生成器函数
备注:return 和 yield的区别def func(): print(111) yield 1 yield 2 ret = func() # 生成一个生成器对象 print(ret) # <generator object func at 0x10cfee450> #一个yield对应一个next print(next(ret)) # 111 1 print(next(ret))# 2
return: 一个函数只有一个return,return会终结函数的执行,并且返回return后面的值
yield:只要函数中还有yield,他就不是函数,而是一个生成器,一个函数可以有多个yield,他不会结束函数的执行,一个yield对应一个next
yield from:会将yield from 后面的值变成一个迭代器返回
例:def func(): lst1 = ['卫龙', '老冰棍', '北冰洋', '牛羊配'] lst2 = ['馒头', '花卷', '豆包', '大饼'] yield from lst1 yield from lst2 s= func() print(s) # <generator object func at 0x104e242d0> print(next(s)) # 卫龙 |如果不加from,则会返回lst1这个列表 print(next(s)) # 老冰棍 |如果不加from,则会返回lst2这个列表
- 生成器表达式
- 列表推导式 :用一行代码构建一个比较复杂有规律的列表。
- 两类列表推导式
- 循环模式:[变量(可加工) for 变量 in iterable]
例子:将10以内所有整数的平方写入列表。[i**2 for i in range(1,11)]
- 条件模式:[变量(可加工) for 变量 in iterable if 条件]
例子:30以内能被3整除的数[i for i in range(1,31) if i%3 == 0]
- 生成器表达式:与列表推导式几乎一模一样,只是把 [ ] 改成了()
- 生成器表达式和列表推导式的区别:生成器表达式生成的是生成器对象,而列表推导式生成的是可迭代对象
- 字典推导式
lst1 = ['jay', 'jj', 'meet'] lst2 = ['周杰伦','林俊杰','元宝'] dict = {lst2[i]:lst1[i] for i in range(len(lst1))}
- 集合推导式
{i for i in range(1,11)}
- 列表推导式 :用一行代码构建一个比较复杂有规律的列表。
- Python内部提供的一些: 文件句柄
- 生成器函数
- 获取生成器的三种方式
- 生成器:
网友评论